单片机的C语言应用程序设计 -精品文档资料.ppt
《单片机的C语言应用程序设计 -精品文档资料.ppt》由会员分享,可在线阅读,更多相关《单片机的C语言应用程序设计 -精品文档资料.ppt(169页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第7章 单片机的C语言应用程序设计 第7章 单片机的C语言应用程序设计 7.1 C语言与语言与MCS-517.2 C51数据类型及在数据类型及在MCS-51中的存储方式中的存储方式7.3 C51数据的存储类型与数据的存储类型与MCS-51存储结构存储结构7.4 MCS-51特殊功能寄存器特殊功能寄存器(SFR)的的C51定义定义7.5 MCS-51并行接口的并行接口的C51定义定义7.6 位变量的位变量的C51定义定义7.7 C51构造数据类型构造数据类型7.8 模块化程序开发过程模块化程序开发过程7.9 MCS-51内部资源使用的内部资源使用的C语言编程语言编程7.10 MCS-51片外扩展
2、的片外扩展的C语言编程语言编程7.11 频率量测量的频率量测量的C语言编程语言编程7.12 MCS-51机间通信的机间通信的C语言编程语言编程7.13 键盘和数码显示人机交互的键盘和数码显示人机交互的C语言编程语言编程第7章 单片机的C语言应用程序设计 7.1 C语言与语言与MCS51 用汇编程序设计MCS51系列单片机应用程序时,必须要考虑其存储器结构,尤其必须考虑其片内数据存储器与特殊功能寄存器正确、合理的使用以及按实际地址处理端口数据。用C语言编写MCS51单片机的应用程序,虽然不像用汇编语言那样具体地组织、分配存储器资源和处理端口数据,但在C语言编程中,对数据类型与变量的定义,必须要与
3、单片机的存储结构相关联,否则编译器不能正确地映射定位。用C语言编写单片机应用程序与编写标准的C语言程序的不同之处就在于根据单片机存储结构及内部资源定义相应的C语言中的数据类型和变量,其它的语法规定、程序结构及程序设计方法都与标准的C语言程序设计相同。 第7章 单片机的C语言应用程序设计 用C语言编写的应用程序必须经单片机的C语言编译器(简称C51),转换生成单片机可执行的代码程序。支持MCS51系列单片机的C语言编译器有很多种。如American Automation、Auocet、BSO/TASKING、DUNFIELD SHAREWARE、KEIL/Franklin等。其中KEIL/Fra
4、nklin以它的代码紧凑和使用方便等特点优于其它编译器。本章是针对这种编译器介绍 MCS51单片机C语言程序设计。 第7章 单片机的C语言应用程序设计 7.2 C51数据类型及在数据类型及在MCS-51中的存储方式中的存储方式7.2.1 C51的数据类型的数据类型 Franklin C51编译器具体支持的数据类型有:位型(bit)、无符号字符(unsigned char)、有符号字符(singed char)、无符号整型(unsigned int )、有符号整型(signed int )、无符号长整型(unsigned long )、有符号长整型(signed long )、浮点型(float
5、)和指针类型等。第7章 单片机的C语言应用程序设计 表表7.1 Franklin C51的数据类型的数据类型数据类型长度(bit)长度(byte)值域bit110,1unsigned char810255signed char81128127unsigned int 162065535signed int 1623276832767unsigned long32404294967295signed long 32421474836482147483647float 3241.176E383.40E+38(6位数字)double6481.176E383.40E+38(10位数字)一般指针243存
6、储空间065535第7章 单片机的C语言应用程序设计 7.2.2 C51数据在数据在MCS-51中的存储方式中的存储方式 位变量(bit):与MCS-51硬件特性操作有关的可以定义成位变量。位变量必须定位在MCS-51单片机片内RAM的位寻址空间中。 字符变量(char):字符变量的长度为1 byte即8位。这很合适MCS-51单片机,因为MCS-51单片机每次可处理8位数据。对于无符号变量(unsigned char)的值域范围是0255。对于有符号字符变量(signed char),最具有重要意义的位是最高位上的符号标志位(msb)。此位为1代表负,为0代表正。有符号字符变量和无符号字符变
7、量在表示0127的数值时,其含义是一样的,都是00 x7F。负数一般用补码表示,即用11111111表示-1, 用11111110表示-2。当进行乘除法运算时,符号问题就变得十分复杂,而C51编译器会自动地将相应的库函数调入程序中来解决这个问题。第7章 单片机的C语言应用程序设计 整型变量(int): 整型变量的长度为16位。与8080和8086 CPU系列不同,MCS-51系列单片机将int型变量的高位字节数存放在低地址字节中,低位字节数存放在高地址字节中。有符号整型变量(signed int)也使用msb位作符号标志位,并使用二进制补码表示数值。可直接使用几种专用的机器指令来完成多字节的加
8、、减、乘、除运算。整型变量值0 x1234以图7.1所示的方式存放在内存中。第7章 单片机的C语言应用程序设计 图7.1 整型数的存储结构 0 x120 x34+0+1地址 0 x120 x340 x560 x78.+0+1+2+3地址 图7.2 长整型变量的存储结构 第7章 单片机的C语言应用程序设计 浮点型变量(float): 浮点型变量为32位,占4个字节,许多复杂的数学表达式都采用浮点变量数据类型。应用符号位表示数的符号,用阶码和尾数表示数的大小。 用它们进行任何数学运算都需要使用由编译器决定的各种不同效率等级的库函数。Franklin C51的浮点变量数据类型的使用格式与IEEE-7
9、54标准有关,具有24位精度,尾数的高位始终为1,因而不保存,位的分布如下: 1位符号位。 8位指数位。 23位尾数。 第7章 单片机的C语言应用程序设计 符号位是最高位,尾数为低23位,内存中按字节存储顺序如下:地址地址+0+1+2+3内容内容MMMMMMMMMMMMMMMMEMMMMMMMSEEEEEEE 其中,S为符号位,1表示负,0表示正;E为阶码;M为23位尾数,最高位为1。 浮点变量值 -12.5的十进制为:0 xC1480000,它按图7.3所示方式存于内存中。第7章 单片机的C语言应用程序设计 0 x000 x000 x480 xC1.+0+1+2+3地址 图7.3 浮点数的存
10、储结构 第7章 单片机的C语言应用程序设计 在编程时,如果只强调运算速度而不进行负数运算时,最好采用无符号(unsigned)格式。 无符号字符类型的使用:无论何时,应尽可能使用无符号字符变量,因为它能直接被MCS-51所接受。基于同样的原因,也应尽量使用位变量。有符号字符变量虽然也只占用一个字节,但需要进行额外的操作来进行测试代码的符号位。这无疑会降低代码效率。第7章 单片机的C语言应用程序设计 使用简化形式定义数据类型。其方法是在源程序开头使用#define语句自定义简化的类型标识符。例如:#define uchar unsigned char #define uint unsigned
11、int 这样,在编程中,就可以用uchar代替unsigned char,用uint代替unsigned int来定义变量。第7章 单片机的C语言应用程序设计 7.3 C51数据的存储类型与数据的存储类型与MCS-51存储结构存储结构表表 7.2 C51存储类型与存储类型与MCS-51存储空间的对应关系存储空间的对应关系存储类型与存储空间的对应关系 data 直接寻址片内数据存储区,访问速度快(128字节) bdata 可位寻址片内数据存储区,允许位与字节混合访问(16字节) idata 间接寻址片内数据存储区,可访问片内全部RAM地址空间(256字节) pdata 分页寻址片外数据存储区(2
12、56字节)由MOV Ri访问(i=0,1) xdata 片外数据存储区(64 KB)由MOVX DPTR访问 code 程序存储器64 KB空间,由MOVC DPTR访问第7章 单片机的C语言应用程序设计 表表7.3 C51存储类型及其数据长度和值域存储类型及其数据长度和值域存储类型长度(bit)长度(byte)值域范围data810255idata810255pdata810255xdata162065 535code162065 535第7章 单片机的C语言应用程序设计 带存储类型的变量的定义的一般格式为 数据类型 存储类型 变量名带存储类型的变量定义举例:char data var1;b
13、it bdata flags;float idata x,y,z;unsigned int pdata var2;unsigned char vector34;第7章 单片机的C语言应用程序设计 表表 7.4 存储模式说明存储模式说明存储模式说 明SMALL默认的存储类型是data,参数及局部变量放入可直接寻址片内RAM的用户区中(最大128字节)。另外所有对象(包括堆栈),都必须嵌入片内RAM。栈长很关键,因为实际栈长依赖于函数嵌套调用层数COMPACT默认的存储类型是pdata,参数及局部变量放入分页的外部数据存储区,通过R0或R1间接访问,栈空间位于片内数据存储区中LARGE默认的存储类
14、型是xdata,参数及局部变量直接放入片外数据存储区,使用数据指针DPTR来进行寻址。用此数据指针进行访问效率较低,尤其对两个或多个字节的变量,这种数据类型的访问机制直接影响代码的长度第7章 单片机的C语言应用程序设计 7.4 MCS-51特殊功能寄存器特殊功能寄存器(SFR)的的C51定义定义 MCS-51单片机中,除了程序计数器PC和4组工作寄存器组外,其它所有的寄存器均为特殊功能寄存器(SFR),分散在片内RAM区的高128字节中,地址范围为80H0FFH。SFR中有11个寄存器具有位寻址能力,它们的字节地址都能被8整除,即字节地址是以8或0为尾数的。 为了能直接访问这些SFR,Fran
15、klin C51提供了一种自主形式的定义方法,这种定义方法与标准C语言不兼容,只适用于对MCS-51系列单片机进行C语言编程。特殊功能寄存器C51定义的一般语法格式如下:sfr sfr-name = int constant;第7章 单片机的C语言应用程序设计 sfr是定义语句的关键字,其后必须跟一个MSC-51单片机真实存在的特殊功能寄存器名,=后面必须是一个整型常数,不允许带有运算符的表达式,是特殊功能寄存器sfr-name的字节地址,这个常数值的范围必须在SFR地址范围内,位于0 x800 xFF。例如:sfr SCON=0 x98; /* 串口控制寄存器地址98H */sfr TMOD
16、=0 x89;/* 定时器/计数器方式控制寄存器地址89H */第7章 单片机的C语言应用程序设计 MCS-51系列单片机的特殊功能寄存器的数量与类型不尽相同,因此建议将所有特殊的sfr定义放入一个头文件中,该文件应包括MCS-51单片机系列机型中的SFR定义。C51编译器的reg51.h头文件就是这样一个文件。 在新的MCS-51系列产品中,SFR在功能上经常组合为16位值,当SFR的高字节地址直接位于低字节之后时,对16位SFR的值可以直接进行访问。例如52子系列的定时器/计数器2就是这种情况。为了有效地访问这类SFR,可使用关键字sfr16来定义,其定义语句的语法格式与8位SFR相同,只
17、是=后面的地址必须用16位SFR的低字节地址,即低字节地址作为sfr16的定义地址。第7章 单片机的C语言应用程序设计 例如: sfr16 T2 = 0 xCC /*定时器/计数器2:T2低8位地址为0CCH,T2高8位地址为0CDH*/ 这种定义适用于所有新的16位SFR,但不能用于定时器/计数器0和1。 对于位寻址的SFR中的位,C51的扩充功能支持特殊位的定义,像SFR一样不与标准C兼容,使用sbit来定义位寻址单元。第7章 单片机的C语言应用程序设计 第一种格式: sbit bit-name = sfr-nameint constant; sbit是定义语句的关键字,后跟一个寻址位符号
18、名(该位符号名必须是MCS-51单片机中规定的位名称),=后的sfr-name必须是已定义过的SFR的名字,后的整常数是寻址位在特殊功能寄存器sfr-name中的位号,必须是07范围中的数。例如: sfr PSW=0 xD0 ; /* 定义PSW寄存器地址为D0H */ sbit OV=PSW2 ; /* 定义OV位为PSW.2,地址为D2H */ sbit CY=PSW7 ; /* 定义CY位为PSW.7,地址为D7H */第7章 单片机的C语言应用程序设计 第二种格式:sbit bit-name = int constantint constant; =后的int constant为寻址地
19、址位所在的特殊功能寄存器的字节地址,符号后的int constant为寻址位在特殊功能寄存器中的位号。例如: sbit OV=0XD02 ;/* 定义OV位地址是D0H字节中的第2位 */ sbit CY=0XD07 ;/* 定义CY位地址是D0H字节中的第7位 */第7章 单片机的C语言应用程序设计 第三种格式:sbit bit-name = int constant; =后的int constant为寻址位的绝对位地址。例如: sbit OV=0XD2 ;/* 定义OV位地址为D2H */ sbit CY=0XD7 ;/* 定义CY位地址为D7H */ 特殊功能位代表了一个独立的定义类,不
20、能与其它位定义和位域互换。第7章 单片机的C语言应用程序设计 7.5 MCS-51并行接口的并行接口的C51定义定义 MCS-51系列单片机并行I/O接口除了芯片上的4个I/O口(P0 P3)外,还可以在片外扩展I/O口。MCS-51单片机I/O口与数据存储器统一编址,即把一个I/O口当作数据存储器中的一个单元来看待。 使用C51进行编程时,MCS-51片内的I/O口与片外扩展的I/O可以统一在一个头文件中定义,也可以在程序中(一般在开始的位置)进行定义,其定义方法如下: 对于MCS-51片内I/O口按特殊功能寄存器方法定义。例如:sfr P0=0 x80 ; /* 定义P0口,地址为80H
21、*/sfr P1=0 x90 ; /* 定义P1口,地址为90H */第7章 单片机的C语言应用程序设计 对于片外扩展I/O口,则根据硬件译码地址,将其视作为片外数据存储器的一个单元,使用#define语句进行定义。例如#include #define PORTA XBYTE 0 xFFC0 absacc.h是C51中绝对地址访问函数的头文件,将PORTA定义为外部I/O口,地址为 FFC0H,长度为8位。 一旦在头文件或程序中对这些片外I/O口进行定义后,在程序中就可以自由使用变量名与其实际地址的联系,以便使程序员能用软件模拟MCS-51的硬件操作。第7章 单片机的C语言应用程序设计 (1)
22、 位变量C51定义。使用C51编程时,定义了位变量后,就可以用定义了的变量来表示MCS-51的位寻址单元。 位变量的C51定义的一般语法格式如下: 位类型标识符(bit) 位变量名; 例如:bit direction_bit ;/* 把direction_bit定义为位变量 */bit look_pointer ;/* 把look_pointer定义为位变量 */7.6 位变量的位变量的C51定义定义第7章 单片机的C语言应用程序设计 (2) 函数可包含类型为bit的参数,也可以将其作为返回值。例如: bit func(bit b0, bit b1) /* 变量b0,b1作为函数的参数 */
23、return (b1); /* 变量b1作为函数的返回值 */ 注意,使用(#pragma disable)或包含明确的寄存器组切换(using n)的函数不能返回位值,否则编辑器将会给出一个错误信息。第7章 单片机的C语言应用程序设计 (3) 对位变量定义的限制。位变量不能定义成一个指针,如不能定义:bit * bit_pointer。不存在位数组,如不能定义:bit b_array 。 在位定义中,允许定义存储类型,位变量都被放入一个位段,此段总位于MCS-51片内的RAM区中。因此,存储类型限制为data和idata,如果将位变量的存储类型定义成其它存储类型都将编译出错。第7章 单片机的
24、C语言应用程序设计 例例1 先定义变量的数据类型和存储类型:bdata int ibase; /* 定义ibase为bdata整型变量 */bdata char bary4;/* bary4定义为bdata字符型数组 */然后可使用sbit定义可独立寻址访问的对象位:sbit mybit0 = ibase0 ;/* mybit0定义为ibase的第0位 */sbit mybit15 = ibase15;/* mybit0定义为ibase的第15位 */sbit Ary07 = bary07 ;/* Ary07定义为abry0的第7位 */sbit Ary37 = bary37 ;/* Ary3
25、7定义为abry3的第7位 */第7章 单片机的C语言应用程序设计 对象ibase和bary也可以字节寻址: ary37=0; /* bary3的第7位赋值为0 */ bary3=a; /* 字节寻址,bary3 赋值为a */ sbit定义要位寻址对象所在字节基址对象的存储类型为bdata,否则只有绝对的特殊位定义(sbit)是合法的。操作符后的最大值依赖于指定的基类型,对于char/uchar而言是07,对于int/uint而言是015,对于long/ulong而言是031。第7章 单片机的C语言应用程序设计 7.7 C51构造数据类型构造数据类型 1基于存储器的指针基于存储器的指针 基于
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机的C语言应用程序设计 -精品文档资料 单片机 语言 应用 程序设计 精品 文档 资料
限制150内