New_单片机应用技术C语言版第4章C51程序设计入门.pdf
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5
用汇编语言编写程序时,必须考虑其存 储器的结构,尤其要考虑其片内数据存储器、 特殊功能寄存器是否正确合理的使用,以及 按照实际地址端口数据的处理。
2019-11-20
6
3、 C51扩展的关键字
由于单片机在结构及编程上的特殊要求,C51 有自己的特殊关键字,称之为C51扩展的关键字, 下面给出常用的C51扩展的关键字。
2019-11-20
35
7)定义存储在xdata区域的动态unsigned int数组:
unsigned int xdata receiv_buf[50]; 8)定义存储在code区域的unsigned char数
组: unsigned char code a[10]=
{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; //定义共阴极数码管段码数组
bdata 片内RAM,位寻址区0x20~0x2f,可字节访问
idata 片内RAM,间接寻址,256字节,与 @Ri 对应
pdata 片外RAM,低256字节,与MOVX @Ri 对应
xdata 片外RAM,64KB全空间 code ROM空间,64KB全空间
2019-11-20
33
4、 C51变量定义举例
2019-11-20
26
(2)静态变量
静态(存储)变量:用static定义的为 静态变量。函数退出时,变量的值不消失。 分为静态局部和静态全局变量。
静态局部变量:在函数体内定义 静态全局变量:在函数体外部定义
若非必要,不要多用静态变量
2019-11-20
27
(3)外部变量
外部(存储)变量:用extern声明的变 量为外部变量,是在其它文件定义过的全局 变量。 用extern声明后,便可以在所声明 的文件中使用。
2)定义特殊功能寄存器,必须放在函 数外面作为全局变量。
3)用sfr或sfr16每次只能定义一个特 殊功能寄存器。
4)用sfr或sfr16定义的是绝对定位的 变量(因为名字是与确定地址对应的), 具有特定的意义,在应用时不能像一般变 量那样随便使用。
2019-11-20
14
3、 sbit型位变量的定义
static unsigned int data d;
2019-11-20
34
4)定义存储在bdata区域的动态unsigned char变量:
unsigned char bdata operate, operate1;
5)定义存储在idata区域的动态unsigned char数组:
unsigned char idata temp[20]; 6)定义在pdata区域的动态有符号int数组: int pdata send_data[30];
动态存储(auto) 静态存储(static) 全局存储(extern) 寄存器存储(register)
2019-11-20
25
(1)动态变量
动态(存储)变量:用auto定义的为动 态变量,也叫自动变量。
作用范围:在定义它的函数内或复合语 句内部。执行时,分配存储空间,结束时释 放存储空间。
定义变量时,auto可以省略
数据类型 表示方法 长 度
数值范围
无符号字符型 unsigned char 1字节 0~255
有符号字符型 signed char 1字节 -128~127
无符号整型 unsigned int
2字节 0~65535
有符号整型 signed int 2字节 -32768~32767
无符号长整型 unsigned long
_at_ bdata bit
code
data idata
interrupt
pdata
reentrant
sbit
sfr
sfr16
xdata
这些关键字在后面会陆续接触到,此处先不给 出它们的含义。
2019-11-20
7
4.1 C51基本数据类型
1、数据类型:数据的不同格式。 2、数据类型分类:基本型(表4.1)、构
定义的一般格式为:
sfr16 特殊功能寄存器名=地址常数
地址常数范围:0x80~0xff。
例如(见reg51.h、reg52.h等文件):
sfr16 DPTR=0x82;
sfr16 T2=0xcc;
//含TL2和TH2
2019-11-20
13
几点说明:
1)定义特殊功能寄存器中的地址必须 在0x80~0xff范围内。
变量名1[=初值] [,变量名2[=初值]] [,…]
或
[存储类型] [存储区域]
数据类型
变量名1[=初值] [,变量名2[=初值]] [,…]
static unsigned char data i=0;
2019-11-20
24
2、 C51变量的存储类型
按照ANSI C,C语言的变量有4种存储类 型: (P71)
2019-11-20
28
补充:
函数的定义:函数功能的确立,包括制 定函数名、函数值类型、形参及其类型、 函数体等,是一个完整的、独立的函数 单位。
函数的声明:把函数的名字、函数类型 以及形参类型、个数和顺序通知编译系 统,以便在调用该函数时系统按此进行 对照检查。
2019-11-20
29
#include<stdio.h> void main() {
2019-11-20
19
4、 bit型位变量的定义
常说的位变量指的就是bit型位变量。 C51的bit型位变量定义的一般格式为:
[存储类型] bit 位变量名1[=初值] [,位变量名2[=初值]] [,…]
bit位变量被保存在RAM中的位寻址区域 例如: bit flag_run=0; static bit send_bit;
其它的语法规定、程序结构及程序 设计方法,都与ANSI C相同。
2019-11-20
4
2、 C语言编程的优势
在编程方面,使用C51较汇编语言有诸多 优势:
1)编程容易 2)容易实现复杂的数值计算 3)容易阅读与交流 4)容易调试与维护程序 5)容易实现模块化开发 6)程序可移植性好
2019-11-20
31
3、 C51变量的存储区域(P57)
变量的存储区属性是单片机扩展的概念, 非常重要,它涉及到6个新的关键字。
MCS-51单片机有四个存储空间,分成三 类,它们是片内RAM、片外RAM和ROM。
2019-11-20
32
表4.2 C51存储区与存储空间的对应关系
关键字
对应的存储空间及范围
data 片内RAM,直接寻址,低128字节
1)定义存储在data区域的动态unsigned char变量: unsigned char data sec=0, min=0, hou=0;
2)定义存储在data区域的静态unsigned char变量: static unsigned char data scan_code=0xfe;
3)定义存储在data区域的静态unsigned int变量:
地址常数范围:0x80~0xff。
特殊功能寄存器定义例子(见reg51.h、 reg52.h等文件):
sfr P0=0x80;
//定义P0寄存器
sfr P1=0x90;
//定义P1口寄存器
sfr PSW=0xd0; //定义PSW
sfr IE=0xa8;
//定义IE
2019-11-20
12
2、 16位特殊功能寄存器的定义
单片机应用技术
(C语言版)
第4章 C51程序设计入门
2019-11-20
1
第4章 单片机C语言及程序设计
目录
4.1 C51的基本数据类型 4.2 C51变量的存储区域 4.3 C51的运算符 4.4 数组
4.5 指针 4.6 结构 4.7 C51程序设计 4.8 函数的定义与调
用
2019-11-20
造类型(数组、结构体、共同体、枚 举)、指针类型和空类型
2019-11-20
8
在计算机中不能随意给一个变量赋任 意的值,因为变量在单片机的内存中要占 空间的,变量不同,所占的空间不同。
为了合理利用单片机的内存空间,在 编程时要设定合适的数据类型。
2019-11-20
9
表4-1 C51数据类型、长度和数值范围
int max(int,int);//对被调函数的声明 int A=13,B=3;定义外部变量 printf(“%d\n”,max(A,B)); } int max(int x,int y)//定义子函数 { int z; z=x>y?x:y; return(z); }
2019-11-20
30
(4)寄存器变量
2019-11-20
20
数据类型转换(p56)
1)自动转换 把赋值号右边的类型转换成左边的类型。 A: 实型赋予整型 B: 整型赋予实型 C: 字符型赋予整型 D: 整型赋予字符型
2019-11-20
21
2)强制转换 像ANSI C一样,通过强制类型转换的
方式进行转换。如: unsigned int b; float c;
b=(int)c;
2019-11-20
22
4.2 C51变量存储区域
1、 C51变量的定义 2、 C51变量的存储类型 3、 C51变量的存储区域 4、 C51变量定义举例 5、 C51变量的存储模式
2019一般格式为:
[存储类型] 数据类型 [存储区域]
2019-11-20
18
d、几点说明
1)用sbit定义的位变量,必须能够按位 操作,而不能够对无位操作功能的位定义位 变量。
2)用sbit定义位变量,必须放在函数外 面作为全局位变量,而不能在函数内部定义。
3)用sbit每次只能定义一个位变量。
4)用sbit定义的是一种绝对定位的位变 量(因为名字是与确定位地址对应的),具 有特定的意义,不能随便使用。
4字节 0~4294967295
有符号长整型 signed long 4字节 -2147483648~2147483647
浮点型
float
4字节 ±1.1755E-38~±3.40E+38
特殊功能寄 sfr
存器型
sfr16
1字节 0~255 2字节 0~65535
位类型
bit、sbit 1位 0或1
2019-11-20
16
b、特殊功能寄存器名带位号定义
定义格式为:
sbit 位变量名 = 特殊功能寄存器名^
位号常数
这里的位号常数为0~7。例如:
sbit P0_3=P0^3;
sbit P1_4=P1^4;
sbit OV=PSW^2; //定义PSW的第2位
sbit ES=IE^4;
//定义IE的第4位
2
本章内容完全是结合单片机来讲解,也 就是补充C语言在单片机方面的概念、数据 定义和函数定义等。
通过本章学习,使读者能够比较顺利地 编写C51程序。
2019-11-20
3
1、 C51概述
“C51”概念:把“单片机C语言” 称为“C51”,也称为“Keil C”。
用C51编写单片机程序,与用ANSI C 编写程序的不同之处是,需要根据单片 机存储器结构及内部资源,定义相应的 数据类型和变量。
寄存器(存储)变量:用register定义 的变量为寄存器变量。
寄存器变量存放在CPU的寄存器中,这种 变量处理速度快,但数目少。
C51中的寄存器变量: C51的编译器在编 译时,能够自动识别程序中使用频率高的变 量,并将其安排为寄存器变量,用户不用专 门声明,对C51无实际意义。
2019-11-20
特殊功能寄存器的位声明 一般格式为:
sbit 位变量名 = 位地址表达式 这里的位地址表达式有三种形式: 直接位地址 特殊功能寄存器名带位号 字节地址带位号
2019-11-20
15
a、用直接位地址定义位变量
定义特殊功能寄存器的位。例如: sbit P0_0=0x80; sbit P1_1=0x91; sbit RS0=0xd3; //定义PSW的第3位 sbit ET0=0xa9; //定义IE的第1位
2019-11-20
10
补充: C51特殊功能寄存器与位变量 的定义(P82)
主要内容
1、 8位特殊功能寄存器的定义 2、 16位特殊功能寄存器的定义 3、 sbit型位变量的定义 4、 bit型位变量的定义
2019-11-20
11
1、 8位特殊功能寄存器的定义
定义的一般格式为:
sfr 特殊功能寄存器名 = 地址常数
2019-11-20
17
c、寄存器地址带位号定义位变量
定义格式为: sbit 位变量名 = 特殊功能寄存器地址 ^位号常数 这里的位号常数同上,为0~7。例如: sbit P0_6=0x80^6; sbit P1_7=0x90^7; sbit OV=0xd0^2; //定义PSW的第2位 sbit ES=0xa8^4; //定义IE的第4位