《单片机原理及基于单片机的嵌入式系统设计》-蔡方凯-电子教案 第12章

上传人:E**** 文档编号:89402410 上传时间:2019-05-24 格式:PPT 页数:75 大小:1.86MB
返回 下载 相关 举报
《单片机原理及基于单片机的嵌入式系统设计》-蔡方凯-电子教案 第12章_第1页
第1页 / 共75页
《单片机原理及基于单片机的嵌入式系统设计》-蔡方凯-电子教案 第12章_第2页
第2页 / 共75页
《单片机原理及基于单片机的嵌入式系统设计》-蔡方凯-电子教案 第12章_第3页
第3页 / 共75页
《单片机原理及基于单片机的嵌入式系统设计》-蔡方凯-电子教案 第12章_第4页
第4页 / 共75页
《单片机原理及基于单片机的嵌入式系统设计》-蔡方凯-电子教案 第12章_第5页
第5页 / 共75页
点击查看更多>>
资源描述

《《单片机原理及基于单片机的嵌入式系统设计》-蔡方凯-电子教案 第12章》由会员分享,可在线阅读,更多相关《《单片机原理及基于单片机的嵌入式系统设计》-蔡方凯-电子教案 第12章(75页珍藏版)》请在金锄头文库上搜索。

1、第12章 嵌入式单片机技术 C教程基础,12.1 C51编程基础 12.2 串行通信与定时程序 12.3 嵌入式操作系统,嵌入式51系列单片机的编程语言常用的有二种:汇编语言,C51语言。 汇编语言的机器代码生成效率高但可读性不强,而C51语言在大多数情况下其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言;而且C51语言还可以嵌入汇编来解决高时效性的代码编写问题。中大型的软件编写用C51语言的开发周期通常要小于汇编语言很多。,C语言的标识符用来标识源程序中某个对象名字。这些对象可以是函数、变量、数组、数据类型、存储方式、语句等。关键字是一类具有固定名称和特定含义的特殊标识

2、符,有时又称为保留字。 ANSI C标准一共规定了32个关健字,表12-1按用途列出了ANSI C标准的关键字。,12.1 C51编程基础 12.1.1标志符与关键字,表12-1 ANSI C标准的关键字,C51编绎器除了支持ANSI C标准的关键字以外,还扩展了如表12-2所示的关键字: 表12-2 C51编绎器的扩展关键字,针对51系列单片机各个可操作部分,C51编绎器定义了如表12-3所示的符号,编程时写出符号名,即可操作单片机对应的部分。 表12-3 C51特殊功能寄存器列表,带*号的特殊功能寄存器都是可以位寻址的寄存器,下面举例说明特殊功能寄存器的操作方法。 例1,欲将单片机P1口的

3、第一根口线DIP封装单片机第一管脚设为报警输出线,低电平报警,则在程序中首先可定义:sbit BJ= P10; 这就定义了一个变量BJ对应P1口的第一根口线,sbit声明变量BJ是位寻址数据类型。需要报警时,使用语句:BJ= 0; 即可令单片机P1口的第一根口线输出低电平,完成报警。当报警完毕,需要撤销报警时,使用如下语句即可恢复到非报警状态:BJ= 1;,例2,欲将单片机P1口的第五根口线至第八根口线设置为构成宽度为4位的双向数据总线,使之既可以接收数据又可以发送数据,则在程序中首先可做如下定义: sbit MT8880_D0= P14; / 双向数据总线 sbit MT8880_D1= P

