您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 《单片机原理及基于单片机的嵌入式系统设计》-蔡方凯-电子教案-4397
第12章嵌入式单片机技术C教程基础12.1C51编程基础12.2串行通信与定时程序12.3嵌入式操作系统嵌入式51系列单片机的编程语言常用的有二种:汇编语言,C51语言。汇编语言的机器代码生成效率高但可读性不强,而C51语言在大多数情况下其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言;而且C51语言还可以嵌入汇编来解决高时效性的代码编写问题。中大型的软件编写用C51语言的开发周期通常要小于汇编语言很多。C语言的标识符用来标识源程序中某个对象名字。这些对象可以是函数、变量、数组、数据类型、存储方式、语句等。关键字是一类具有固定名称和特定含义的特殊标识符,有时又称为保留字。ANSIC标准一共规定了32个关健字,表12-1按用途列出了ANSIC标准的关键字。12.1C51编程基础12.1.1标志符与关键字表12-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数据种类声明基本整型数long数据种类声明长整型数register数据种类声明使用CPU内部寄存器的变量return程序语句函数返回short数据种类声明短整型数signed数据种类声明有符号数,二进制数的最高位为符号位sizeof运算符计算表达式或数据类型的字节数static数据种类声明静态变量struct数据种类声明结构类型数据switch程序语句构成switch选择结构typedef数据种类声明重新进行数据类型定义union数据种类声明联合类型数据unsigned数据种类声明无符号数据void数据种类声明无类型数据volatile数据种类声明声明该变量在程度执行中可被隐含的改变while程度语句构成while和...while循环结构C51编绎器除了支持ANSIC标准的关键字以外,还扩展了如表12-2所示的关键字:表12-2C51编绎器的扩展关键字关键字用途说明_at_地址定位为变量进行存储器绝对空间地址定位alien函数特殊声明用以声明与PL/M51兼容的函数bdata存储器类型声明可位寻址的8051内部数据存储器bit位变量声明声明一个位变量或位类型的函数code存储器类型声明8051程度存储器空间compact存储器模式指定使用8051外部分页寻址数据存储器空间data存储器类型声明直接寻址的8051内部数据存储器idata存储器类型声明间接寻址的8051内部数据存储器interrupt中断函数声明定义一个中断服务函数large存储器模式指定使用8051外部数据存储器空间pdata存储器类型声明分页寻址的8051外部数据存储器_priority_多任务优先声明规定RTX51或RTX51Tiny的任务优先级reentrant再入函数声明定义一个再入函数sbit位变量声明声明一个可位寻址变量sfr特殊功能寄存器声明声明一个8位的特殊功能寄存器sfr16特殊功能寄存器声明声明一个16位的特殊功能寄存器small存储器模式指定使用8051内部数据存储器空间_task_任务声明定义实时多任务函数usang寄存器组定义定义8051的工作寄存器组xdata存储器类型声明8051外部数据存储器针对51系列单片机各个可操作部分,C51编绎器定义了如表12-3所示的符号,编程时写出符号名,即可操作单片机对应的部分。表12-3C51特殊功能寄存器列表符号地址注释*ACCE0H累加器*BF0H乘法寄存器*PSWD0H程序状态字SP81H堆栈指针DPL82H数据存储器指针低8位DPH83H数据存储器指针高8位*IEA8H中断允许控制器*IPD8H中断优先控制器*P080H端口0*P190H端口1*P2A0H端口2*P3B0H端口3PCON87H电源控制及波特率选择*SCON98H串行口控制器SBUF99H串行数据缓冲器*TCON88H定时器控制TMOD89H定时器方式选择TL08AH定时器0低8位TL18BH定时器1低8位TH08CH定时器0低8位TH18DH定时器1高8位带*号的特殊功能寄存器都是可以位寻址的寄存器下面举例说明特殊功能寄存器的操作方法。例1,欲将单片机P1口的第一根口线-DIP封装单片机第一管脚-设为报警输出线,低电平报警,则在程序中首先可定义:sbitBJ=P1^0;这就定义了一个变量BJ对应P1口的第一根口线,sbit声明变量BJ是位寻址数据类型。需要报警时,使用语句:BJ=0;即可令单片机P1口的第一根口线输出低电平,完成报警。当报警完毕,需要撤销报警时,使用如下语句即可恢复到非报警状态:BJ=1;例2,欲将单片机P1口的第五根口线至第八根口线设置为构成宽度为4位的双向数据总线,使之既可以接收数据又可以发送数据,则在程序中首先可做如下定义:sbitMT8880_D0=P1^4;//双向数据总线sbitMT8880_D1=P1^5;//双向数据总线sbitMT8880_D2=P1^6;//双向数据总线sbitMT8880_D3=P1^7;//双向数据总线收数据时,令各口线为高,处于监听状态:MT8880_D0=1;MT8880_D1=1;MT8880_D2=1;MT8880_D3=1;当有数据来时,使用如下语句判断、接收数据:if(MT8880_D3==0&MT8880_D2==0&MT8880_D1==0&MT8880_D0==0)Number_Key=0;if(MT8880_D3==0&MT8880_D2==0&MT8880_D1==0&MT8880_D0==1)Number_Key=1;…….用作输出数据时,直接写口线即可:MT8880_D0=1;MT8880_D1=0;MT8880_D2=1;MT8880_D3=0;如把这四根口线看作二进制输出,MT8880_D3是高位,则输出了0101,相当于十进制的5。当然,输出前必须保证总线上的其它设备处于监听状态,即非输出状态,否则会产生冲突,因为总线信号是“与”的关系,比如某根数据线被任一总线设备置为逻辑0,则在同时其它设备无法将其置为逻辑1。12.1.2数据类型C51有如下数据类型:表12-4C51编绎器能够识别的数据类型数据类型字符类型长度值域unsignedchar字符类型单字节0~255signedchar字符类型单字节-128~127unsignedint整型双字节0~65536unsignedint整型双字节-32768~32767unsignedlong长整型4字节0~4294967295signedlong长整型4字节-2147483648~2147483647float浮点型4字节±1.175494E-38~±3.4028223E+38*指针型1~3字节对象的地址bit位类型位0或1sfr特殊功能寄存器单字节0~255sfr1616位特殊功能寄存器双字节0~65536sbit可寻址位位0或1指针符号*:表示方法是将*前面冠以数据类型的符号,如char*point1表示point1是一个字符型的指针变量。下面给出几个例子,说明定义不同数据类型变量的操作方法。例1,定义一个布尔型变量,则有:bitFLAG_BF;例2,定义一个整型变量,则有:intTime_DU;例3,定义一个单字节字符型变量,则有:unsignedcharLOCK_JS;例4,定义一个字符型数组,则可在程序开头声明:typedefunsignedcharNumber[20];这就声明了一个长度为20字节的字符型数组,使用赋值语句:Number[0]=10将值10填入该数组第一个字节。使用赋值语句:Number[1]=15将值15填入该数组第二个字节。使用赋值语句:MyVar=Number[3]将该数组的第四个字节赋给变量MyVar。例5,欲定义一个结构型变量,则有:structReadArray{unsignedcharNumber[20];intSerial[5];}READARRAY;给结构变量赋值可使用如下语句:READARRAY.Number[0]=’a’;READARRAY.Number[1]=’b’;READARRAY.Number[2]=’c’;…READARRAY.Serial[3]=32;…12.1.3常量常量的值在程序执行过程中不能改变。常量的数据类型有整型、浮点型、字符型和字符串型等。分别说明如下:1.整型常量整型常量就是整型常数,可表示为:·十进制整数:如12、-5678、0等。·十六进制整数:十六进制数据以0x开头,数据为0~9及a~f。·长整数:在数字后面加一个字母L长整数,如2048L、0123L、0xff00L等。2.浮点型常量浮点型常量有十进制形式和指数表示形式。·十进制表示形式又称为定点表示形式,由数字和小数点组成。如0.3141是十进制数表示形式的浮点型常量。3.字符型常量字符型常量是单引号内的字符,如'a','b'等。对于不可显示的控制字符,可以在该字符前面加一个反斜杠\组成转义字符。利用转义字符可以完成一些特殊功能和输出时的格式控制。常用转义字符如表12-5所示。表12-5常用转义字符表转义字符含义16进制数形式\0空字符(NULL)0x00\n换行符(LF)0x0A\r回车符(CR)0x0D\t水平制表符(HT)0x09\b退格符(BS)0x08\f换页符(FF)0x0C\'单引号0x27\双引号0x22\\反斜杠0x5C4.字符串型常量字符串型常量由双引号“”内的字符组成,如“ABCD”、“$1234”等都是字符串常量。当双引号内的字符个数为0时,称为空串常量。字符串常量首尾的双引号是界限符,当需要表示双引号字符串时,可用双引号转义字符来表示为:“\”“。C语言在存储字符串常量时,要在字符串的尾部加一个转义字符\0作为该字符串常量的结束符。因此不要将字符常量与字符串常量混淆,如字符常量’a‘与字符串常量”a“是不一样的。为了某些编程需要,常常在程序开头使用如下语句定义常量:#definePI3.14这样,在程序中出现常量PI时,编译器会自动用浮点数3.14代替。12.1.4变量及其存储模式变量是一种在程序执行过程中,其值能够不断变化的量。使用一个变量之前,必须进行定义,用一个标识符作为变量名并指出它的数据类型和存储格式,以便编绎系统为它分配相应的存储单元。在C51中对变量进行定义的格式如下:[存储器种类]数据类型[存储器类型]变量名表其中,存储器种类和存储器类型是可选项。变量的存储器种类有四种:自动(auto)、外部(extern)、静态(static)和寄存器(register)。定义变量时如果省略存储器种类选项,则该变量格式为自动(auto)。定义一个变量时,C51编绎器允许说明变量的存储器类型。KeilC51编绎器对于每个变量可以准确地赋予其存储器类型,使之能够在单片机系统内准确地定位。表12-6列出了C51编绎器所能识别的存储器类型。表12-6C51编绎器所能识别的存储器类型存储器类型说明DATA直接寻址的片内数据存储器,访问速度最快BDATA可位寻址的片内数据存储器,允许位与字节混合访问IDATA间接访问的片内数据存储器,允许访问全部片内地址PDATA分页寻址的片外数据存储器,用MOVX@Ri指令访问XDATA片外数据存储器,用MOVX@DPTR指令访问CODE程序存储器,用MOVC@A+DPTR指令访
本文标题:《单片机原理及基于单片机的嵌入式系统设计》-蔡方凯-电子教案-4397
链接地址:https://www.777doc.com/doc-63829 .html