第4章 89C51单片机的C51程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.2 C51程序设计基础
表4-6 常用语句
序号 1 2 3 4 5 6 7 8 语句 = if 表达式1 ? 表达式2 : 表达式3 switch/case while do-while for 函数 含义 赋值语句 条件语句 条件运算符 多分支语句 循环语句 循环语句 循环语句 模块化程序设计
单片机原理及应用
第4章 C51程序设计
本章学习内容:
1.C51存储类型
2.特殊功能寄存器的C51定义
3.绝对地址单元的C51访问
4.集成开发环境uVision2
4.1 C51程序设计语言概述
4.1 C51程序设计语言概述
有三类 机器语言:
用二进制代码表示的指令,也是CPU唯一能够接受的指令形式. 如:MOV A,R0;机器语言(机器码)为:1110_1000b MOV R1,A;机器码为:1111_1001b
可位寻址片内数据存储器(16字节,128位) 允许位和字节混合访问 间接寻址片内数据存储器(256字节) 分页寻址片外数据存储器(256字节) 可访问片内全部RAM空间 对应MOVX @R0访问
4.2 C51程序设计基础
C51存储类型定义举例:
unsigned char data x,y,z; /*在内部RAM区定义了3个无符号字节型变量x,y,z*/
4.2 C51程序设计基础
4.2.4 C51运算符与常用语句
表4-2 算术运算符 序号 1 2 3 4 5 6 7 算术运算符 + * / ++ -% 含义 加法 减法 乘法 除法(或求模) 自加 自减 求余
4.2 C51程序设Байду номын сангаас基础
表4-3 关系运算符
序号 1 2 3 4 5 6
关系运算符 > >= < <= = = !=
4.2.3绝对地址单元的C51访问
unsigned char data rval; //定义变量rval,位于内部数据存储器 rval=CBYTE[0x0002]; //将程序存贮器的0002H地址单元的值赋给rval rval=DBYTE [0x32]; //将内部数据存储器的32H地址单元的值赋给rval rval=XBYTE [0x0002]; //将外部数据存储器的0004H地址单元的值赋给rval
为了在C51程序中能够直接访问位于内部数据存储器中 的21字节SFR以及其中11字节可位选址的位,C51语言提供 了与标准C语言不兼容的定义方法,扩充了关键字“sfr”和 “sbit”,利用这种扩充的关键字可以在C51程序中直接操作 21字节的特殊功能寄存器和11字节可位寻址的位。
特殊功能寄存器的定义方法: sfr 特殊功能寄存器名 = 地址常数;
4.1 C51程序设计语言概述 C51设计单片机的好处:
1.降低学习难度,仅需要掌握存储器接口; 2.打破不同单片机之间的界限; 3.程序可读性强、可移植性强、开发效率高。
是否存在不好之处?
1.生成机器语言代码冗余,占用较多程序存储单元; 2.程序的执行效率不高,导致运行速度慢 。 1.单片机的程序存储器做得越来越大、越来越便宜。 2.单片机的主频越来越高,现在51单片机很多都可以做到
例如:sfr P0 = 0x80; /*定义P0口地址为80H*/
4.2 C51程序设计基础
特殊功能寄存器中可位寻址位的定义有三种方法:
方法一:sbit 位变量名 = 位地址常数; 例如:sbit OV = 0xD2; 方法二:sbit 位变量名 = 特殊功能寄存器名^位位置; /*必须先用sfr定义特殊功能寄存器名*/ 例如:sfr PSW = 0xD0; sbit CY = PSW^7; 方法三:sbit 位变量名 = 特殊功能寄存器地址^位位置; 例如:sbit P10 = 0x90^0;
4.3 C51程序举例
例2:设变量x以无符号单字节数形式存放在内部RAM 30H单 元,函数y与x有如下关系,试编制程序,根据x的大小求出y并 放回原单元。
当x 100 x y 0 x 20 当x 100 x 49 当x100
#include <absacc.h> #define uchar unsigned char void main(void) { uchar data x,y; x = DBYTE[0x30]; if(x==100) y=0x20; else if(x<100) y=x; else y=x-49 DBYTE[0x30] = y; while(1); }
4.3 C51程序举例
例1:设变量放在片内RAM 20H单元,其取值范围为0-5,要 求编制一段程序,查出变量的平方值,并放入片内RAM 21H单 元。 分析:该例需要掌握如何访问一个指定地址的存储单元。 // #include <reg51.h> case 2 : #include <absacc.h> DBYTE[0x21]=table[2]; break; #define uchar unsigned char case 3 : void main(void) DBYTE[0x21]=table[3]; break; { case 4 : uchar number; DBYTE[0x21]=table[4]; break; uchar code table[6]={0,1,4,9,16,25}; case 5 : number = DBYTE[0x20]; DBYTE[0x21]=table[5]; break; switch(number) default : break; } { case 0 : while(1); DBYTE[0x21]=table[0];break; } case 1 : DBYTE[0x21]=table[1]; break;
含义 大于 大于等于 小于 小于等于 等于 不等于
4.2 C51程序设计基础
表4-4 逻辑运算符 序号 1 2 3 逻辑运算符 && || ! 含义 逻辑与 逻辑或 逻辑非 表4-5 位运算符 序号 1 2 3 4 5 6 位运算符 & | ^ ~ << >> 含义 按位与 按位或 按位异或 取反 左移 右移
4.2 C51程序设计基础
说明:
1.C51编译器里头文件“absacc.h”定义有多个地址指针,包 括CBYTE、DBYTE、PBYTE、XBYTE、CWORD、DWORD、PWORD、 XWORD,可以通过单元地址直接访问程序存储器、内部数据存 储器、分页寻址外部数据存储器、外部数据存储器。 2.使用这些指针之前,必须要在程序中增加一条包含指令 “#include<absacc.h>”。
4.3 C51程序举例
例5:假定有两个无符号二进制数分别存放于内部RAM 40H和 41H单元,编写程序求这两个数的和,并将和存放在42H单元。 #include <absacc.h> #define uchar unsigned char uchar SUM(uchar x1, uchar x2); void main(void) { uchar number1; uchar number2; uchar val; number1 = DBYTE[0x40]; number2 = DBYTE[0x41]; val = SUM(number1,number2); DBYTE[0x42] = val; uchar SUM(uchar x1, uchar x2) while(1); {uchar x; } x= x1+x2; return x;}
4.3 C51程序举例
// #include <reg51.h> #include <absacc.h> #define uchar unsigned char void main(void) { uchar number; uchar code table[6]={0,1,4,9,16,25}; number = DBYTE[0x20]; DBYTE[0x20]=table[number]; while(1); }
unsigned int data i,j,k; /*在内部RAM区定义了3个无符号整型变量i,j,k*/
unsigned char code pfb[10] = {0,1,4,9,16,25,36,49,64,81} /*在程序存储器里定义了10字节的常量数组*/
4.2 C51程序设计基础 4.2.2 特殊功能寄存器的C51定义
4.2 C51程序设计基础
表4-6 常用语句
序号 1 2 3 4 5 6 7 8 语句 = if 表达式1 ? 表达式2 : 表达式3 switch/case while do-while for 函数 含义 赋值语句 条件语句 条件运算符 多分支语句 循环语句 循环语句 循环语句 模块化程序设计
4.3 C51程序举例
例3:试编写程序,将片内RAM 50H和51H单元两个无符号单 字节数中较小的数存放到60H单元。
#include <absacc.h> #define uchar unsigned char void main(void) { uchar data x,y; x=DBYTE[0x50]; y=DBYTE[0x51]; if(x<y) DBYTE[0x60] = x; else DBYTE[0x60]=y; while(1); } #include <absacc.h> #define uchar unsigned char void main(void) { uchar data x,y; x=DBYTE[0x50]; y=DBYTE[0x51]; DBYTE[0x60] =x<y?x:y; while(1); }
40M/80M/100M,而且还有很多是单周期的。
4.2 C51程序设计基础
4.2.1 C51变量/常量存储类型
C51存储类型 data xdata code bdata idata pdata 对应89C51单片机存储器空间 直接寻址片内数据存储器(128字节) 片外数据存储器(64K字节) 程序存储器(64K字节) 说明 访问速度快 对应MOVX @DPTR访问 对应MOVC @DPTR访问
4.3 C51程序举例
例6:假定P1口连接有8只共阴极发光二极管,试编写程序,以 1秒为间隔,依次选环点亮每只发光管。 #include <reg51.h> #define uchar unsigned char void delay1s(void); void delay1s(void) void main(void) {uchar data x,y,z; {uchar data temp,j; for (x=0;x<100;x++) while(1) for(y=0;y<100;y++) {temp=1; {z++;} for(j=0;j<8;j++) } {P1=temp; temp= temp<<1; delay1s(); }; } }
机器语言(Machine Language) 汇编语言 (Assemble) 高级语言 (High Level Language)
汇编语言:
汇编语言就是用助记符表示的指令,与机器语言指令一一对应。
如:两个寄存器相加汇编语言指令:ADD A,R0
C51语言:
语法同标准C语言。开发效率高,可读性强,是目前使用最为广泛的单 片机开发语言。一条C语言通常需要由多条机器语言组成。
4.2 C51程序设计基础
说明: 1.我们并不需要动手使用sfr和sbit定义每一个特殊功能寄存器 和位,因为在C51编译器里提供了一个“reg51.h”的头文件, 在该头文件里已经定义好所有特殊功能寄存器和可寻址位 2.只要在程序开始处增加一条包含指令“#include <reg51.h>”
4.2 C51程序设计基础
4.3 C51程序举例
例4:把外部数据RAM中从地址2000H单元开始的100个有符号 数逐一取出,若为正数则放回原单元,若为负数则求补后放回。
#include <absacc.h> #define uchar unsigned char #define uint unsigned char void main(void) { uchar data numb = 0; uchar data i; uint data xadd = 0x2000; for (i=0; i<100; i++) { if(XBYTE[xadd]<0) { numb=(~XBYTE[xadd])+1; XBYTE[xadd] = numb; } xddr++; } }