项目三 C51程序设计语言基础任务1 C51程序的识读 1.C51程序结构 例3-1 P_test
/********************* //注释,还可用//注释掉一行 File name:P_test.c
Chip name:STC89C51RC Clock frequency:1.20MHz ***********************/
#include “reg52.h” //预处理命令,文件包含预处理命令,后缀名都是.h,标准的MCS-51单片机头文件为”reg51.h”,STC89系列单片机头文件为”reg52.h” #define unit unsigned int //宏定义预处理命令 sbit BZ=P3`7 ; sbit key=P1`0; void delay(unit ms) {
unit i;
while( ms --)
{
for(i=0;i<120;i++); } }
void main(void) {
while(1) {
if(key==0) {
BZ=0x0; delayms(10); BZ=0x1; delayms(50); P0=0xFF; } else {
P0=~P0;
delayms(500); }
} }
2.C51的数据类型
位变量型 bit 字符型 无符号字符型 unsigned char 有符号字符型 signed char C51的数据类型 整数型 无符号整数型 unsigned int 基本类型 有符号整数型 signed int
长整数型 无符号长整数型 unsigned long int 有符号长整数型signed long int 实数型(浮点型) 单精度浮点型float 双精度浮点型double 数组类型array 结构体类型struct 构造类型 共用体union 枚举enum 指针类型 空类型(void) 表3-1 C51基本数据类型的长度和值域 类型 位变量型bit 无符号字符型 unsigned char 有符号字符型 signed char 无符号整数型 unsigned int 有符号整数型 signed int 无符号长整数型 unsigned long int 有符号长整数型 signed long int 单精度浮点型 float 双精度浮点型 double 一般指针类型 长度/bit 1 8 8 16 16 32 32 32 32 24 长度/byte 单字节 单字节 双字节 双字节 四字节 四字节 四字节 四字节 三字节 范围 0 ,1 0-255 -128-127 0-65536 -32768-32767
3.C51的标识符和关键字
标识符是由字母、数字和下划线组成的字符串,第一个字符必须是字母或下划线,不超过32个字符。
表3-2 C51中的关键字 关键字 auto bdata break bit case char 用途 存储种类声明 存储器类型说明 程序语句 位变量语句 程序语句 数据类型的声明 说明 用来声明局部变量 可位寻址的内部数据存储器 退出最内层循环体 位变量的值是1(true)或0(flase) switch语句中的选择项 单字节整数型或字符型数据 关键字 code const continue data default do double else enum extern float for goto idata if int interrupt long pdata register reentrant return sbit short signed sizeof Sfr Sfr16 static struct switch typedef union unsigned using void volatile while xdata
用途 存储器类型声明 存储类型说明 程序语句 存储器类型说明 程序语句 程序语句 数据类型说明 程序语句 数据类型说明 存储类型说明 数据类型说明 程序语句 程序语句 存储器类型说明 程序语句 数据类型说明 中断声明 数据类型说明 存储器类型说明 存储类型说明 再入函数说明 程序语句 位变量声明 数据类型说明 数据类型说明 运算符 特殊功能寄存器声明 特殊功能寄存器声明 存储类型说明 数据类型说明 程序语句 数据类型说明 数据类型说明 数据类型说明 寄存器组定义 数据类型说明 数据类型说明 程序语句 存储器类型说明 说明 程序存储器 在程序执行过程中不可修改的变量值 退出本次循环,转向下一次循环 直接寻址的内部数据存储器 Switch语句中的失败选择项 构成do...while循环结构 双精度浮点数 构成if...else选择结构 枚举 在其他程序模块中声明了的全局变量 单精度浮点型 构成for循环结构 构成goto循环结构 间接寻址的内部数据存储器 构成do...while循环结构 基本整数型 定义一个中断函数 长整数型 分页寻址的内部数据存储器 使用CPU内部的寄存器变量 定义一个再入函数 函数返回 声明一个可位寻址的变量 短整数型 有符号数,二进制的最高位位符号位 计算表达式或数据类型的字节数 声明一个特殊功能寄存器 声明一个16位的特殊功能寄存器 静态变量 结构类型数据 构成switch选择语句 重新进行数据类型定义 联合数据类型 无符号数据 定义芯片的工作寄存器 无符号数据 声明该变量在程序执行中可被隐含改变 构成while和do...while循环语句 外部数据存储器 4.C51的常量和变量 1)常量
常量就是在程序运行过程中,其值不能改变的数据,包括整型常量、字符常量、字符串常量、实数常量、位标量等。
(1)整型常量:可以用二进制、八进制、十进制、十六进制表示。
无符号整数常量在一个数字后面加上“u”或“U”表示。长整数型常量在后面加上“l”或“L”,无符号长整数型常量在数字后面加上“ul”或“UL”,实数型常量在后面加“f”或“F”。
(2)字符常量:单引号内的字符,不可以显示的控制字符在前加“\\”组成专用转义字符。 (3)字符串常量:双引号内的字符,当双引号内没有字符时是空字符串。在C语言中,字符串常量是作为字符类型数组来处理的,在存储字符串时,系统在字符串尾部加上转义字符“\\o”,作为该字符串的结束符。
(4)实数常量:有十进制和指数两种表示形式。指数表示的实数为“[±]数字[.数字]e[±] 数字”,[ ]中的内容为可选项
(5)位标量:位标量的值是一个二进制数。 2)变量
变量就是在程序运行过程中,其值可以被改变的数据。必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。定义变量的格式: [ < 存储模式 > ] < 类型定义 > [ 存储器类型 ] < 标识符 >; 类型定义和标识符是必要的。存储模式有四种,自动(auto)、外部(extern)、静态(static)和寄存器(register),默认类型为自动(auto)。
表3-3 C51存储类型与MCS-51单片机存储空间的对应关系及其大小 存储类型 与存储空间的对应关系 data bdata idata pdata xdata code 直接寻址片内数据存储区,访问速度快(128B) 可位寻址片内数据存储区,允许位与字节混合访问(16B) 间接寻址片内数据存储区,可访问片内全部RAM地址空间(256B) 分页寻址片外数据存储区,由MOVX @Ri访问 寻址片外数据存储区(64KB),由 MOVX @DPTR访问 寻址代码存储区(64KB),由 MOVC @DPTR访问 长度/bit 长度/byte 存储范围 8 8 8 8 16 16 1 1 1 1 2 2 0-255 0-255 0-255 0-255 0-65535 0-65535 如果在变量定义时省略了存储类型标识符,则编译器会自动选择默认的存储类型。默认的存储类型进一步由SMALL、COMPACT、和LARGE存储模式指令限制。
存储模式决定了变量的默认存储类型、参数传递区和无明确存储类型说明变量的存储类型。在SMALL模式下,参数传递是在片内数据存储区中完成的。COMPACT和LARGE模式允许参数在外部存储器中传递。
表3-4 存储模式及说明 存储模式 SMALL 说明 参数及局部变量放入可直接寻址的片内存储器(最大为128B,默认存储类型为data),因此访问十分方便。另外,所有对象(包括栈)都必须嵌入片内RAM,栈长由函数的嵌套导数决定。 参数及局部变量放入分页片外存储区(最大为256B,默认的存储类型为pdata),通过寄存器R0和R1(@R0、@R1)间接寻址,栈空间位于MCS-51系统内部数据存储区中。 参数及局部变量直接放入片外数据存储区(最大为64KB,默认存储类型为xdata),使用数据指针DPTR来进行寻址。用此数据指针进行访问效率较低,尤其是对两个或多个字节的变量,这种数据类型的访问机制直接影响代码的长度。另一不方便之处在于这种数据指针不能对称操作。 COMPACT LARGE
任务2 运算符和表达式 表3-5 C语言常用的运算符