第4章_2 (第8次课)MCS-51的C语言应用程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C51扩展的若干关键字一览表
数据结构定义举例
unsigned char data system_status = 0;
初值为零 变量名为system_status 片内直接寻址RAM区 无符号字符型
自动型源自文库
//定义system_status为无符号字符型自动变量,该变量位于data区 中且初值为0。
C-51数据的存储类型
存储器类型 code data
bdata idata pdata xdata
描
述
程序存储区(64KB),由操作码 MOVC @A+DPTR 访问
直接寻址的内部数据存储区,访问变量速度最快 (128 Byte)
可“位寻址”的内部数据存储区,允许位与字节混 合访问(16 Byte) 间接寻址的内部数据存储区,可访问全部内部地址 空间(256 Byte) MOV @Ri 分页(256Byte)外部数据存储区,由操作码MOVX @Ri 访问 外部数据存储区(64KB),由操作码 MOVX @DPTR 访问
第4(2)章 MCS-51 C语言应用程序设计
(以Keil C为平台)
C-51简介
C语言作为一种非常方便的语言而得到广泛的支持,
C语言程序本身不依赖于机器硬件系统,基本上不 作修改就可将程序从不同的单片机中移植过来。 C提供了很多数学函数并支持浮点运算,开发效率 高,故可缩短开发时间,增加程序可读性和可维护 性。
D0^5
F0
D0^4
D0^3
D0^2
D0^1 D1H
D0^0
D0H
相对位地址 D0H 字节地址 绝对位地址
D2H
sbit用于定义具有位地址的SFR变量,共有三种定义方法:
1)将SFR的绝对位地址定义为位变量名
sbit
bit_name = 位地址常数; 例如, sbit CY = 0xD7; 2)将SFR的相对位地址定义为位变量名
C-51的程序结构
与一般C语言的结构相同,以main()函数为程序人 口,程序体中包含若干语句还可以包含若干函数。
C-51的数据类型
常用的数据类型有:
位型 bit 1位 字符型 char 1字节 整型 int 2字节 长整型 long int 4字节 浮点型 float(IEEE-754) 4字节
sbit型 (针对SFR中可位寻址的位)
部分SFR具有“位”地址,如何将这些位地址与位变量关联起来?
PSW
D0^7
CY
AC
D0^6
AC
D0^5
F0
RS1
D0^4
RS1
D0^3
D0^2
D0^1
CY
F0
RS0
RS0
OV
F1
F1
D0^0
相对位地址 D0H 字节地址 绝对位地址
P
OV
P
D7H
D6H
D5H
D4H
变量定义举例
char data var; /*字符变量var定位在片内RAM区 char code msg[]="i love china";/*字符数组定位在程序存贮区*/
unsigned long xdata array[100];/* 无符号长 整型数组定位在片外RAM区,每 元素占4bytes*/ float idata x,y,z; /*实型变量x,y,z,定位在片内用 间址访问的内部RAM区*/ bit lock; /*位变量Lock定位在片内RAM可位寻址区*/ unsigned int pdata dimension; /* 无符号整型变量 dimension定位在分页的外部RAM区 */ unsigned char xdata vector [10][4][4] ; /* 无符号字符型三 维数组, 定位在片外RAM区*/ sfr P0=0x80; /*定义P0口,地址为80H*/ char bdata flags; /*字符变量flags定位在 可位寻址内部RAM区*/ sbit flag0=flags^0; /*定义flag0为flags.0
C51的指针
用来存放变量地址的变量——指针变量
C51指针变量也要先定义后使用,定义的一般形式如下:
数据类型【指向存储类型】*【自身存储类型】 变量名 其中,若省略第一个方括号,系统编译时将用指定存储类 型替代;若省略第二个方括号,则用默认存储类型替代。
可见,C51指针变量的两个问题: 1)指针变量自身位于哪个存储区域; 2)该指针的值指向的是哪个存储区域里的地址。
6. 由于具有方便的模块化编程技术,使已编好 程序可容量地植入新程序;
C51与标准C的相同之处: 语法规则、程序结构、编程方法 C51与标准C的差异之处: 数据结构(数据类型、存储模式)、中断处理
C51与标准C程序结构完全相同 ① 程序由函数组成(一个主函数,或 一个主函数和若干自定义函数); ② 利用预处理命令对变量或函数进行 集中定义或说明; ③ 函数和变量都需遵循先定义后使用 的基本原则; ④ 主函数中的所有语句执行完毕,则 程序结束。
sfr或sfr16型
sfr或sfr16用于定义特殊功能寄存器变量,语法规则如下:
sfr 或 sfr16 sfr_name = 字节地址常数;
例如,sfr P0 = 0x80; //定义P0口地址为80H sfr PCON = 0x87; //定义PCON地址为87H sfr16 DPTR=0x82; //定义DPTR的DPL地址为82H, DPH地址为83H
D3H
D2H
D1H
D0H
PSW
D0^7
3)将SFR的0~7位直接定义为位变量名
AC
D0^6
AC
CY
CY
D7H
例如, sbit CY = PSW^7; D3H D4H D5H
D6H
RS1 F1 ; P RS0 OV sbit bit_name = sfr_name ^ 位位置 F0 RS1 RS0 OV F1 P
unsigned char bdata status_byte; //定义status_byte为无符号字符型自动变量,该变量位于 bdata区
unsigned int code unit_id[2]={0x1234, 0x89ab}; //定义unit_id[2]为无符号整型自动变量,该变量位于 code区中,是长度为2的数组,且初值为0x1234和 0x89ab。 static char m, n; //定义m和n为2个位于data区中的有符号字符型静态变量。
用一条预处理命令#include <reg51.h>把这个头文件包含到C51程序中, 无需重定义即可直接使用它们的名称。
应用举例:
【存储种类】
数据类型
【存储类型】
变量名
51单片机的 三个逻辑存储空间: 片内数据存储器,片外数据存储器和程序存储器。
C51存储类型与存储空间的对应关系 共有6种存储类型
解:为便于理解,不妨用某假想具体值量化如下:
定义:unsigned
char idata a = ‘A’;
unsigned char idata * xdata ptr = &a;
C-51的运算符
与C语言基本相同:
+
> == &&
>= != ||
*
<
/
<=
(加 减 乘 除)
(大于 大于等于 小于 小于等于) (测试等于 测试不等于) 逻辑或 逻辑非 )
sbit
3)
bit_name = sfr字节地址 ^ 位位置; 例如, sbit CY = 0xD0^7;
sbit
bit_name = sfr字节地址 ^ 位位置; 例如, sbit CY = PSW^7; (事先定义sfr PSW = 0xD0;)
C51编译器在头文件“reg51.h”中定义了全部sfr/sfr16和sbit变量。
C51扩充数据类型:bit、sfr、sfr16、sbit 数组型 指针型
C51的变量
在程序执行过程中,数值可以发生改变的量称为变量。
变量名与存储单元地址相对应,变量值与存储单元的 内容相对应。
C51变量定义的四要素:
【存储种类】 数据类型 【存储类型】 变量名
(标准C)(标准C +C51) (C51)
储区的unsigned char (无符号字符型)变量。
例3 若ptr是指向idata存储区的指针变量,该存储区将以无 符号字符形式存放数据。要求ptr本身位于xdata存储区,值 是位于idata存储区里的unsigned char型自动变量a(初值为 ‘A’)的地址。试据此完成相应变量的定义及初始化。
C51的存储类型与存储空间对应关系表
较小应用系统
稍大应用系统 较大应用系统
【存储种类】
数据类型
【存储类型】
变量名
三种编译模式分别对应于三种缺省(默认)存储类型:
C51 编译器可根据当前采取的编译模式自动认定默认的 存储类型
【存储种类】
数据类型
【存储类型】 变量名
变量名可以由字母、数字和下划线三种字符组成,且第一个 字符必须为字母或下划线,变量名长度随编译系统而定。 变量名具有字母大小写的敏感性,如 SUM 和 sum 代表不同 的变量。 强调:头文件中定义的变量都是大写的,若程序采取小写变 量则需要重新定义。 变量名不得使用标准C语言和C51语言的关键字。
(标准C+C51)
括号项——可以缺省(但需有缺省值)
【存储种类】
数据类型
【存储类型】
变量名
共有四个说明符: 1、auto(自动型)——变量的作用范围在定义它的函数体或 语句块内。执行结束后,变量所占内存即被释放。 2、extern(外部型) ——在一个源文件中被定义为外部型 的变量,在其它源文件中需要通过extern说明方可使用。 3、static(静态型) ——利用static可使变量定义所在的函数 或语句块执行结束后,其分配的内存单元继续保留。 4、register(寄存器型) ——将变量对应的储存单元指定为 通用寄存器,以提高程序运行速度。
enum color{red=0, green, blue} i; for (i=red; i<=blue; i++)
C-51的函数
C-51的预处理
与C语言基本相同 #define,#include #ifdef (#ifndef), #else, #endif #if, #endif, #pragma
所有的bit变量放在MCS-51单片机的内部RAM存储区的位操 作数段。位寻址区域只有 16 字节长,所以最多声明 128个位 变量。 只能用data、bdata和idata(限可位操作的部分)存储类型。 不能声明bit类型的指针,不能声明bit类型的数组。 非法:bit *ptr; bit ware[5]
例1 unsigned char xdata * ptr; 解:若编译器默认的存储类型为data,则指针ptr自身被 存放在data区内,它是指向 xdata 存储区的无符号字符型
变量。
例2
unsigned char code * idata port;
解:指针port自身被存放在idata区内,它是指向 code 存
C-51与ASM-51相比,有如下优点: 1. 对单片机的指令系统不要求了解,仅要求对 8051 的存贮器结构有初步了解; 2. 寄存器分配、不同存贮器的寻址及数据类型 等细节可由编译器管理;
3. 程序有规范的结构,可分成不同的函数,这 种方式可使程序结构化;
4. 具有将可变的选择与特殊操作组合在一起的 能力,改善了程序的可读性; 5. 提供的库包含许多标准子程序,具有较强的 数据处理能力;
缺省存储种类为auto (自动)型变量
【存储种类】
数据类型
【存储类型】
变量名
标准C语言的数据类型
* 有符号数类型可以忽略signed标识符
C51扩充数据类型:bit、sfr、sfr16、sbit
bit 型
bit用于定义一个位变量,语法规则如下:
bit bit_name [= 常数0~1];
例如:bit door = 0 ; 变量且初值为0 //定义一个叫door的
!
(逻辑与
>>
& | ^ ~
<<
(位右移
(按位与 (按位异或
位左移)
按位或) 按位取反)
C-51的基本语句
与标准C语言基本相同:
if 选择语言
switch/case
while
多分支选择语言
循环语言
do-while
for
循环语言
循环语言
C-51的结构体、联合与枚举
与C语言基本相同
struct mepoint { unsigned char name[11]; unsigned char pressure; unsigned char temperature; } po1={ "firstpoint", 0x99, 0x64}; union f { float f; unsigned long ul; }; union f x;