第4章_单片机的C51编程语言

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

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

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

资源描述

2020/9/211第4章单片机的C51编程语言22020/9/21第4章单片机的C51编程语言4.1C51编程语言概述4.2C51的标识符和关键字4.3C51的变量与数据类型4.4C51语言的数组、指针与结构4.5C51的运算符和表达式4.6C51语言的程序结构4.7C51语言的函数4.8中断服务程序4.9C51的预处理4.10C51的库函数4.11使用C5I编译器时的注意事项32020/9/214.1C51编程语言概述C语言是一种结构化语言,可产生紧凑代码C语言可以进行许多机器级函数控制而不用汇编语言。C语言目前已成为电子工程师进行单片机系统编程时的首选编程语言。用C语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充。基于51系列单片机的C语言或C语言编译器简称为C51语言或C51。42020/9/21C51语言编程与汇编语言编程相比的优势1.可读性好、编程调试灵活方便2.生成的代码编译效率高3.完全模块化4.可移植性好5.便于项目维护管理52020/9/21单片机C51与标准ANSlC编译器的主要区别以Keil公司的KeilC5l(以下简称C5l)编译器为例C5l系列头文件集中体现了各系列芯片的不同功能C5l比ANSIC多一种“位”类型数据存储类型有很大的区别函数的使用上,由于单片机系统的资源有限,它的编译系统不允许太多的程序嵌套C5l与标准ANSIC库函数,由于部分库函数不适合单片机处理系统,因此被排除在外,如字符屏幕和图形函数。也有一些库函数继续使用,但这些库函数是厂家针对硬件特点相应开发的,它们与ANSIC的构成及用法都有很大的区别,如printf和scanf。在ANSIC中这两个函数通常用于屏幕打印和接收字符,而在C5l中,它们则主要用于串行通信口数据的发送和接收。62020/9/21C51的开发过程例4-1设图1-2系统要求是:当S1闭合时,报警灯亮;而S1打开时,报警灯灭。用C51语言编写实现该功能的程序,程序名为ex4-1.c:#includereg51.h//定义MCS-51的特殊功能寄存器SFRsbitP32=P3^2;//定义P3.2为P32sbitP20=P2^0;//定义P2.0为P20main(){while(1){P32=1;if(P32==0){P20=1;}else{P20=0;}}}在C51中,使用“/**/”和“//”符号进行注释。注释不影响程序的功能,用于说明程序的用途、功能,增加程序的可读性和可维护性。编译后注释不存在,不影响运行文件的大小。优秀的程序设计人员要养成良好的注释习惯,一般在程序的开始要写注释,表明程序的要求、功能,编写人员,编写日期,版本号等信息。72020/9/21使用任何文本编辑软件,或KEILC集成的编辑系统书写C以上程序。使用KEILC的C51编译器和连接软件(用KEILC集成开发工具uVision中的Buildtarget批处理),生成可以写入单片机的目标文件,通常为HEX文件(ex4-1.hex)用程序烧录器将该文件写入单片机,单片机上电即可运行。同时Buildtarget还生成许多中间文件,用于程序的调试,例如,从ex4-1.lst文件中可以看见C程序编译后生成的汇编程序,由此可以理解单片机硬件具体的执行过程,还可以对C程序编程的效率进行了解。82020/9/21ex4-1.lst文件0000?C0001:0000D2B2SETBP32000220B204JBP32,?C00030005D2A0SETBP20000780F7SJMP?C00010009?C0003:0009C2A0CLRP20000B80F3SJMP?C0001可以看出,C编译器编译的结果与我们大多人用汇编语言的编程结果相同,但是C51语言的可读性更好,特别是当程序更加复杂时,C51语言有明显的优势。92020/9/21标识符用来标识源程序中某个对象的名字,这些对象可以是语句、数据类型、函数、变量、数组等。C语言是区分大小写的一种高级语言。标识符由字符串、数字和下划线等组成,第一个字符必须是字母或下划线错误的标识符,编译时会有错误提示。C5l中有些库函数的标识符是以下划线开头的,所以一般不要以下划线开头命名标识符。C51的标识符和关键字102020/9/21表4-1ANSIC标准关键字关键字用途说明auto存储种类说明用于声明局部变量,为默认值break程序语句退出最内层循环体case程序语句switch语句中的选择项char数据类型声明单字节整型数或字符型数据const存储种类说明在程序执行过程中不可修改的值continue程序语句转向下一次循环default程序语句switch语句中缺省选择项do程序语句构成do…while循环结构double数据类型声明双精度浮点数else程序语句构成if…else条件结构enum数据类型声明枚举类型数据extern存储种类说明在其他程序模块中声明了的全局变量float数据类型声明单精度浮点数for程序语句构成for循环结构goto程序语句构成goto循环结构if程序语句构成if…else条件结构int数据类型声明整型数112020/9/21long数据类型声明长整型数register存储种类说明使用CPU内部寄存器变量return程序语句函数返回short数据类型声明短整型signed数据类型声明有符号整型数sizeof运算符计算表达式或数据类型的字节数static存储种类说明静态变量struct数据类型声明结构体类型数据switch程序语句构成switch选择结构typedef数据类型声明重新进行数据类型定义union数据类型声明联合类型数据unsigned数据类型声明无符号数据void数据类型声明无类型数据或函数volatile数据类型声明声明该变量在程序执行中可被隐含地改变while程序语句构成while和do…while循环结构122020/9/21表4-2C51编译器扩充关键字关键字用途说明_at_地址定位为变量进行绝对地址定位_priority_多任务优先声明规定RTX51或RTX51Tiny的任务优先级_task_任务声明定义实时多任务函数alien函数特性声明用于声明与PL/M51兼容的函数bdata存储器类型声明可位寻址的MCS-51内部数据存储器bit位变量声明声明一个位变量或位类型函数code存储器类型声明MCS-51的程序存储空间compact存储器模式按compact模式分配变量的存储空间data存储器类型声明直接寻址MCS-51的内部数据寄存器132020/9/21idata存储器类型声明间接寻址MCS-51的内部数据寄存器interrupt中断函数声明定义一个中断服务函数large存储器模式按large模式分配变量的存储空间pdata存储器类型声明分页寻址的MCS-5外部数据空间sbit位变量声明声明一个位变量sfr特殊功能寄存器声明声明一个8位特殊功能寄存器sfr16特殊功能寄存器声明声明一个16位特殊功能寄存器small存储器模式按small模式分配变量的存储空间using寄存器组定义定义MCS-5的工作寄存器组xdata存储器类型声明定义MCS-5外部数据空间142020/9/214.3C51的变量与数据类型1.常量常量又称为标量,它的值在程序执行过程中不能改变,常量的数据类型有整型、浮点型字符型和字符串型等。实际使用中用#define定义在程序中经常用到的常量,或者可能需要根据不同的情况进行更改的常量,例如译码地址。而不是在程序中直接使用常量值。这样一方面有助于提高程序的可读性,另一方面也便于程序的修改和维护,例如:#definePI3.14//以后的编程中用PI代替浮点数常量3.14,便于阅读#defineSYSCLK12000000//长整型常量用SYSCLK代替12MHz时钟#defineTRUE1//用字符TRUE,在逻辑运算中代替1#defineSTAR‘*’//用STAR表示字符“*”#defineuintunsignedint//用uint代替unsignedint,简化编辑152020/9/21例如语句:if(key==TRUE){},与语句if(key==1){}相同。C51语言(汇编语言也是同样)编辑时,除注释外,要使用英文符号,例如上述定义的字符“*”,在程序中是用英文的单引号,而不是中文符号单引号;162020/9/21常量分为:1)整型常量。整型常量值:可用十进制表示,如128,-35等;也可以用十六进制表示,如0x1000。2)浮点型常量。如0.12、-10.3等。3)字符型常量。字符型常量是用单引号括起来的一个字符,如‘A’、‘0’、‘=’等,编译程序将把这些字符型常量转换为ASCII码,例如‘A’等于0x41。对于不可显示的控制字符,可直接写出字符的ASCII码,或者在字符前加上反斜杠“\”组成转义符。转义符可以完成一些特殊功能和格式控制。4)字符串型常量。字符串型常量用一对双引号括起一串字符来表示,如“Hello”、“OK”等。字符串型常量由双引号作为界限符。当字符串中需要出现双引号时,需使用转义字符“\”来表示。172020/9/21表4-3常用的转义符转义字符含义ASCII码16进制(10进制)\0空字符(NULL)0x00\n换行符(LF)0x0A\r回车符(CR)0x0D\t水平制表符(HT)0x09\’单引号0x27\”双引号0x22\\反斜杠0x5C182020/9/21变量变量是一种在程序执行过程中,其数值不断变化的量。C51规定变量必须先定义后使用。C51的变量主要有表4-4中的各种数据类型,而sfr、sfr16、sbit三种数据类型用于对MCS-51单片机的特殊功能寄存器(SFR)的操作,不是我们传统意义上的变量。C51对变量定义的格式如下:[存储种类]数据类型[存储器类型]变量名表192020/9/21存储种类[存储种类]数据类型[存储器类型]变量名表变量的存储种类反映了变量的作用范围和寿命,将影响到编译器对变量在RAM中位置的安排。C51有四种存储种类:auto(自动)、extern(外部)、static(静态)、register(寄存器)。如果不声明变量的存储种类,则该变量将为auto变量。202020/9/21存储种类与PC机的C编程相比,C51的存储类型复杂很多,这是由于MCS-51单片机存储器类型的多样性决定的。可以通过存储器类型的定义,将变量安排在不同的存储区域。存储种类和存储器类型是可选项。如果没有定义变量的存储种类或存储器类型,C51编译器将根据变量定义的位置以及存储器模式,由C51编译器分配变量的在RAM中的位置(地址)。212020/9/21数据类型[存储种类]数据类型[存储器类型]变量名表数据类型决定变量的类型以及在存储器中的长度,变量名表中各个变量用逗号隔开。例如:inti,j,k;//定义三个整型变量i,j,kunsignedintsi,sk;//定义无符号整型变量si,skbitmy_bit;//定义位变量my_bit222020/9/21局部变量和全局变量根据变量作用域的不同,变量可分为。1)局部变量:局部变量也称为内部变量,是指在函数内部或以花括号“{}”括起来的功能模块内部定义的变量。局部变量只在定义它的函数或功能模块内有效,在该函数或功能模块以外不能使用。在C5l语言中局部变量必须定义在函数或功能模块的开头。2)全局变量。全局变量也称为外部变量,是指在程序开始处或各个功能函数的外面定义的变量。在程序开始处定义的全局变量对于整个程序都有效,可供程序中所有的函数共同使用;而在各功能函数外面定义的全局变量只对全局变量定义语句后定义的函数有效,在全局变量定义之前定义的函数不能使用该变量。一般在程序开始处定义全局变量。232020/9/21全局变量的缺点(1)全局变量由C编译器在动态区外的固定存储区域中存储,它在整个程序执行期间均占

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

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

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

×
保存成功