1、明德、博学、求实、创新 2022年6月22日星期三11时26分22秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式四川师范大学成都学院四川师范大学成都学院腾讯微云:http:/ 2022年6月22日星期三11时26分23秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式课程教学内容课程教学内容绪绪 论论第第0章章 计算机的基础知识计算机的基础知识 第第1章章 单片机的硬件结构单片机的硬件结构-重点重点 第第2章章 单片机的指令系统单片机的指令系统-了解了解 第第3章章 单片机的汇编语言程序设计单片机的汇编语言程序设计-了解了解 第第4章章 单片机的单片机的C语言(语言(C51
2、语言)编程语言)编程-重点重点 第第5章章 单片机的输入、输出口单片机的输入、输出口-重点重点 第第6章章 单片机的中断系统单片机的中断系统-重点重点 第第7章章 单片机的定时器单片机的定时器/计数器计数器-重点重点 第第8章章 单片机的串行接口单片机的串行接口-重点重点 第第9章章 单片机总线与系统扩展单片机总线与系统扩展 第第10章章 单片机应用接口技术单片机应用接口技术 后面章节选择自学后面章节选择自学明德、博学、求实、创新 2022年6月22日星期三11时26分23秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式四川师范大学成都学院四川师范大学成都学院教师:刘教师:刘 强强C
3、51语言程序设计明德、博学、求实、创新 2022年6月22日星期三11时26分23秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式 现在几乎所有的单片机现在几乎所有的单片机都能用都能用C语言编程了,采用语言编程了,采用C语言编程确实能带来很多语言编程确实能带来很多好处,至少可读性比汇编好处,至少可读性比汇编语言强多了。语言强多了。明德、博学、求实、创新 2022年6月22日星期三11时26分23秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式C语言语言的基础知识不足的同学的基础知识不足的同学希望大家课后找时间补充希望大家课后找时间补充!希望同学们在实践中去学习和领悟希望同学
4、们在实践中去学习和领悟C语言语言!接下来我们来看接下来我们来看C51与与C的的不同之处!不同之处!明德、博学、求实、创新 2022年6月22日星期三11时26分23秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式单片机的单片机的C语言语言标准标准C语言语言单片机的单片机的C语言(语言(C51语言)语言)单片机的单片机的C是在标准是在标准C语言的基础上语言的基础上扩展扩展而成。而成。故我们仅需学习与单片机紧密关联的扩展部分,故我们仅需学习与单片机紧密关联的扩展部分,即可达到快速掌握即可达到快速掌握C51高级语言的目的。高级语言的目的。明德、博学、求实、创新 2022年6月22日星期三1
5、1时26分24秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式 “语言不是教出来的,而是学出来的语言不是教出来的,而是学出来的”。那么,那么,C51语言能力也类似:不是背语言能力也类似:不是背C语言语言“ 条文条文 ”背出来的背出来的,是读程序是读程序“ 读读 ”出来的,是编程序出来的,是编程序“ 编编 ”出来,是出来,是在做项目编程序、调试程序的实践中形成和提高的。在做项目编程序、调试程序的实践中形成和提高的。 学习学习C51语言,还必须读语言,还必须读C51源程序范文源程序范文:从范文:从范文中加深对中加深对语言法则语言法则的理解,认识并熟悉的理解,认识并熟悉语言元素、用语语言元
6、素、用语范例范例,理解语言和单片机硬件行为的关联,学习,理解语言和单片机硬件行为的关联,学习程序结程序结构构的组织(流程图设计),积累编程的通常技巧和算法。的组织(流程图设计),积累编程的通常技巧和算法。 尽量作到读懂人家的成熟的软件,尽量作到读懂人家的成熟的软件,领悟、总结、模领悟、总结、模仿和借鉴仿和借鉴,进一步作到能够根据自己实际的需要对成熟,进一步作到能够根据自己实际的需要对成熟的软件模块进行的软件模块进行仿写、借代、适配性修改、拼装仿写、借代、适配性修改、拼装,在编,在编程实践中逐步提高编程能力。程实践中逐步提高编程能力。引 言(深入软硬件底层,以达到知其然知之所以然。深入软硬件底层
7、,以达到知其然知之所以然。)明德、博学、求实、创新 2022年6月22日星期三11时26分24秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式一一、函数定义函数定义(一)函数的定义(一)函数的定义函数类型函数类型 函数名(形式参数表)函数名(形式参数表) reentrant interrupt m using n局部变量定义函数体 前面部件称为函数的首部,后面称为函数的尾部,格式说明: 1函数类型函数类型 函数类型说明了函数返回值的类型。函数类型说明了函数返回值的类型。 2函数名函数名 函数名是用户为自定义函数取的名字以便调用函数时使用。函数名是用户为自定义函数取的名字以便调用函数时
8、使用。 3形式参数表形式参数表 形式参数表用于列录在主调函数与被调用函数之间进行数据传递的形式形式参数表用于列录在主调函数与被调用函数之间进行数据传递的形式参数。参数。明德、博学、求实、创新 2022年6月22日星期三11时26分24秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式void delay02s(void) /一般函数定义一般函数定义 unsigned char i, j, k; for (i=20; i0; i-) for (j=20; j0; j-) for (k=230; k0; k-);void delay02s(unsigned char n) /带参数传递的函
9、数带参数传递的函数 unsigned char i, j, k; for (i=n; i0; i-) for (j=20; j0; j-) for (k=230; k0; k-);int max(int x, int y) /带参数传递和有返回值的函数带参数传递和有返回值的函数 int z; z=xy? x:y; return z;例例 程程明德、博学、求实、创新 2022年6月22日星期三11时26分24秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式unsigned int fac(unsigned int n) reentrant /递归调用必须设置为重置函数递归调用必须设置为
10、重置函数unsigned int result; if(n=0)result=1;elseresult=n*fac(n-1);return (result); void TIMER0_isr() interrupt 0 using 1 /中断函数中断函数count+;if(count=20) count=0;P2_0=!P2_0; /时间到反转电平时间到反转电平例例 程程明德、博学、求实、创新 2022年6月22日星期三11时26分24秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式extern int max(int x, int y);void main() int c; int
11、 x1=13, y1=-8; c=max(x1, y1); while(1); int max(int x, int y) int z; z=xy?x:y; return z;fun1.cfun2.c例例 程程明德、博学、求实、创新 2022年6月22日星期三11时26分24秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式extern unsigned int x;extern int max(int x, int y);void main() int c; int x1=x, y1=-8; c=max(x1, y1); while(1); unsigned int x=13;int
12、 max(int x, int y) int z; z=xy?x:y; return z;fun1.cfun2.c例例 程程明德、博学、求实、创新 2022年6月22日星期三11时26分24秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式 (一)普通变量定义的格式(一)普通变量定义的格式 存储类别存储类别 数据类型说明符数据类型说明符 存储器类型存储器类型 变量名变量名1=初值初值 , ; 在在C51中,变量在使用前必须对变量进行定义,指中,变量在使用前必须对变量进行定义,指出变量的数据类型和存储模式。以便编译系统为它分配出变量的数据类型和存储模式。以便编译系统为它分配相应的存储单元
13、。相应的存储单元。 二二、 C51的变量 此部分需要关注与此部分需要关注与标准标准C不同的地方!不同的地方!明德、博学、求实、创新 2022年6月22日星期三11时26分24秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式1、变量的变量的存储类别 存储类别存储类别指的是数据在内存中指的是数据在内存中存储的方式存储的方式。存储类。存储类别别具体有四种:具体有四种:-编译器默认为编译器默认为auto。 自动的(自动的(auto)静态的(静态的(static)寄存器的(寄存器的(register)外部的(外部的(extern) 在在 C语言中,存储的方式分为两大类:语言中,存储的方式分为两
14、大类: (1)静态存储:)静态存储:程序运行期间分配固定存储空间。程序运行期间分配固定存储空间。 (2)动态存储:)动态存储:程序运行期间根据需要动态分配存储空间。程序运行期间根据需要动态分配存储空间。明德、博学、求实、创新 2022年6月22日星期三11时26分24秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式数据类型数据类型长度长度值域值域bit1 位位0 或或 1signed char1 字节字节-128+127unsigned char1 字节字节0255signed int2 字节字节-32768+32867unsigned int2 字节字节065535signed l
15、ong4 字节字节-2147483648+2147483647unsigned long4 字节字节04294967295float4 字节字节1.176E-383.40E+38指针指针13 字节字节对象地址对象地址(物理地址物理地址)sbit1 位位0 或或 1sfr1 字节字节0255sfr162 字节字节0655352、数据类型说明符、数据类型说明符明德、博学、求实、创新 2022年6月22日星期三11时26分24秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式3 3、c51c51扩展的扩展的存储器类型存储器类型 -C51-C51特有特有存储类型存储类型寻址空间寻址空间数据长度
16、数据长度(bit)值域范围值域范围bdata片内可位寻址的片内可位寻址的RAM(20H2FH)10127data片内直接寻址片内直接寻址 RAM(007FH)80128idata片内间接寻址片内间接寻址 RAM(000FFH)80255pdata分页寻址片外分页寻址片外 RAM ( 0000H00FFH)80255xdata片外 RAM (64K) (0000H0FFFFH)16065535code片内、外统一编址片内、外统一编址ROM (64K) (0000H0FFFFH)16065535明德、博学、求实、创新 2022年6月22日星期三11时26分24秒 刘强 单击此处编辑母版标题样式单击
17、此处编辑母版标题样式存储器类型映射图databdatacode外部程外部程序空间序空间 60KB60KB内部内部4KB4KBEA=1EA=1外部外部4KB4KBEA=0EA=0外部数据外部数据存储器存储器64KB0FFFH0FFFH0000H0000H0000H0000H0FFFFH0FFFFH0FFFH0FFFH0000H0000H片内片内RAM(256B)片外片外RAM(64KB)0FFFFH0FFFFH1000H1000H片内、外片内、外ROM(64KB)特殊功能特殊功能寄存器寄存器SFR数据缓冲数据缓冲区区(普通(普通RAM区)区)80H80H00H00H1FH1FH20H20H2FH
18、2FH30H30H7FH7FH80H80H52子系列子系列才有的才有的扩展扩展RAM区区128B位地址区位地址区工作寄存器区工作寄存器区0FFH0FFH00FFH00FFHidataxdatapdata0FFH0FFH明德、博学、求实、创新 2022年6月22日星期三11时26分25秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式例例: 变量定义存储种类和存储器类型相关情况。变量定义存储种类和存储器类型相关情况。 unsigned char data varl; /在片内RAM中的data区定义无符号字符型变量Var1 unsigned int idata var2; /在片内RAM
19、中的idata区定义无符号整型变量Var2extern float xdata var3; /在片外RAM中的xdata区定义实型外部变量Var3 int code var4=5; /在在ROM空间空间定义整型变量var4并赋值4*/ unsigned char bdata var5; /在片内RAM中的bdata区定义可字节处理和位处理的定义可字节处理和位处理的无符号字符型变量var5明德、博学、求实、创新 2022年6月22日星期三11时26分25秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式思考思考 int i;内部数据存储器外部数据存储器程序存储器省略存储器类型关键字定义的
20、i被编译后会放在哪里?? ? ?明德、博学、求实、创新 2022年6月22日星期三11时26分25秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式三种存储模式 变量默认为data存储类型 小模式 变量默认为pdata存储类型 中模式 变量默认为xdata存储类型 大模式 缺省默认情况 (二)变量的(二)变量的存储模式存储模式 -C51特有特有 明德、博学、求实、创新 2022年6月22日星期三11时26分25秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式明德、博学、求实、创新 2022年6月22日星期三11时26分25秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题
21、样式(三)指针声明方式(三)指针声明方式 数据类型数据类型存储类型存储类型(指针指向位置指针指向位置)存储类型(指针存放位置指针存放位置) *变量名变量名 如:unsigned char xdata * data p1; 如:unsigned int xdata * data p2;l 指向idata、data和pdata的存储器指针用1个字节保存 l 指向code和xdata的存储器指针用2个字节保存 idata 、 bdata、data 、 pdata、xdataidata 、bdata、data、code、pdata、xdata明德、博学、求实、创新 2022年6月22日星期三11时26
22、分25秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式3个字节,通用型指针,未指明存储器空间个字节,通用型指针,未指明存储器空间unsigned char * point1;unsigned int * point2;2个字节,指向个字节,指向16位寻址的存储器空间位寻址的存储器空间 unsigned int code * point1; unsigned int xdata * point2;1个字节,指向个字节,指向8位寻址的存储器空间位寻址的存储器空间 unsigned char data * point1; unsigned char idata * point2; unsi
23、gned char pdata * point3; 采用指针的方法,可以实现在采用指针的方法,可以实现在C51程序中对任意程序中对任意指定的存储器单元进行访问。指定的存储器单元进行访问。明德、博学、求实、创新 2022年6月22日星期三11时26分25秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式显示指针与通用指针的对比显示指针与通用指针的对比 描述idata指针xdata指针通用指针C源程序源程序idata char *ip;char val;val = * ip;xdata char *xp;char val;val = *xp;char *p;char val;val = *
24、p;编译后的汇编代码编译后的汇编代码MOV R0, ipMOV val, R0MOV DPL, xp+1MOV DPH, xpMOVX A, DPTRMOV val, AMOV DPL, pMOV DPH, p+1MOV B, p+2LCALL _gptrget指针大小指针大小1字节字节2字节字节3字节字节代码长度代码长度4字节字节9字节字节11字节字节+库调用库调用执行时间执行时间4周期周期7周期周期远大于远大于13周期周期l 通用指针使用方便,但速度慢 l 显式指针效率高、速度快,但寻址范围小 明德、博学、求实、创新 2022年6月22日星期三11时26分25秒 刘强 单击此处编辑母版标题
25、样式单击此处编辑母版标题样式例例1: 通过指针实现绝对地址的访问。通过指针实现绝对地址的访问。typedef unsigned char uchar; /定义符号定义符号uchar为数据类型符为数据类型符unsigned chartypedef unsigned int uint; /定义符号定义符号uint为数据类型符为数据类型符unsigned intvoid main (void)uchar data *dp1; /定义一个指向定义一个指向data区的指针区的指针dp1uint xdata *dp2; /定义一个指向定义一个指向xdata区的指针区的指针dp2dp1=0 x30; /dp
26、1指针赋值,指向指针赋值,指向data区的区的30H单元单元dp2=0 x1000; /dp2指针赋值,指向指针赋值,指向xdata区的区的1000H单元单元*dp1=0 x55; /将数据将数据0 x55送到片外送到片外RAM30H单元单元*dp2=0 x1234; /将数据将数据0 x1234送到片外送到片外RAM1000H单元单元while(1);明德、博学、求实、创新 2022年6月22日星期三11时26分25秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式(二)特殊功能寄存器变量的定义(二)特殊功能寄存器变量的定义 -C51特有特有 定义后可实现定义后可实现C51C51中对
27、特殊功能寄存器中对特殊功能寄存器的访问的访问databdata特殊功能特殊功能寄存器寄存器sfr数据缓冲数据缓冲区区(普通(普通RAM区)区)80H80H00H00H1FH1FH20H20H2FH2FH30H30H7FH7FH80H80H0FFH0FFH52子系列子系列才有的才有的RAM区区位地址区位地址区工作寄存器区工作寄存器区0FFH0FFH0FFH0FFHidata片内片内RAM(256B)明德、博学、求实、创新 2022年6月22日星期三11时26分25秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式 MSC-51 系列包括多种寄存器,其中一些具有特殊功能,如定时器,端系列包
28、括多种寄存器,其中一些具有特殊功能,如定时器,端口的控制寄存器等,为了能够直接访问这些寄存器,口的控制寄存器等,为了能够直接访问这些寄存器,C51编译器提供了一种编译器提供了一种定义的自主形式,这是必要的,因为这些定义与标准定义的自主形式,这是必要的,因为这些定义与标准C语言是不兼容的。语言是不兼容的。 为了支持这些特殊功能寄存器(为了支持这些特殊功能寄存器(SFR)的声明,引入了关键词)的声明,引入了关键词“ sfr ”,语法如下:语法如下: sfr 特殊功能寄存器名特殊功能寄存器名=地址;地址; sfr16 特殊功能寄存器名特殊功能寄存器名=地址;地址; /定义定义8051的的8位寄存器位
29、寄存器: sfr P0=0 x80; /定义定义8051的状态字寄存器的状态字寄存器P0,地址为,地址为0X80。 sfr P1=0 x90; /定义定义8051的状态字寄存器的状态字寄存器P1,地址为,地址为0X90。 sfr PSW=0 xd0; /定义定义8051的状态字寄存器的状态字寄存器PSW,地址为,地址为0XD0。 sfr SCON=0 x98; /定义定义8051的串行控制寄存器的串行控制寄存器SCON,地址为,地址为0X98。 sfr TMOD=0 x89; /定义定义8051的定时器模式寄存器的定时器模式寄存器TMOD,地址为,地址为0X89。 /定义定义8051的其他的其
30、他16位寄存器位寄存器: sfr16 DPTR=0 x82; / sfr DPH=0X83 sfr DPL=0X82 (二)特殊功能寄存器变量的定义(二)特殊功能寄存器变量的定义 -C51特有特有 定义后可实现定义后可实现C51C51中对特殊功能寄存器中对特殊功能寄存器的访问的访问明德、博学、求实、创新 2022年6月22日星期三11时26分25秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式例:例:sfr P0=0X80;sfr P1=0X90;sfr16 DPTR=0X82;void main(void)P0=0X55;P1=0X66;DPTR=0X1234;while(1);可
31、以改成以下程序可以改成以下程序#includesfr16 DPTR=0X82;void main(void)P0=0X55;P1=0X66;DPTR=0X1234;while(1);大家可以看看书上后面的单片机的程序,一般都包含有大家可以看看书上后面的单片机的程序,一般都包含有#include明德、博学、求实、创新 2022年6月22日星期三11时26分25秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式(三)位变量的定义(三)位变量的定义 -C51特有特有 定以后实现定以后实现C51中对位地址中对位地址的访问的访问databdata特殊功能特殊功能寄存器寄存器sfr数据缓冲数据缓冲
32、区区(普通(普通RAM区)区)80H80H00H00H1FH1FH20H20H2FH2FH30H30H7FH7FH80H80H0FFH0FFH52子系列子系列才有的才有的RAM区区位地址区位地址区工作寄存器区工作寄存器区0FFH0FFH0FFH0FFHidata片内片内RAM(256B)明德、博学、求实、创新 2022年6月22日星期三11时26分25秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式低低128字节字节 RAM区区128个个高高128字节字节RAM区区(SFR区区) -83个个明德、博学、求实、创新 2022年6月22日星期三11时26分26秒 刘强 单击此处编辑母版标
33、题样式单击此处编辑母版标题样式 在在C51中,允许用户通过位类型符定义位变量。中,允许用户通过位类型符定义位变量。 位类型符有两位类型符有两个:个:bit 和和 sbit。可以定义两种位变量。可以定义两种位变量。(1) bit位类型符用于定义一般的可位处理位变量。位类型符用于定义一般的可位处理位变量。 格式格式: bit 位变量名;位变量名; 在格式中可以加上各种修饰,但注意存储器类型存储器类型只能是bdata、data、idata。只能是片内RAM的可位寻址区,严格来说只能是 bdata。例例: bit型变量的定义。型变量的定义。bit idata flag1; bit data flag2
34、; bit bdata flag3; bit pdata flag4; bit xdata flag5; bit *p bit string5 bit func(bit a1,bit a2) 可以定义函数可以定义函数明德、博学、求实、创新 2022年6月22日星期三11时26分26秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式例例1:void main(void)bit bdata flag1, flag2; flag1=0;flag2=1;while(1);例例2: bit bdata flag1, flag2; void main(void) flag1=0;flag2=1;w
35、hile(1);低低128字节字节 RAM区区128个个明德、博学、求实、创新 2022年6月22日星期三11时26分26秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式 在典型的在典型的8051单片机应用问题中,经常需要单独访问单片机应用问题中,经常需要单独访问SFR中的位,中的位,C51扩充功能使之成为可能,特殊位,象扩充功能使之成为可能,特殊位,象SFR一样,不一样,不与标准与标准C语言兼容,使用保留字语言兼容,使用保留字“sbit”可访问位寻址对象。可访问位寻址对象。 与与SFR声明一样,用保留字声明一样,用保留字“sbit”声明某些特殊位接受符号声明某些特殊位接受符号名,名
36、,“=”后语句将绝对值地址赋给变量名,这种地址分配有三后语句将绝对值地址赋给变量名,这种地址分配有三种方法:种方法:方法方法1: sbit 变量名变量名=sfr_nameint_constant 当字节是特殊功能寄存器的地址可用这个方法。当字节是特殊功能寄存器的地址可用这个方法。sfr_name必须是已定义的必须是已定义的SFR的名字,的名字,“”后的语句定义了基地址上的后的语句定义了基地址上的特殊位的位置,该位置必须是一个特殊位的位置,该位置必须是一个07的数。的数。例例1: sfr PSW=0 xD0; sbit OV= PSW2; sbit CY= PSW7;(2 2)sbitsbit位
37、类型符位类型符明德、博学、求实、创新 2022年6月22日星期三11时26分26秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式方法方法2: sbit 变量名变量名= int_constantint_constant 这种方法以一整常数作基地址,该值必须在这种方法以一整常数作基地址,该值必须在0 x800 xFF之间,并能之间,并能被被8整除,确定位的位置方法同上。整除,确定位的位置方法同上。例例2: sbit OV=0 xD02; sbit CV=0 xD07; 方法方法3: sbit 变量名变量名= int_constant -此方法最常用此方法最常用 这种方法是将位的绝对地址赋
38、给变量,地址必须位于这种方法是将位的绝对地址赋给变量,地址必须位于0 x800 xFF之间。之间。例例3: sbit OV=0 xD2; sbit CY=0 xD7; 特殊功能位代表了一个独立的声明类,它不能与其它声明和位域互换。特殊功能位代表了一个独立的声明类,它不能与其它声明和位域互换。明德、博学、求实、创新 2022年6月22日星期三11时26分26秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式高高128字节字节RAM区区(SFR区区) -83个个例:例: sbit P0_0=0 x80; sbit P0_0=0X800; sfr P0=0X80; sbit P0_0=P00
39、; void main(void) P0_0=0; P0_0=1; while(1); 方法一方法一方法二方法二方法三方法三明德、博学、求实、创新 2022年6月22日星期三11时26分26秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式低低128字节字节RAM区区128个个unsigned char bdata flag;sbit flag0=flag0; void main(void)flag=0 x55; flag0=1; while(1);-unsigned int bdata flag;sbit flag0=flag15; void main(void)flag=0 x55
40、; flag0=1; while(1); 注意:注意:在此区域不允许使用:在此区域不允许使用: sbit flag0=0 x20; 或或 sbit flag0=0 x240;明德、博学、求实、创新 2022年6月22日星期三11时26分26秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式三、三、 C51绝对地址的访问绝对地址的访问databdatacode外部程外部程序空间序空间 60K60K内部内部4K4KEA=1EA=1外部外部4K4KEA=0EA=0外部数据外部数据存储器存储器64KB0FFFH0FFFH0000H0000H0000H0000H0FFFFH0FFFFH0FFFH
41、0FFFH0000H0000H片内片内RAM(256B)片外片外RAM(64KB)0FFFFH0FFFFH1000H1000H0FFFFH0FFFFH片内、外片内、外ROM(64KB)特殊功能特殊功能寄存器寄存器sfr数据缓冲数据缓冲区区(普通(普通RAM区)区)80H80H00H00H1FH1FH20H20H2FH2FH30H30H7FH7FH80H80H0FFH0FFH52子系列子系列才有的才有的RAM区区位地址区位地址区工作寄存器区工作寄存器区0FFH0FFH0FFH0FFH00FFH00FFHidataxdatapdata明德、博学、求实、创新 2022年6月22日星期三11时26分2
42、6秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式 C51编译器提供了一组宏定义来对编译器提供了一组宏定义来对51系列单片机的系列单片机的code、data、pdata和和xdata空间进行绝对寻址。空间进行绝对寻址。 规定只能以无符号数方式访问,定义了规定只能以无符号数方式访问,定义了8个宏定义,其函数原型如下:个宏定义,其函数原型如下: #define CBYTE (unsigned char volatile code *) 0)#define DBYTE (unsigned char volatile data *) 0)#define PBYTE (unsigned cha
43、r volatile pdata *) 0)#define XBYTE (unsigned char volatile xdata *) 0)#define CWORD (unsigned int volatile code *) 0)#define DWORD (unsigned int volatile data *) 0)#define PWORD (unsigned int volatile pdata *) 0)#define XWORD (unsigned int volatile xdata *) 0) 这些函数原型放在这些函数原型放在absacc.h文件中。使用时须用预处理命令
44、把该头文件文件中。使用时须用预处理命令把该头文件包含到文件中,形式为:包含到文件中,形式为:#include 。(一)采用(一)采用C51中的预定义宏的方式访问中的预定义宏的方式访问 明德、博学、求实、创新 2022年6月22日星期三11时26分26秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式例例1:绝对地址对存储单元的访问:绝对地址对存储单元的访问#include /将绝对地址头文件包含在文件中将绝对地址头文件包含在文件中 typedef unsigned char uchar; typedef unsigned int uint; void main(void) uchar
45、var1; /定义变量定义变量var1 uint var2; /定义变量定义变量var2 var1=XBYTE0 x0005; /XBYTE0 x0005访问片外访问片外RAM的的0005字节单元字节单元 var2=XWORD0 x0002; / XWORD0 x0002实质是访问的是片外实质是访问的是片外RAM的的0002字单元字单元 DBYTE0 x30=0X55; XBYTE0 x0002=0X66; DWORD0 x40=0X1234; XWORD0 x0000=0X1234; while(1); 明德、博学、求实、创新 2022年6月22日星期三11时26分26秒 刘强 单击此处编辑
46、母版标题样式单击此处编辑母版标题样式(二)通过指针方式访问(二)通过指针方式访问3个字节,通用型指针,未指明存储器空间个字节,通用型指针,未指明存储器空间unsigned char * point1;unsigned int * point2;2个字节,指向个字节,指向16位寻址的存储器空间位寻址的存储器空间 unsigned int code * point1; unsigned int xdata * point2;1个字节,指向个字节,指向8位寻址的存储器空间位寻址的存储器空间 unsigned char data * point1; unsigned char idata * poin
47、t2; unsigned char pdata * point3; 采用指针的方法,可以实现在采用指针的方法,可以实现在C51程序中对任意程序中对任意指定的存储器单元进行访问。指定的存储器单元进行访问。明德、博学、求实、创新 2022年6月22日星期三11时26分26秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式例例1: 通过指针实现绝对地址的访问。通过指针实现绝对地址的访问。typedef unsigned char uchar; /定义符号定义符号uchar为数据类型符为数据类型符unsigned chartypedef unsigned int uint; /定义符号定义符号
48、uint为数据类型符为数据类型符unsigned intvoid main (void)uchar data *dp1; /定义一个指向定义一个指向data区的指针区的指针dp1uint xdata *dp2; /定义一个指向定义一个指向xdata区的指针区的指针dp2dp1=0 x30; /dp1指针赋值,指向指针赋值,指向data区的区的30H单元单元dp2=0 x1000; /dp2指针赋值,指向指针赋值,指向xdata区的区的1000H单元单元*dp1=0 x55; /将数据将数据0 x55送到片外送到片外RAM30H单元单元*dp2=0 x1234; /将数据将数据0 x1234送到
49、片外送到片外RAM1000H单元单元while(1);明德、博学、求实、创新 2022年6月22日星期三11时26分26秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式例例2: 通过指针实现绝对地址的访问。通过指针实现绝对地址的访问。typedef unsigned char uchar; typedef unsigned int uint; void main (void)uchar data x;uchar idata *p1; /定义一个指向定义一个指向idata区的指针区的指针p1p1=&x; /p1指针指向指针指向data区的区的x变量变量*p1=0 x55; /等价于给变
50、量等价于给变量x赋值赋值0 x55while(1);明德、博学、求实、创新 2022年6月22日星期三11时26分26秒 刘强 单击此处编辑母版标题样式单击此处编辑母版标题样式例例3: 通过指针实现绝对地址的访问。通过指针实现绝对地址的访问。typedef unsigned char uchar; typedef unsigned int uint; void main (void)uchar data x=9,y;uchar idata *p1; /定义一个指向定义一个指向idata区的指针区的指针p1p1=&x; /p1指针指向指针指向data区的区的x变量变量y=*p1; /执行完后执行