第10章 单片机的C语言程序设计基础

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第10章单片机C语言程序设计基础内容概要本章在假定读者已掌握标准C语言前提下,初步介绍如何使用C51来编写AT89C51单片机的应用程序。本章重点介绍C51对标准C所扩展的部分,并通过一些例程来介绍C51的程序设计思想。最后还对C51的集成开发环境KeilµVision3以及C51与汇编语言的混合编程作以介绍。10.1编程语言KEILC51简介目前51系列单片机编程的C语言都采用KeilC51(简称C51),KeilC51是在标准C语言基础上发展起来的。10.1.1KeilC51简介C语言是美国国家标准协会(ANSI)制定的编程语言标准,1987年ANSI公布87ANSIC,即标准C语言。KeilC51语言是在ANSIC的基础上针对51单片机的硬件特点进行的扩展,并向51单片机上移植,经过多年努力,C51语言已经成为公认的高效、简洁而又贴近51单片机硬件的实用高级编程语言。10.1.1KEILC51简介目前大多数的51单片机用户都在使用C51语言来进行程序设计。用C51进行单片机软件开发,有如下优点:(1)可读性好。C51语言程序比汇编语言程序的可读性好,因而编程效率高,程序便于修改。(2)模块化开发与资源共享。用C51开发出来的程序模块可以不经修改,直接被其他项目所用,这使得开发者能够很好地利用已有的大量的标准C程序资源与丰富的库函数,减少重复劳动。(3)可移植性好。为某种型号单片机开发的C语言程序,只需将与硬件相关之处和编译连接的参数进行适当修改,就可以方便地移植到其他型号的单片机上。例如,为51单片机编写的程序通过改写头文件以及少量的程序行,就可以方便地移植到PIC单片机上。(4)代码效率高。当前较好的C51语言编译系统编译出来的代码效率只比直接使用汇编语言低20%左右,如果使用优化编译选项,效果会更好。10.1.1KEILC51简介10.1.2KEILC51的开发环境KeilC51是德国Keilsoftware公司开发的用于51系列单片机的C51语言开发软件。KeilC51在兼容ANSIC的基础上,又增加很多与51单片机硬件相关的编译特性,使得开发51系列单片机程序更为方便和快捷,程序代码运行速度快,所需存储器空间小,完全可以和汇编语言相媲美。它支持众多的MCS-51架构的芯片,同时集编辑、编译、仿真等功能于一体,具有强大的软件调试功能,是众多的单片机应用开发软件中最优秀的软件之一。Keil公司目前已推出V7.0以上版本的C51编译器,为51单片机软件开发提供了全新的C语言环境,同时保留了汇编代码高效、快速的特点。KeilC51已被完全集成到一个功能强大的全新集成开发环境(IDE)µVision3中,该环境下集成了文件编辑处理、编译链接、项目(Project)管理、窗口、工具引用和仿真软件模拟器以及Monitor51硬件目标调试器等多种功能,这些功能均可在KeilµVision3环境中极为简便地进行操作。10.1.2KEILC51的开发环境KeilC51和KeilµVision3两个术语。•KeilC51一般简写为C51,指的是51单片机编程所用的C语言;•KeilµVision3,可简写为µVision3,指的是用于51单片机的C51程序编写、调试的集成开发环境。µVision3内部集成了源程序编辑器,并允许用户在编辑源文件时就可设置程序调试断点,便于在程序调试过程中快速检查和修改程序。10.1.2KEILC51的开发环境此外,µVision3还支持软件模拟仿真(Simulator)和用户目标板调试(Monitor51)两种工作方式。•在软件模拟仿真方式下不需任何51单片机及其外围硬件即可完成用户程序仿真调试。•在用户目标板调试方式下,利用硬件目标板中的监控程序可以直接调试目标硬件系统,使用户节省购买硬件仿真器的费用。10.1.2KEILC51的开发环境10.1.3C51与标准C的主要区别不同的嵌入式处理器的C编译系统与标准C的不同之处,主要是它们所针对的嵌入式处理器的硬件系统不同。KeilC51的基本语法与标准C相同,但对标准C进行了扩展。深入理解KeilC51对标准C的扩展部分是掌握KeilC51的关键之一。C51与标准C的主要区别:(1)头文件的差异•51系列单片机厂家有多个,它们的差异在于内部资源如定时器、中断、I/O等数量以及功能的不同,而对使用者来说,只需要将相应的功能寄存器的头文件加载在程序内,就可实现所具有的功能。因此,KeilC51系列的头文件集中体现了各系列芯片的不同资源及功能。(2)数据类型的不同•51系列单片机包含位操作空间和丰富的位操作指令,因此KeilC51与ANSIC相比又扩展了4种类型,以便能够灵活地进行操作。(3)数据存储类型的不同•C语言最初是为通用计算机设计的,在通用计算机中只有一个程序和数据统一寻址的内存空间,而51系列单片机有片内、外程序存储器,还有片内、外数据存储器。标准C并没有提供这部分存储器的地址范围的定义。此外,对于AT89C51单片机中大量的特殊功能寄存器也没有定义。(4)标准C语言没有处理单片机中断的定义(5)KeilC51与标准C的库函数有较大的不同•由于标准C的中的部分库函数不适于嵌入式处理器系统,因此被排除在KeilC51之外,如字符屏幕和图形函数。C51与标准C的主要区别:C51与标准C的主要区别(5)KeilC51与标准C的库函数有较大的不同•有一些库函数可以继续使用,但这些库函数都必须针对51单片机的硬件特点来作出相应的开发,与标准C库函数的构成与用法有很大的不同。例如库函数printf和scanf,在标准C中,这两个函数通常用于屏幕打印和接收字符,而在KeilC51中,它们主要用于串行口数据的收发。(6)程序结构的差异。•由于51单片机的硬件资源有限,它的编译系统不允许太多的程序嵌套。其次,标准C所具备的递归特性不被KeilC51支持,在C51中,要使用递归特性,必须用reentrant进行声明才能使用。※但是从数据运算操作、程序控制语句以及函数的使用上来说,KeilC51与标准C几乎没有什么明显的差别。10.2C51语言程序设计基础10.2.1C51语言中的数据1.数据类型KeilC51的基本数据类型如表10-1所示。针对AT89S51单片机的硬件特点,C51在标准C的基础上,扩展了4种数据类型(见表中最后4行)。※注意:扩展的4种数据类型,不能使用指针对它们存取。表10-1KEILC51支持的数据类型数据类型位数字节数取值范围signedchar81-128~+127,有符号字符变量unsignedchar810~255,无符号字符变量signedint162-32768~+32767,有符号整型数unsignedint1620~65535,无符号整型数signedlong324-2147483648~+2147483647,有符号长整型数unsignedlong3240~+4294967295,无符号长整型数float324±3.402823E+38,浮点数(精确到7位)double648±1.175494E-308,浮点数(精确到15位)*241~3对象指针bit10或1sfr810~255sfr161620~65535sbit1可进行位寻址的特殊功能寄存器的某位的绝对地址2.C51的扩展数据类型下面对表10-1中扩展的4种数据类型进行说明。(1)位变量bit•bit的值可以是1(true),也可以是0(false)。(2)特殊功能寄存器sfr•AT89S51特殊功能寄存器在片内RAM区的80H~FFH之间,“sfr”数据类型占用一个内存单元。利用它可访问AT89S51内部的所有特殊功能寄存器。※例如:“sfrP1=0x90”这一语句定义P1口在片内的寄存器,※在后面语句中可用“P1=0xff”(使P1的所有引脚输出为高电平)之类的语句来操作特殊功能寄存器。(3)特殊功能寄存器sfr16•“sfr16”数据类型占用两个内存单元。sfr16和sfr一样用于操作特殊功能寄存器。所不同的是它用于操作占两个字节的特殊功能寄存器。※例如:“sfr16DPTR=0x82”语句定义了片内16位数据指针寄存器DPTR,其低8位字节地址为82H。在后面的语句中可以对DPTR进行操作。2.C51的扩展数据类型(续)(4)特殊功能位sbit•sbit是指AT89S51片内特殊功能寄存器的可寻址位。※例如:sfrPSW=0xd0;/*定义PSW寄存器地址为0xd0*/sbitPSW^2=0xd2;/*定义OV位为PSW.2*/符号“^”前面是特殊功能寄存器的名字,“^”的后面数字定义特殊功能寄存器可寻址位在寄存器中的位置,取值必须是0~7。※注意,不要把bit与sbit混淆。bit用来定义普通的位变量,值只能是二进制的0或1。而sbit定义的是特殊功能寄存器的可寻址位,其值是可进行位寻址的特殊功能寄存器的位绝对地址。※例如:PSW寄存器OV位的绝对地址0xd2。2.C51的扩展数据类型(续)3.数据的存储类型C51完全支持51单片机硬件系统的所有部分。在51单片机中,程序存储器与数据存储器是完全分开的,且分为片内和片外两个独立的寻址空间,特殊功能寄存器与片内RAM统一编址,数据存储器与I/O端口统一编址。C51编译器通过将变量、常量定义成不同存储类型的方法将它们定义在不同的存储区中。C51存储类型与AT89S51的实际存储空间的对应关系见表10-2。下面对表10-2作以说明。存储类型与存储空间的对应关系数据长度(bit)值域范围备注data片内RAM直接寻址区,位于片内RAM的低128字节80~255bdata片内RAM位寻址区,位于20H~2FH空间,允许字节与位访问80~255idata片内RAM间接寻址的存储区80~255pdata片外RAM的一个页寻址区,每页256B80~255由MOVX@Ri访问xdata片外RAM全部空间,大小为64K160~65536由MOVX@DPTR访问code程序存储区的64K空间160~65536表10-2C51存储类型与AT89S51的实际存储空间的对应关系片内RAM可分为3个区域:•data:片内直接寻址区,位于片内RAM的低128字节。•bdata:片内位寻址区,位于片内RAM位寻址区20H~2FH。•idata:片内间接寻址区,片内RAM所有地址单元(00H~FFH)。(1)片内数据存储器(2)片外数据存储器•pdata:片外数据存储器页,一页为256字节。•xdata:片外数据存储器RAM的64KB空间。(3)片外程序存储器•CODE:外部程序存储器的64KB空间定义变量类型应考虑如下问题:•程序运行时该变量可能的取值范围,是否有负值,绝对值有多大,以及相应需要的存储空间大小。•在够用的情况下,尽量选择8位即一个字节的char型,特别是unsigedchar。对于51系列这样的定点机而言,浮点类型变量将明显增加运算时间和程序长度,尽量使用灵活巧妙的算法来避免浮点变量的引入。定义数据的存储类型通常遵循如下原则:•只要条件满足,尽量选择内部直接寻址的存储类型data,然后选择idata即内部间接寻址。•对于那些经常使用的变量要使用内部寻址。•在内部数据存储器数量有限或不能满足要求的情况下才使用外部数据存储器。选择外部数据存储器可先选择pdata类型,最后选用xdata类型。定义数据的存储类型通常遵循如下原则:•扩展片外存储器,原理上虽简单,但在实际开发中,很多时候,会带来不必要的麻烦,如可能降低系统稳定性、增加成本、拉长开发和调试周期等,推荐充分利用片内存储空间。•另外,通常的单片机应用都是面对小型的控制,代码比较短,对于程序存储区的大小要求很低,常常是片内RAM很紧张而片内FlashROM很富裕,因此如果实时性要求不高,可考虑使用宏,以及将一些子函数的常量数据做成数据表,放置在程序存储区,当程序运行时,进入子函数动态调用下载至RAM即可,退出子函数后立

1 / 125
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功