《单片机C51的特点与使用》由会员分享,可在线阅读,更多相关《单片机C51的特点与使用(3页珍藏版)》请在金锄头文库上搜索。
1、C51 的特点与使用(增补内容)C51 是一种在 MCS51 系列单片机上使用的 C 语言。相对于汇编语言,C51 具有很强的语言表达能力和运算能力,而且可移植性很好。在单片机上用 C 编写程序,可以有效地提高程序员的工作效率。过去,由于单片机硬件系统运算速度慢,存储器资源少,而实现同样功能的 C 语言程序,其占用的存储器空间比汇编语言大很多,耗费的时间比汇编语言长很多,使用 C 语言比较困难。近年来,单片机的运算速度大大提高,存储器的价格大幅降低,而在专业人员的不断努力下,C51 编译软件功能增强,使得 C51 机器码占用的存储器空间缩小,运算速度加快,在单片机系统中使用 C51 进行程序设
2、计得以实现。1 C51 的特点C51 与 ANSI C 的规范绝大部分是相同的,以下仅对 C51 的特殊部分进行必要的说明。1.1 新增数据类型bit:片内 RAM 位变量。但注意不能定义位指针,也不能定义位数组。例:bit N3_4; /定义一个片内 RAM 位变量 N3_4sfr:特殊功能寄存器变量。例:sfr P0 = 0x80; /定义一个特殊功能寄存器变量 P0sfr16:双字节特殊功能寄存器变量。sbit:定义特殊功能寄存器中的位变量。例:sbit EA = 0xAF; /定义一个特殊功能寄存器位变量 EA例:sbit P3_2=P32; /定义一个特殊功能寄存器位变量 P3_21
3、.2 新增的数据存储器类型data:片内 RAM 直接寻址区(优先使用 30H7FH,可使用 00H7FH) 。例:unsigned char data HJSQ; /在片内 RAM 中定义一个无符号字节变量 HJSQbdata:片内 RAM 位寻址区(使用 20H2FH) 。例:bit bdata CXJS; /在片内 RAM 位寻址区定义一个位变量 CXJSidata:片内 RAM 间接寻址区(优先使用 80HFFH,可使用 00HFFH) 。例:unsigned char idata BUFFER8; /在片内 RAM 间接寻址区定义/一个数组变量 BUFFERxdata:片外 RAM
4、的全部空间(使用 MOVX DPTR 寻址) 。例:unsigned char xdata * data x; /在片内 RAM 中定义一个指向/片外 RAM 中的无符号字节变量的指针pdata:分页访问的片外 RAM 的一个页面,即 0255(使用 MOVX Ri 寻址) 。code:程序存储器空间。例:unsigned char code zxb=0x77,0x14,0xB3,0xB6,0xD4, /01234 字形表0xE6,0xE7,0x34,0xF7,0xF6, /567890x00,0x80; / -如果在定义变量时省略了存储器类型,则按编译模式 SMALL、COMPACT 或 L
5、ARGE确定变量的存储器类型。模式在编译软件中设置。SMALL:变量定义在片内 RAM 中。COMPACT:变量定义在分页片外 RAM 中(使用 MOVX A,Ri 访问) 。LARGE:变量定义在片外 RAM 中(使用 MOVX A,DPTR 访问) 。1.3 新增中断服务函数函数类型 函数名(形式参数表) interrupt n using n关键字 interrupt 后面的 n 是中断号,n 的取值范围为 031。MCS51 单片机常用中断源的中断号和中断向量如表 1。表 1 常用中断号与中断向量N 中断源 中断向量 8n+30 外部中断 0 0003H1 定时器/计数器 0 000B
6、H2 外部中断 1 0013H3 定时器/计数器 1 001BH4 串行口 0023H关键字 using 用来设定该中断服务函数中使用的工作寄存器组。n 的取值范围为03,分别用来选用 03 组。例:定时器 0 中断服务程序,使用工作寄存器 1 区。void timer0(void) interrupt 1 using 1单片机响应定时器 0 中断时进入该程序,在程序中使用工作寄存器 1 区,程序执行完毕后返回中断前的断点继续执行。1.4 位运算符:按位取反。例:WD_L=WD_L。&:按位与。例:a=WD_L&0X08。|:按位或。例:P1=BAK|0xc0。:按位异或。例:P1=BAK0x
7、c0。:右移。例:a=WD_L4。2 C51 的使用1. 在头文件 reg51.h 或其他头文件中,已经将各个特殊功能寄存器及可使用的位作了定义,用语句#include 将其加入就可以使用各特殊功能寄存器及其位了。2. 用语句#include 将头文件 stdio.h 加入后,即可使用 C51 的库函数。3. 频繁使用的变量,最好定义成片内 RAM 存储器类型,这样有利于提高程序的运行速度。4. char 变量有 signed char 和 unsigned char,分别用于有符号字节变量和无符号字节变量,并非只用于保存字符。5. 中断服务函数中最好不要再调用其它函数。函数中为提高指令执行效
8、率,会把工作寄存器作为直接寻址的片内 RAM 单元使用,例如当选用工作寄存器 0 组时,MOV A,R3 与 MOV A,03H 是等价的。当中断服务函数使用的工作寄存器组与其它函数中使用的工作寄存器组不一致时,就会发生错误。6. 注意逻辑运算符|、& 与位运算符|、& 的区别,关系运算符= =与赋值运算符=的区别。| 和&用于连接两个条件, |和& 用两个变量或常量的运算。 = =用于连接两个变量或常量构成一个条件,=用于将一个变量或常量的值赋给一个变量。7. 对特殊功能寄存器的操作是通过 sfr 和 sbit 变量实现的。例如:IE=0x82,P1=0xc0,EA=0;8. 存储数据表可以
9、用数组。例如:unsigned char code zxb=0x77,0x14,0xB3,0xB6,0xD4, /01234 字形表0xE6,0xE7,0x34,0xF7,0xF6, /567890x00,0x80; / -9. 对于无符号数,应使用无符号变量(unsigned) 。虽然有符号变量( signed)可以处理无符号数,但这样做会降低运算速度。10. 尽量使用短一些的变量,能用 8 位(char)就不用 16 位 (int),能用 16 位(int)就不用32 位(long),这既能减少对存储器的占用,又能提高运算速度。11. 编写程序时,若对运算的优先级吃不准,应该多使用括号。例如:if (CXKBAK1= =0x54)&(CXKBAK2= =0x32)&(i= =0x10)