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