4、15; / 双向数据总线 sbit MT8880_D2= P16; / 双向数据总线 sbit MT8880_D3= P17; / 双向数据总线,收数据时,令各口线为高,处于监听状态: MT8880_D0 = 1; MT8880_D1 = 1; MT8880_D2 = 1; MT8880_D3 = 1; 当有数据来时,使用如下语句判断、接收数据: if(MT8880_D3=0 .,用作输出数据时,直接写口线即可: MT8880_D0 = 1; MT8880_D1 = 0; MT8880_D2 = 1; MT8880_D3 = 0; 如把这四根口线看作二进制输出,MT8880_D3是高位,则输出

5、了0101,相当于十进制的5。当然,输出前必须保证总线上的其它设备处于监听状态,即非输出状态,否则会产生冲突,因为总线信号是“与”的关系,比如某根数据线被任一总线设备置为逻辑0,则在同时其它设备无法将其置为逻辑1。,12.1.2数据类型,C51有如下数据类型: 表12-4 C51编绎器能够识别的数据类型,指针符号“*“:表示方法是将“*“前面冠以数据类型的符号,如char * point1 表示point1是一个字符型的指针变量。,下面给出几个例子,说明定义不同数据类型变量的操作方法。 例1,定义一个布尔型变量,则有: bit FLAG_BF; 例2,定义一个整型变量,则有: int Time

6、_DU; 例3,定义一个单字节字符型变量,则有: unsigned char LOCK_JS; 例4,定义一个字符型数组,则可在程序开头声明: typedef unsigned char Number20; 这就声明了一个长度为20字节的字符型数组,使用赋值语句: Number0=10 将值10填入该数组第一个字节。使用赋值语句: Number1=15 将值15填入该数组第二个字节。使用赋值语句: MyVarNumber3 将该数组的第四个字节赋给变量MyVar。,例5,欲定义一个结构型变量,则有: struct ReadArray unsigned char Number 20; int S

7、erial 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开头,数据为09及af。 长整数:在数字后面加一个字母L长整数,如2048L、0123L、0xff00L等。

8、,2. 浮点型常量 浮点型常量有十进制形式和指数表示形式。 十进制表示形式又称为定点表示形式,由数字和小数点组成。如0.3141是十进制数表示形式的浮点型常量。 3. 字符型常量 字符型常量是单引号内的字符,如a,b等。对于不可显示的控制字符,可以在该字符前面加一个反斜杠“组成转义字符。利用转义字符可以完成一些特殊功能和输出时的格式控制。常用转义字符如表12-5所示。,表12-5 常用转义字符表,4. 字符串型常量 字符串型常量由双引号“”内的字符组成,如“ABCD”、“$1234”等都是字符串常量。当双引号内的字符个数为0时,称为空串常量。字符串常量首尾的双引号是界限符,当需要表示双引号字符

9、串时,可用双引号转义字符来表示为:“”“。C语言在存储字符串常量时,要在字符串的尾部加一个转义字符0作为该字符串常量的结束符。因此不要将字符常量与字符串常量混淆,如字符常量a与字符串常量”a“是不一样的。,为了某些编程需要,常常在程序开头使用如下语句定义常量: #define PI 3.14 这样,在程序中出现常量PI时,编译器会自动用浮点数3.14代替。,12.1.4变量及其存储模式,变量是一种在程序执行过程中,其值能够不断变化的量。使用一个变量之前,必须进行定义,用一个标识符作为变量名并指出它的数据类型和存储格式,以便编绎系统为它分配相应的存储单元。在C51中对变量进行定义的格式如下: 存

10、储器种类数据类型存储器类型变量名表,其中,“存储器种类“和“存储器类型“是可选项。变量的存储器种类有四种:自动(auto)、外部(extern)、静态(static)和寄存器(register)。定义变量时如果省略存储器种类选项,则该变量格式为自动(auto)。定义一个变量时,C51编绎器允许说明变量的存储器类型。KeilC51编绎器对于每个变量可以准确地赋予其存储器类型,使之能够在单片机系统内准确地定位。表12-6列出了51编绎器所能识别的存储器类型。,表12-6 C51编绎器所能识别的存储器类型,8051具有一些特殊功能寄存器,如定时器方式控制寄存器TMOD、中断允许控制寄存器IE等。C5

11、1编绎器扩充了关键字sfr和sfr16,以便在C语言源程序中直接对特殊功能寄存器进行定义。定义方法如下: sfr P0=0x80;/*定义I/O口P0,其地址为0x80*/ 对于定时器T2,可采用如下方法的方法来定义: sfr16 T2=0xCC;/*定义TIMER2,其地址为T2L=0xCC,T2H=0xCD*/ T2为特殊功能寄存器名,等号后面是它的低字节地址,其高字节地址必须在物理上直接位于低字节之后。,访问特殊功能寄存器中的某位,用扩充关键字sbit, 1.sbit位变量名=位地址 这种方法将位的绝对地址赋给位变量,位地址必须位于0x800xFF之间。例如:sbit Y=0xD7; 2

12、.sbit位变量名=特殊功能寄存器名位位置 当可位寻址位位于特殊功能寄存器中时,可采用这种方法。“位位置“是一个07之间的常数。例如: sfr PSW=0xD0; sbit CY=PSW7; 3.sbit位变量名=字节地址位位置 以一常数作为基址, 常数在0x800xFF之间。“位位置“是一个07之间的常数。例如:sbit CY=0xD07;,需要注意的是,sbit是一个独立的关键字,不要将它与关键字bit相混淆。关键字bit是C51编绎器的一种扩充数据类型,用来定义一个普通位变量,它的值是二进制数的0或1。例如: static bit direction_bit/*定义一个静态位变量dire

13、ction_bit*/,12.1.5用typedef重新定义数据类型,在C51语言程序中,用户还可以根据自己的需要对数据类型重新定义。其方法如下: typedef int Intnew; /*定义Intnew为新的整型数据类型名*/ Intnew i,j; /*将i,j定义为Intnew型变量*/ 一般而言,用typedef定义的新数据类型用大写字母,以便与C语言中原有的数据类型相区别。,12.1.6运算符与表达式,运算符是完成某种特定运算的符号,表达式则是由运算符及运算对换所组成的具有特定含义的式子。C语言是一种表达式语言,在任意一个表达式后面加一个分号“;“就构成了一个表达式语句。 运算符

14、按其在表达式中所起的作用,可分为:赋值运算符、算术运算符、增量与减量运算符、关系运算符、逻辑运算符、位运算符、复合运算符、逗号运算符、条件运算符、指针和地址运算符、强制类型转换运算符和sizeof运算符等。,“=“在C中赋值运算符,如,x=10。示例如下: a = 0xFF; /将常数十六进制数FF赋于变量a C51中的算术运算符有如下几个,其中只有取正值和取负值运算符是单目运算符,其它是双目运算符: + 加或取正值运算符 - 减或取负值运算符 * 乘运算符 / 除运算符 % 取余运算符 如:a+b*(10-a), (x+9)/(y-a) 两浮点数相除,其结果为浮点数,如10.0/20.0所得

15、值为0.5,两个整数相除时,所得值就是整数,如7/3,值为2。C的运算符有优先级和结合性,可用括号“()“来改变优先级。,12.2串行通信与定时程序,下面给出1个C51完整程序,该例子包含对定时器、中断和串行通信的处理。该程序运行在AT89C51单片机上,该单片机安装在一台下位机上,该下位机接收从PSTN公共电话网传来的数据,然后存储转发给PC机 。,12.3嵌入式操作系统 12.3.1嵌入式操作系统简介,提高开发效率仅仅依靠编程语言还不够,应该要建立自己的开发平台。嵌入式实时操作系统(RTOS)就是一个很好的嵌入式软件的开发平台。使用RTOS是大势所趋。,RTOS和一般的操作系统有何区别?我

16、们平时熟悉的DOS、Windows、Linux等操作系统都是通用操作系统,它们针对的是PC或是工作站。为了最大幅度地兼容各种软硬件产品,通用操作系统一般面面俱到、体积庞大。 而RTOS很不一样。嵌入式系统中的硬件资源环境一般比较苛刻,嵌入式微处理器和微控制器的内存一般都不大,要在如此紧张的资源下完成复杂的功能,这就要求嵌入式系统软件必须尽量的小巧、稳定和高效。,目前广泛用于各种嵌入式智能设备的嵌入式操作系统有美国加州的集成系统公司推出的pSOSystem,简称pSOS。 pSOS是高性能、模块化的OS,针对嵌入式微处理器量身打造。该系统提供了多任务处理环境。 pSOS采用模块化体系结构,包括一个实时多任务核心和一系列软件部件、连接库。系统中的每个部分都是封闭式的,相互之间既独立又密切协作。开发人员可以根据不同的应用需求来制定操作系统的功能和所需要的内存大小。,pSOS的主要组成部分有:实时多任务核心pSOS、TCP

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号