您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 第3章KeilC语言及其程序设计
第三章单片机的C51语言3.1C51语言概述【P57】C51是在标准C的基础上,根据单片机存储器硬件结构及内部资源,扩展了相应的数据类型和变量,而C51在语法规定、程序结构与设计方法上,都与标准C基本相同。KeilC语言的编译器及编译过程如图3-1所示。图3-1KeilC语言的编译器及编译过程C语言是美国国家标准协会(ANSI)制定的编程语言标准,1987年ANSI公布87ANSIC,即标准C语言。KeilC51语言是在ANSIC的基础上针对51单片机的硬件特点进行的扩展,并向51单片机上移植,经过多年努力,C51语言已经成为公认的高效、简洁而又贴近51单片机硬件的实用高级编程语言。目前大多数的51单片机用户都在使用C51语言来进行程序设计。用C51进行单片机软件开发,有如下优点:(1)可读性好。C51语言程序比汇编语言程序的可读性好,因而编程效率高,程序便于修改。【P55有一个汇编程序,可以进行比较,可以看出寄存器A、B等使用较多,但在C51中,不需要使用A、B寄存器。】(2)模块化开发与资源共享。用C51开发出来的程序模块可以不经修改,直接被其他项目所用,这使得开发者能够很好地利用已有的大量的标准C程序资源与丰富的库函数,减少重复劳动。(3)可移植性好。为某种型号单片机开发的C语言程序,只需将与硬件相关之处和编译连接的参数进行适当修改,就可以方便地移植到其他型号的单片机上。例如,为51单片机编写的程序通过改写头文件以及少量的程序行,就可以方便地移植到PIC单片机上。(4)代码效率高。当前较好的C51语言编译系统编译出来的代码效率只比直接使用汇编语言低10%~20%左右,如果使用优化编译选项,效果会更好。3.1.1C51的程序结构C51程序的基本单位是函数。一个C51源程序至少包含一个主函数,也可以是一个主函数和若干其他函数。主函数是程序的入口。下面通过一个可实现LED闪烁控制功能的源程序说明C51程序的基本结构。程序如下:【CAP3-LP58已经通过】#includereg51.h//51单片机头文件voiddelay();//延时函数声明sbitp1_0=P1^0;//输出端口定义【用端口名加“^”和数字,P1要大写】main()//主函数{while(1)//无限循环{p1_0=0;//p1.0=“0”,LED亮delay(10);//延时p1_0=1;//p1.0=“1”,LED灭delay(10);//延时}}voiddelay(unsignedintcount)//延时函数{unsignedchari;//字符型变量i定义while(count--)for(i=0;i120;i++);//大约延时1ms×count}【在仿真时,可以不用连接电源,晶体振荡器,复位电路,程序代码不超过2K的,EA可以悬空,最好接高电平。在仿真时,放置一个单片机,就代表了最小系统】3.1.2KeilC51的开发环境KeilC51是德国KeilSoftware公司开发的用于51系列单片机的C51语言开发软件。KeilC51在兼容ANSIC的基础上,又增加很多与51单片机硬件相关的编译特性,使得开发51系列单片机程序更为方便和快捷,程序代码运行速度快,所需存储器空间小,完全可以和汇编语言相媲美。它支持众多的MCS-51架构的芯片,同时集编辑、编译、仿真等功能于一体,具有强大的软件调试功能,是众多的单片机应用开发软件中最优秀的软件之一。KeilC51已被完全集成到一个功能强大的全新集成开发环境(IDE)µVision3中【版本在不断更新】,该环境集成了文件编辑处理、编译链接、项目(Project)管理、窗口、工具引用和仿真软件模拟器以及Monitor51硬件目标调试器等多种功能,这些功能可在KeilµVision3环境中进行操作。µVision3内部集成了源程序编辑器,并允许用户在编辑源文件时就可设置程序调试断点,便于在程序调试过程中快速检查和修改程序。此外,µVision3还支持软件模拟仿真(Simulator)和用户目标板调试(Monitor51)两种工作方式。在软件模拟仿真方式下不需任何51单片机及其外围硬件即可完成用户程序仿真调试。在用户目标板调试方式下,利用硬件目标板中的监控程序可以直接调试目标硬件系统,使用户节省购买硬件仿真器的费用。C51与标准C的主要区别如下:(1)头文件的差异。51系列单片机厂家有多个,它们的差异在于内部资源如定时器、中断、I/O等数量以及功能的不同,而对使用者来说,只需要将相应的功能寄存器的头文件加载在程序内,就可实现所具有的功能。因此,KeilC51系列的头文件集中体现了各系列芯片的不同资源及功能。(2)数据类型的不同。51系列单片机包含位操作空间和位操作指令,因此KeilC51与ANSIC相比又扩展了4种类型,以便能够灵活地进行操作。(3)数据存储类型的不同。C语言最初是为通用计算机设计的,在通用计算机中只有一个程序和数据统一寻址的内存空间,而51系列单片机有片内、外程序存储器,还有片内、外数据存储器。标准C并没有提供这部分存储器的地址范围的定义。此外,对于80C51单片机中大量的特殊功能寄存器也没有定义。(4)标准C语言没有处理单片机中断的定义。(5)KeilC51与标准C的库函数有较大的不同。由于标准C的中的部分库函数不适于嵌入式处理器系统,因此被排除在KeilC51之外,如字符屏幕和图形函数。有一些库函数可以继续使用,但这些库函数都必须针对51单片机的硬件特点来作出相应的开发,与标准C库函数的构成与用法有很大的不同。例如库函数printf和scanf,在标准C中,这两个函数通常用于屏幕打印和接收字符,而在KeilC51中,它们主要用于串行口数据的收发。(6)程序结构的差异。由于51单片机的硬件资源有限,它的编译系统不允许太多的程序嵌套。其次,标准C所具备的递归特性不被KeilC51支持,在C51中,要使用递归特性,必须用reentrant进行声明才能使用。但是从数据运算操作、程序控制语句以及函数的使用上来说,KeilC51与标准C几乎没有什么明显的差别。如果程序设计者具备了有关标准C的编程基础,只要注意KeilC51与标准C的不同之处,并熟悉AT89S51单片机的硬件结构,就能够较快地掌握KeilC51的编程。3.2C51语言程序设计基础3.2.1C51语言中的数据类型1.数据类型【P60】KeilC51的基本数据类型如表3-1所示。针对80C51单片机的硬件特点,C51在标准C的基础上,扩展了4种数据类型(见表中最后4行)。注意:扩展的4种数据类型,不能使用指针对它们存取。KeilC51支持的数据类型表数据类型位数字节数值域unsignedchar810~255signedchar81-128~+127unsignedint1620~65535signedint162-32768~+32767unsignedlong3240~4294967295signedlong324-2147483648~+2147483647float32410E-38~10E+38double64810E-308~10E+308bit10或1sbit10或1sfr810~255sfr161620~65536其中,有符号数据类型,可以忽略signed标识符,如signedint等价于int,signedchar等价于char等。【最好不要忽略,可读性好】在C51语言程序中,有可能会出现在运算中数据类型不一致的情况。C51允许任何标准数据类型的隐式转换。隐式转换的优先级顺序如下:Bit→char→int→long→float→signed→unsigned也就是说,当char型与int型进行运算时,先自动对char型扩展为int型,然后与int型进行运算,运算结果为int型。C51除了支持隐式类型转换外,还可以通过强制类型转换符“()”对数据类型进行人为的强制转换。2.C51的扩展数据类型【P60】80C51系列单片机用特殊功能寄存器SFR来控制定时器、计数器、串口、并口和外围设备。它们分别用位、字节和字进行访问。与此对应,编译器提供sbit、sfr和sfr16数据类型访问SFR。下面对表3-1中扩展的4种数据类型进行说明。(1)位变量bit类型利用它可以定义一个位变量或位函数,但不能定义位指针,也不能定义位数组。它的值可以是1(true),也可以是0(false)。在C51中,允许用户通过位类型符定义位变量。位类型符有两个:bit和sbit。可以定义两种位变量。bit位类型符用于定义一般的可位处理位变量。它的格式如下:bit位变量名;例如:bitflag1;bitflag2;所有的bit变量存放在80C51内部数据存储区的(20H~2FH)位段。因为这个区域只有16个字节长,所以在某个范围内最多只能定义128个位变量。(2)特殊功能寄存器sfr类型特殊功能寄存器可以用sfr来定义,通过名字或地址来引用特殊功能寄存器。51系列特殊功能寄存器在片内RAM区的80H~FFH之间(高128各字节),“sfr”数据类型占用一个内存单元。利用它可访问80C51内部的所有特殊功能寄存器。格式如下:sfrsfr_name=地址常数;sfr_name是特殊功能寄存器名,“地址常数”必须是一个常数,不允许用带操作数的表达式。其数值范围必须在特殊功能寄存器的地址范围,即位于0x80~0xFFH之间。【80H~FFH之间没有定义的单元,用户不能使用】例如:sfrP0=0x80语句定义P0口在片内的寄存器,在后面语句中可用“P0=0xff”(使P0的所有引脚输出为高电平)之类的语句来操作特殊功能寄存器。同样:sfrP1=0x90;sfrP2=0xA0;sfrP3=0xB0;P1、P2和P3是声明的SFR名。【实际上,所有的特殊功能寄存器在REG51.H文件中已经定义过,用户不用再定义】(3)特殊功能寄存器sfr16类型“sfr16”数据类型占用两个内存单元,用来定义16位的特殊功能寄存器。sfr16和sfr一样用于操作特殊功能寄存器。所不同的是它用于操作占两个字节的特殊功能寄存器。特殊功能寄存器名一般用大写字母表示。地址一般用直接地址形式(常数)。不允许用带操作数的表达式。而且必须是低位和高位字节中的低位字节的地址。【sfr16几乎不用,因为都是用2个8位寄存器来表示的】例如DPTR。通过名字或地址来引用特殊功能寄存器。编译器提供sfr16数据类型,将两个8位的SFR作为一个16位的SFR来访问。例如:sfr16DPTR=0x82语句定义了片内16位数据指针寄存器DPTR,其低8位字节地址为82H,高8位字节地址为83H。在后面的语句中可以对DPTR进行操作。(4)特殊功能位sbit在51系列单片机中,经常要访问特殊功能寄存器中的某些位,可位寻址的特殊功能寄存器的位变量定义用关键字sbit。格式如下:sbit位变量名=位地址;位地址可有2种形式:①位直接地址,其取值范围为0x80~0xFF②特殊功能寄存器名带位号,特殊功能寄存器与位号之间一般用“^”作间隔。【常用“^”,主要用来定义P0~P3口的某些位,其他的也在reg51.h中定义过了,用sbit来定义的位变量使用最多】例如:sbitEA=0xAF;【IE寄存器的D7,即IE.7】【参见P25的表2.3】sbitEA=IE^7;【IE寄存器的D7,即IE.7】【推荐用此种方式】sbitP11=P1^1;符号“^”前面是特殊功能寄存器的名字,“^”的后面数字定义特殊功能寄存器可寻址位在寄存器中的位置,取值必须是0~7。注意,不要把bit与sbit混淆。bit用来定义普通的位变量,值只能是二进制的0或1(位变量存放在RAM:20H~2FH之间)。而sbit定义的是特殊功能寄存器的可寻址位,其值是可进行位寻址的特殊功能寄存器的位绝对地址(地址在80H~FFH之间,而且是个位数为0或8的特殊功能寄存器)。【例1】sbit型变量的定义sbitP=0xD0;【sbitP=PSW^
本文标题:第3章KeilC语言及其程序设计
链接地址:https://www.777doc.com/doc-2193017 .html