KEILC51的应用C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。目前,使用C语言进行程序设计已经成为软件开发的一个主流。用C语言开发系统可以大大缩短开发周期,明显增强程序的可读性,便于改进和扩充。而针对8051的C语言日趋成熟,成为了专业化的实用高级语言。C语言作为一种非常方便的语言而得到广泛的支持,国内最通用的是KeilC51.C语言程序本身不依赖于机器硬件系统,基本上不作修改就可将程序从不同的单片机中移植过来。C提供了很多数学函数并支持浮点运算,开发效率高,故可缩短开发时间,增加程序可读性和可维护性。㈠C-51的特点C-51与ASM-51相比,有如下优点:1.对单片机的指令系统不要求了解,仅要求对8051的存贮器结构有初步了解;2.寄存器分配、不同存贮器的寻址及数据类型等细节可由编译器管理;3.程序有规范的结构,可分成不同的函数,这种方式可使程序结构化;4.具有将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性;5.提供的库包含许多标准子程序,具有较强的数据处理能力;6.由于具有方便的模块化编程技术,使已编好程序可容易地移植;C51存储类型存储类型寻址空间数据长度值域范围data片内直接寻址RAM80~127idata片内间接寻址RAM80~255pdata分页寻址片外RAM80~255存储类型寻址空间数据长度值域范围xdata片外数据存储(64K)160~65535code片内外统一编址ROM(64K)160~65535bdata片内可位寻址的RAM(16byte)10~127C51的数据声明的一般格式如下[类型说明符][修饰符]标识符[=初值]……例如:unsignedcharcodeFlag=0x0f;就是声明一个无符号的char型变量Flag,并给他赋初值为0x0f;并且声明他所在的存储空间在片内外统一编址的ROM中。声明中,如果没有修饰符,则数据默认的存储空间为data型,也就是在片内RAM中。㈡C-51的程序结构与一般C语言的结构相同,以main()函数为程序入口,程序体中包含若干语句还可以包含若干函数。C-51函数的一般格式类型函数名(参数表){数据说明部分语句执行部分}㈢C-51的数据类型基本数据类型类型符号关键字数的表示范围所占位数整型字符型实型有无(signed)int16-32768~32767(signed)short16-32768~32767(signed)long32-2147483648~214748364716unsignedint0~65535320~4294967295unsignedlongintunsignedshortint160~65535有float323.4e-38~3.4e38有double641.7e-308~1.7e308有char8-128~127无unsignedchar80~255㈢(续)C-51的数据类型扩充定义sfr:特殊功能寄存器声明sfr16:sfr的16位数据声明sbit:特殊功能位声明bit:位变量声明例:sfrSCON=0X98;sfr16T2=0xCC;sbitOV=PSW^2;㈣C-51数据的存储类型名存储空间位置长度数据范围data直接寻址片内RAM8位0~255bdata可位寻址片内RAM1位0/1idata间接寻址片内RAM8位0~255pdata片外页RAM8位0~255xdata片外RAM16位0~65535code程序ROM16位0~65535㈣C-51数据的存储类型(续)例:数据类型存储类型变量chardatavar1;bitdataflags;unsignedcharxdatavextor[10];㈣C-51数据的存储类型㈤C-51的包含的头文件通常有:reg51.hmath.hctype.hstdio.hstdlib.habsacc.h常用有:reg51.h(定义特殊功能寄存器和位寄存器);math.h(定义常用数学运算);㈥C-51的运算符与C语言基本相同:+-*/(加减乘除)==(大于大于等于小于小于等于)==!=(测试等于测试不等于)&&||!(逻辑与逻辑或逻辑非)(位右移位左移)&|(按位与按位或)^~(按位异或按位取反)㈦C-51的基本语句与标准C语言基本相同:if选择语言switch/case多分支选择语言while循环语言do-while循环语言for循环语言㈧中断服务程序函数名()interruptn[usingr]{}㈨I/O口定义#includeabsacc.h#defineprotxbyte[0x1000]或用指针定义例:清零程序(将2000H—20FFH的内容清零)★汇编语言程序ORG0000HSE01:MOVR0,#00HMOVDPTR,#2000H;(0000H)送DPTRLOO1:CLRAMOVX@DPTR,A;0送(DPTR)INCDPTR;DPTR+1INCR0;字节数加1CJNER0,#00H,LOO1;不到FF个字节再清LOOP:SJMPLOOP清零程序(将2000H—20FFH的内容清零)★C-51程序#includereg51.hmain(){inti;unsignedcharxdata*p=0x2000;/*指针指向2000H单元*/for(i=0;i256;i++){*p=0;p++;}/*清零2000H-20FFH单元*/}★汇编语言程序ORG0000HL00:MOVR0,#10H;查找16个字节MOVR1,#00HMOVDPTR,#2000HL11:MOVXA,@DPTRCJNEA,#00H,L16;取出内容与00H相等吗?INCR1;取出个数加1L16:INCDPTRDJNZR0,L11;未完继续MOVDPTR,#2100HMOVA,R1MOVX@DPTR,A;相同数个数送2100HL1E:SJMPL1E例:查找零的个数(在2000H--200FH中查出有几个字节是零,把个数放在2100H单元中)★查找零的个数C-51程序#includereg51.hmain(){unsignedcharxdata*p=0x2000;/*指针p指向2000H单元*/intn=0,i;for(i=0;i16;i++){if(*p==0)n++;/*若该单元内容为零,则n+1*/p++;/*指针指向下一单元*/}p=0x2100;/*指针p指向2100H单元*/*p=n;/*把个数放在2100H单元中*/}KEIL的使用掌握KEIL工程的建立和软件的开发;掌握KEIL中软件仿真的基本应用;Cx51程序设计及Proteus仿真9.1KeilC简介与环境设置9.2Cx51简介9.3Cx51开发工具简介9.4Cx51应用程序设计举例随着单片机应用的深入发展和强盛的社会需求,应用高级语言进行单片机程序设计、使用仿真软件对单片机系统进行仿真已成为当前潮流。一般情况下单片机常用的程序设计语言有两种:●汇编语言:汇编语言具有执行速度快、占存储空间少、对硬件可直接编程等特点,因而特别适合在对实时性能要求比较高的情况下使用。●C语言:C语言克服了汇编语言的不足之处,同时又增加了代码的可读性,C语言大多数代码被翻译成目标代码后,其效率和汇编语言相当。特别是C语言的内嵌汇编功能,使C语言对硬件操作更加方便。9.1KeilC简介与环境设置KeilCμVision3开发环境是德国KeilSoftware,Inc.andKeilElektronikGmbH开发的微处理器开发平台,可以开发多种8051兼容单片机程序。其界面如图9-1所示。图9-1:KeilCμVision3Cx51有两种使用方式。常用方式是在μVision3IDE中使用,不用进行设置;另一种方式是在命令提示符下使用。如果使用命令方式,需要设置如下变量:①PATH=E:\Keilc\C51\BIN②TMP=E:\Keilc\Tmp③C51INC=E:\Keilc\C51\INC④C51LIB=E:\Keilc\C51\LIB注意:E:\Keilc这个路径是KeilC安装的路径,在Windows环境下的设置过程为:鼠标右击“我的电脑”→“属性”→“高级”→“环境变量”→“新建”。设置好运行环境后就可以在命令提示符下编译C语言源程序,其格式如下:C51源文件名[控制命令...]9.2Cx51简介9.2.1Cx51的扩展Cx51编译器兼容ANSIC标准,又扩展支持了8051微处理器,其扩展内容如下:①存储区;②存储区类型;③存储模型;④存储类型说明符;⑤变量数据类型说明符;⑥位变量和位可寻址数据;⑦SFR;⑧指针;⑨函数属性。9.2.2存储区8051单片机支持程序存储器和数据存储器的分离,存储器根据读写情况可以分为:程序存储区(ROM)、快速读写存储器(内部RAM)、随机读写存储器(外部RAM)。1.程序存储器(code)在8051中程序存储器是只读存储器,其空间为64K。2.内部数据存储器在8051单片机中,内部数据存储器属于快速可读写存储器,与51兼容的扩展型单片机最多有256字节内部数据存储区。3.外部数据存储器外部数据存储器又称随机读写存储器,访问存储空间为64KB。其访问速度要比内部RAM慢。访问外部RAM的数据要使用指针进行间接访问。1.SMALL模式SMALL模式中所有的变量在缺省的情况下位于单片机的内部数据区,这和用data存储类型标识符声明的变量是相同的。在本模式中变量访问非常有效,然而所有对象和堆栈必须适和内部RAM。2.COMPACT模式COMPACT模式中所有变量在缺省的情况下都存放在外部数据区的一页(256B)中,这和用pdata存储类型标识符声明的变量是相同的。3.Large模式LARGE模式下所有变量在缺省情况下存放在外部数据存储区(范围为64k字节),这和用xdata存储类型标识符声明的变量是一致的,该模式使用数据指针DPTR寻址。9.2.3存储模式在Cx51中,存储器模式可以确定一些变量在缺省情况下的存储器类型。程序中可用编译器控制命令SMALL、COMPACT、LARGE指定存储器模式。1.bit类型bit用于声明位变量,其值为1或0。2.sbit类型sbit类型用于声明可位寻址区或特殊功能寄存器中的可寻址位的某个位变量,其值为1或0。3.sfr类型sfr类型用于声明特殊功能寄存器(8位),位于内部RAM地址为0x80-0xFF的128字节存储单元(变量),这些存储器一般用作对计时器、计数器、串口、并口和外围使用。4.sfr16类型sfr16类型用于声明两个连续地址的特殊功能寄存器(地址范围为0~65535)。9.2.4数据类型与自定义变量在Cx51中不仅支持所有的C语言标准数据类型,而且还对其进行了扩展,增加了专用于访问8051硬件的数据类型,使其对单片机的操作更加灵活。1.通用指针所谓通用指针是指未对指向的对象(变量)存储空间进行说明的指针。通用指针可以访问8051存储空间中与位置无关的任何变量。2.存储区域的指针所谓存储区域的指针是指在指针声明中包含存储器类型。程序中使用指定存储区域的指针速度要比通用指针快(指定存储区域指针在编译时Cx51编译器已知道其存储区域,而通用指针直到运行时才确定存储区域),在实时控制系统中应尽量使用指定存储区域的指针。9.2.5指针所谓指针就是存储单元(变量)的地址,指针变量就是存放地址的变量。在Cx51编译器中指针可以分为两种类型:通用指针和指定存储区地址指针。1.Cx51自定义函数Cx51具有自定义函数的功能,其自定义函数语法格式如下:return_typefunction_name([args,…])[small|compact|large][reentrant][interruptn][usingn]return_type:指返回类型,在默认情况下为int。