第4章单片机的C51语言第4章单片机的C51语言51汇编语言能直接操作单片机的系统硬件,指令执行速度快。但其程序可读性差,且编写、移植困难。第4章单片机的C51语言C51是为51系列单片机设计的一种C语言,其特点:C51语言已成为51系列单片机程序开发的主流软件方法。•结构化语言,代码紧凑——效率可与汇编语言媲美•接近真实语言,程序可读性强——易于调试、维护•库函数丰富,编程工作量小——产品开发周期短•机器级控制能力,功能很强——适合于嵌入式系统开发•与汇编指令无关,易于掌握——在单片机基础上上手快①程序由函数组成(一个主函数,或一个主函数和若干自定义函数);②利用预处理命令对变量或函数进行集中定义或说明;③函数和变量都需遵循先定义后使用的基本原则;④主函数中的所有语句执行完毕,则程序结束。第4章单片机的C51语言C51与标准C程序结构完全相同5C51与标准C的主要区别(1)头文件的差异。51系列单片机厂家有多个,它们的差异在于内部资源如定时器、中断、I/O等数量以及功能的不同,而对使用者来说,只需要将相应的功能寄存器的头文件加载在程序内,就可实现所具有的功能。因此,KeilC51系列的头文件集中体现了各系列芯片的不同资源及功能。(2)数据类型的不同。51系列单片机包含位操作空间和丰富的位操作指令,因此KeilC51与ANSIC相比又扩展了4种类型,以便能够灵活地进行操作。电脑CPU是32位或64位,运算能力强,内存大,大量使用float型与longint型变量,单片机一般为8位或16位,运算能力较弱,以char型为主,int型为辅6(3)数据存储类型的不同。C语言最初是为通用计算机设计的,在通用计算机中只有一个程序和数据统一寻址的内存空间,而51系列单片机有片内、外程序存储器,还有片内、外数据存储器。标准C并没有提供这部分存储器的地址范围的定义。此外,对于51单片机中大量的特殊功能寄存器也没有定义。(4)标准C语言没有处理单片机中断的定义。(5)KeilC51与标准C的库函数有较大的不同。由于标准C的中的部分库函数不适于嵌入式处理器系统,因此被排除在KeilC51之外,如字符屏幕和图形函数。C51与标准C的主要区别7(6)目标代码电脑生成.exe格式,编译完成后直接在电脑上运行,单片机编译生成.bin代码文件,需要烧写到单片机中并结合外围电路执行。(7)仿真调试单片机的C程序在电脑上进行编译,然后需通过仿真器连接后进行仿真调试,近年来随着电路仿真软件的不断完善,也可通过proteus等软件直接在电脑上进行仿真调试。C51与标准C的主要区别8(1)编译器:由源代码文件生成目标文件(2)开发套件:包含了编译器、链接器等开发工具的组合包(3)IDE(IntegratedDevelopmentEnvironment集成开发环境)将项目管理、源代码编辑和程序编译、链接、调试等各种工具组合在一个功能强大的环境中,具有良好人机界面。8051单片机所使用的C语言编译器简称为Cx51例如包含Cx51、Ax51、BL51、LIB51、OH51、RTX51等KEILC51KeilμVision3IDEKeilC51的开发工具9KeilμVision3IDECx51.exeKeilC51开发套件v7.5010C语言结构特点•一个C程序由一个或多个函数组成,其中必须有一个用main命名的主函数。•每个函数由头部和函数体两部分组成。•每个C语句以“;”结尾。•C程序的书写格式比较自由。•可以在程序的任何位置用/*……….*/对C程序中的任何部分作注释。•可以在行末用//追加注释。11C51的程序结构#includereg51.hvoiddelay(){……;}voidmain(){delay();P0=0x33;}例:文件led.c内的代码如下:头文件(一个或若干个)主函数程序的入口函数名固定,且与书写的位置无关有且仅有一个函数声明或定义库函数或用户自定义的函数可以有若干个C51程序大体上是若干函数的集合12单片机控制LED(电路图)XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.0/T21P1.1/T2EX2P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C52C122pFC222pFC310uFX1CRYSTALD1LED-REDR1220R210k13我的第一个程序(单片机控制LED点亮)#includereg51.hsbitLED=P1^0;voidmain()//主程序{LED=0;//点亮LEDwhile(1);}14单片机控制LED闪烁(程序)#includereg51.h#defineucharunsignedchar#defineuintunsignedintsbitLED=P1^0;voiddelay(uintx)//延时程序{uchari;while(x--){for(i=0;i120;i++);}}voidmain()//主程序{while(1){LED=~LED;//LED灯闪烁delay(400);}}15•数据数据类型、数据结构、存储类型•运算算术运算、关系运算、逻辑运算、位操作•控制顺序结构、选择结构、循环结构、函数C51语言程序设计的三大要素16C51数据类型与存储类型•常量与变量常量:程序运行中值不能改变的量称为常量,常量存在于ROM中。变量:变量代表存贮器中的一个或多个存储单元,用来存放数据,一般来讲这些值在程序运行中可以改变(只读变量除外)变量名命名规则:变量名只能由半角的字母、数字、下划线组成,且第一个字符不能是数字。变量存在的类型称为数据类型。17•C51数据类型与标准C数据类型的最大不同之处:位型。位型(bit)字符型(char)整型(int)长整型(long)浮点型(float)双精度浮点型(double)数组类型(array)结构体类型(struct)共用体(union)枚举(enum)基本类型构造类型指针类型空类型数据类型①数据类型18C51数据类型数据类型C51专用长度取值范围signedchar单字节-128to+127unsignedchar单字节0to255signedint2字节-32768to+32767unsignedint2字节0to65535signedlong4字节-2147483648to+214746483647unsignedlong4字节0to4294967295float4字节±1.175494E-38to±3.402823E+38double8字节±1.175494E-308*1~3字节对象的地址19数据类型C51专用长度取值范围bit专用1位0或1sbit专用1位0或1sfr专用1字节0~255sfr16专用2字节0~65535C51数据类型20char数据类型单片机应用中ASCII字符和字符串的使用比较少(因为很少需要大量的文本信息),因此在单片机应用中定义为unsignedchar和char的变量常用来表示数值。数据类型的使用单片机系统总存储空间往往比较有限,因此在实际使用中应注意节约存储空间;对于8位单片机,8位的数据类型是运算最快的;而对于16位单片机,8位的数据和16位的数据可能运算速度是一样的。21C语言的变量定义与赋值定义一个变量先定义,后使用。例如:Inta;charb;变量赋初值,C允许在定义变量的同时给变量赋初值。例如:charc=‘a’;inta=7;inta,b,c=9;//定义a、b、c为整型变量,对c赋初值。inta=3,b=3,c=3;错误:inta=b=c=3;22定义变量类型应考虑如下问题:程序运行时该变量可能的取值范围,是否有负值,绝对值有多大,以及相应需要的存储空间大小。在够用的情况下,尽量选择8位即一个字节的char型,特别是unsigedchar。对于51系列这样的定点机而言,浮点类型变量将明显增加运算时间和程序长度,如果可以的话,尽量使用灵活巧妙的算法来避免浮点变量的引入。23②C51的扩展数据类型(1)位变量bitbit的值可以是1(true),也可以是0(false)。使用关键字bit例如:bitlock;/*将lock定义为位变量*/bitdirention;/*将direction定义为位变量*/24位变量的使用不能定义成一个指针,如不能定义:bit*pointer;不存在位数组如不能定义:bitb_array[]位变量定义时,存储类型只允许为data、bdata或者idata,如果将位变量的存储类型定义成其它类型都将导致编译出错。25C51的扩展数据类型特殊功能寄存器sfr8051特殊功能寄存器在片内RAM区的80H~FFH之间,“sfr”数据类型占用一个内存单元。利用它可访问8051内部的所有特殊功能寄存器。例如:sfrP1=0x90这一语句定义P1口在片内的寄存器,在后面语句中可用“P1=0xff”(使P1的所有引脚输出为高电平)之类的语句来操作特殊功能寄存器。标准SFR在reg51.h、reg52.h等头文件中已经被定义,只要用文件包含做出申明即可使用。26特殊功能位sbitsbit是指8051片内特殊功能寄存器的可寻址位。例如:sfrPSW=0xd0;/*定义PSW寄存器地址为0xd0*/sbitPSW^2=0xd2;/*定义OV位为PSW.2*/符号“^”前面是特殊功能寄存器的名字,“^”的后面数字定义特殊功能寄存器可寻址位在寄存器中的位置,取值必须是0~7。注意,不要把bit与sbit混淆。bit用来定义普通的位变量,值只能是二进制的0或1。而sbit定义的是特殊功能寄存器的可寻址位。27④③#includereg51.hsbitD3=P2^2;voidmain(){D3=0;//点亮LEDwhile(1)//循环,挂起{;}}________________①______________②⑤__________⑥①引用含有SFR符号定义的头文件②定义符号D3为P2口的第2位D3可以换为其他自定义符号,作用相同,如:sbitP2_2=P2^2;③点亮发光二极管的功能语句④while(1)无限循环,用于程序的反复执行或者程序挂起,很重要!⑤使用tab或者空格,使程序结构清晰,便于阅读⑥适当加入注释,使编程思路清晰,便于阅读和后期的修改sbit的使用28③8051单片机的数据存储类型•8051系列微处理器采用了哈佛结构,即程序存储器和数据存储器是分离的。8051系列微处理器提供了三种不同类型的存储区域(memoryareas):–程序存储区(programmemory)–内部数据存储区(internaldatamemory)–外部数据存储区(externaldatamemory)•这三种存储区域均从地址0开始编址,通过采用不同的寻址指令来解决地址重叠的问题。29存储类型说明data直接寻址的片内数据存储器(128B),访问速度最快(00H-7FH)bdata可位寻址的片内数据存储器(16B),允许位和字节混合访问(20H-2FH)idata间接访问的片内数据存储器(256B),全部片内RAM空间(00H-FFH)pdata分页访问的片外数据存储器(256B)00H-FFHxdata片外数据存储器(64KB),访问速度相对比较慢0000H-FFFFHcode程序存储器(64KB)0000H-FFFFHC51数据的存储类型在讨论C51的数据类型的时候,必