单片机的程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;低字节跟着高字节;低字节地址用作 sfr16声明 的地址。如TL0、TH0。
这些类型不是标准的C语言,不能用指针进行访问
(2)存储器类型
51特点:ROM和RAM哈佛结构;SFR与RAM统一编 址。
针对存储空间的多样性,提出了修饰存储空间的修 饰符,用以指明所定义的变量应分配在什么样的存 储空间,如表5-2所示。
由此可见,使用存储器指针比通用指针效率要高,速度要快 。当然,存储器指针的使用不是很方便。只有在所指向目标 的存储空间明确并不会变化的情况下,才用它。
(5)函数
1)重入函数 在一个基本函数的基础上添加reentrant说明,从而使它具有重入特性
。如:
int calc (char i, int b) reentrant
(1)EQU:赋值。给变量标号赋予一个确定的数值。
TTY EQU 1080H
MOV DPTR,TTY
(2)DL:定义标号值(与EQU区别:可对同一标号多次赋值)
COUNT
DL
2300H
COUNT
DL
2300H+1
(3)DB:定义数据字节。把数据以字节数的形式存放在存储器 单元中。
MMM DB 0EH,0B1H,0BH,70H,5H,0A4H,1DH,14H (4)DW:定义数据字。按字的形式把数据存放在存储单元中。 (5)DS:定义存储区。从指定的地址单元开始,保留一定数量
5.3.3 C语言程序设计
1 顺序结构 2 选择结构
(1) if 语句 if 、if else及if else if else。
(2) switch-case 语句 3 循环结构
while、do while 及for 4 转移语句
goto、break、continue 和return。
5.3.4 80C51功能单元的C语言编程
(3)宏指令:用以代替汇编语言源程序中重 复使用的程序段的一种语句,汇编时产生相应 的目标代码。
3
汇编语言组成
汇编语言源程序是由汇编语句(即指令) 组成的。汇编语言一般由四部分组成。 其典型的汇编语句格式如下:
标号: 操作码 操作数
START: MOV
A,30H
;注释 ;A←(30H)
4
伪指令:P137
CLR C
MOV A, R3
RLC A MOV R3, A ;R3左移一位并送回
MOV A, R2
RLC A MOV R2, A ;R2左移一位并送回
MOV A, R6 ADDC A, R6 DA A MOV R6, A ;(R6)乘2+CY并调整后送回 MOV A, R5 ADDC A, R5 DA A MOV R5, A ;(R5)乘2+CY并调整后送回 MOV A, R4 ADDC A, R4 DA A MOV R4, A ;(R4)乘2+CY并调整后送回 DJNZ R7, LOOP AJMP MAIN END
存储单元。
BASE DS 100H
(6)ORG:汇编起始地址
(7)END:汇编结束
5
5.2 汇编语言程序设计
1.分析问题 2.确定算法 3.设计程序流程图 4.分配内存单元 5.编写汇编语言源程序 6.调试程序
6
设计方法:五种基本结构
5.2.1 顺序结构程序 5.2.2 选择结构程序 5.2.3 循环结构程序 5.2.4 子程序 5.2.5 中断服务程序
通过指明存储器类型,可将所定义 的变量存储在指定的存储区域中
内部RAM比外部RAM快的多。因此,应该把频繁使用的变量 放置在内部数据存储器中,把很少使用的变量放在外部数据 存储器中。
在变量的声明中,可以包括存储器类型和signed或unsigned 属性。如:
char data var1;
char code text[ ] = "ENTER PARAMETER";
(1)数字0~9的非压缩BCD码 +48(30H)即为ASCII码;
(2)查表法。
17
5.3 C语言及其程序设计
5.3.1 Keil C语言
1、概述
在Keil C语言的软件包中,包含①C51编译器,②A51宏汇编 器,③BL51连接/定位器,④LIB51库管理器
如图5-10所示
2、Keil C对ANSI C的扩展
int xdata *numtab; /* 指向xdata 区域的 int */
由于存储器类型在编译时已经确定,通用指针中用来表示存 储器类型的字节就不再需要了。
指向idata,data,bdata和pdata的存储器指针使用一个字节 来保存;
指向code和xdata的存储器指针用两个字节来保存。
(3)高级语言:高级语言是接近于人的自然 语言,面向过程而独立于机器的通用语言。
2
汇编语言指令类型P135
MCS-51单片机汇编语言,包含两类不同性质 的指令。
(1)基本指令:即指令系统中的指令。它们 都是机器能够执行的指令,每一条指令都有对 应的机器码。
(2)伪指令:汇编时用于控制汇编的指令。 它们都是机器不执行的指令,无机器码。
将多字节二进制数依次带进位左移到结果单元中。每 次左移后,结果单元内容*2+CY二十调整结果单 元内容。
如AAH=10101010B=1*2^7+0*2^6+1*2^5 +0*2^4+1*2^3+0*2^2+1*2^1+0*2^0,在相加的 过程中不断地进行二十调整,最终得170
在此相加过程中,不进行二十调整的后果是什么?仍
extern int func (int i, int j) large;
/* 修饰为大模式 */
4)中断服务程序
在函数声明时包括interrupt m,将把所声明的函数定义为一个中断服务程序。 其格式为:
viod 函数标识符(viod) interrupt m
其中,
m=0~31,
0对应于外部中断0;
11
开始 取数,A←(30H)
Y A←64H
A为负数? N
A=0? N
A←X+2
Fra Baidu bibliotek
A←|X|
存数,(31H)←A(30H) 结束
12
参考程序
13
LIBU5_3多字节二进制整数转换成压缩的BCD码
单字节二进制数转BCD码可用DIV指令除以64H (100)、除以0AH(10)的方法得到。但多字节二进 制数不行。
第五章 80C51单片机的程序设计
要点及重点:顺序结构程序、选择结构程 序、循环结构程序、子程序、中断服务程 序
1
5.1 概 述
按照语言的结构及其功能计算机语言可以分为 三种:
(1)机器语言:机器语言是用二进制代码0和 1表示指令和数据的最原始的程序设计语言。
(2)汇编语言:在汇编语言中,指令用助记 符表示,地址、操作数可用标号、符号地址及 字符等形式来描述。
一般情况下,应该使用SMALL模式。在定义变量时,最好要指定存储器 类型。只有当应用不可能在SMALL模式下操作时,才需要往上增加存储 模式。
(4)指针
C51编译器支持通用和存储器两种类型指针 1)通用指针 指针的声明和标准C语言一样。需要三个字节来存
储:第一个字节用是存储器类型,第二个字节是指 针的高字节,第三字节是指针的低字节。
(3)存储模式
在C51编译器中,可以在命令行用SMALL,COMPACT和LARGE参数定义 存储模式。存储模式决定了默认的存储器类型。
1)小(SMALL)模式 所有变量都默认定义在内部RAM中。与data类型定义变量等价。特点:
变量访问快速。问题:堆栈空间面临溢出。如果内部RAM能放下,则这 种模式最佳。 2)紧凑(COMPACT)模式 所有变量都默认存放在外部数据存储器的一页中。与pdata显式定义变 量等价。最多256字节的变量。不如SMALL模式高效,但比LARGE模式 要快。 3)大(LARGE)模式 所有的变量都默认在外部存储器(xdata)中。与xdata显式定义变量等 价。此数据访问类型比SMALL和COMPACT模式需要更多的代码。
char *s; /* string ptr */ int *numptr; /* int ptr */ 通用指针很方便,但是也很慢。在所指向目标的存
储空间不明确的情况下,它们用的最多。
2)存储器指针
在定义时要包含一个存储器类型说明。例如:
char data *str;
/* 指向data 区域的字符串 */
MAIN: LOOP:
ORG 0000H
AJMP MAIN
ORG 0030H MOV R3, #80H ;(R2R3)为双
;字节二进制数 MOV R2, #00H ;(R4R5R6)为
;转换完的压缩型BCD码
CLR A MOV R4, A ;R4清0 MOV R5, A ;R5清0 MOV R6, A ;R6清0 MOV R7, #10H ;计数初值
{
if (++interruptcnt == 4000) /* 计数到 4000 */
{
second++;
/* 秒计数器 */
interruptcnt = 0; /* 清除中断计数器 */
}
}
5.3.2 C与汇编的混合编程(简单介绍)
C语言编程与汇编语言编程各有所长。 使用C语言,开发速度快,可读性、可维护性、可
16
实验二:BCD码转换成ASCII码
将本人的班号学号以压缩 BCD码的形式由低到高存 放在50H开始的单元中, 如0805094101。将 0150H、4151H、 0952H、0553H、 0854H。然后编程将 50H~54H中压缩的BCD 码转换成ASCII码,并由 低到高存放在60H开始的 单元中。
{ int x;
x = table [i];
return (x * b);}
2)函数使用指定的寄存器组 using n
函数使用指定寄存器组的定义性说明如下:
viod 函数标识符(形参表)using n
其中 n=0~3为寄存器组号,对应51中的四个寄存器组。
3)函数使用指定的存储模式
存储模式为本函数的参数和局部变量指定的存储空间,在指定了存储模 式之后,该空间将再也不随编译模式而变。如:
1对应于定时器0中断;
2对应于外部中断1;
3对应于定时器1中断;
4对应于串行口中断;
其它为预留。
从定义中可以看出,中断的函数必须是无参数、无返回值的函数。如:
unsigned int interruptcnt; unsigned char second;
void timer0 (void) interrupt 1 using 2
unsigned long xdata array[100];
float idata x,y,z;
unsigned int pdata dimension;
unsigned char xdata vector[10][4][4];
char bdata flags;
如果在变量的定义中,没有包括存储器类型,将自动选用默 认的存储器类型。
(1)数据类型
ANSI C没有, 下面解释。
1)bit 类型。内部RAM16个位寻址区,最多只能声 明128个位变量。
2)sbit 类型。特殊功能寄存器SFR中的位,如PSW 的各位。
3)sfr 类型。特殊功能寄存器SFR。如PSW。 4)sfr16 类型。两个8位的SFR作为一个16位的SFR
移植性都好;
而使用汇编语言,则可以更为充分地利用芯片的软 、硬件资源,使得程序代码的执行效率高。
为了发挥C语言与汇编语言两种语言各自的优势, 希望能够实现它们的混合编程。
这一点特别适用于要求占用空间小、有严格时间限 制的子程序设计,这类子程序总是希望用汇编语言 来编写,然后由C 语言主程序来调用。
7
典型程序 七段码显示器
LIBU5_1查表程序
8
P226表7-1
9
让学生演示程序 LED1并解释
10
LIBU5_2
设X存在30H单元中,根据下式
X+2 X>0
Y = 100 X=0 求出Y值,将Y值存入31H单元。
∣X∣ X<0
解:根据数据的符号位判别该数的正负, 若最高位为0,再判别该数是否为0。程 序流程如下图所示。
为AAH,而非170D。
14
R2R3:待转换的二进制数。 R4R5R6:存放压缩的BCD码。
注意: 每一步CY均 有可能变化 此CY非彼CY
CY
R2
R3
R6*2+CY R6 DA
R5*2+CY R5 DA
循 环 n R4*2+CY 次
R4
DA
15
转换程序,如有时间学生上来演示BINBCD.ASM
这些类型不是标准的C语言,不能用指针进行访问
(2)存储器类型
51特点:ROM和RAM哈佛结构;SFR与RAM统一编 址。
针对存储空间的多样性,提出了修饰存储空间的修 饰符,用以指明所定义的变量应分配在什么样的存 储空间,如表5-2所示。
由此可见,使用存储器指针比通用指针效率要高,速度要快 。当然,存储器指针的使用不是很方便。只有在所指向目标 的存储空间明确并不会变化的情况下,才用它。
(5)函数
1)重入函数 在一个基本函数的基础上添加reentrant说明,从而使它具有重入特性
。如:
int calc (char i, int b) reentrant
(1)EQU:赋值。给变量标号赋予一个确定的数值。
TTY EQU 1080H
MOV DPTR,TTY
(2)DL:定义标号值(与EQU区别:可对同一标号多次赋值)
COUNT
DL
2300H
COUNT
DL
2300H+1
(3)DB:定义数据字节。把数据以字节数的形式存放在存储器 单元中。
MMM DB 0EH,0B1H,0BH,70H,5H,0A4H,1DH,14H (4)DW:定义数据字。按字的形式把数据存放在存储单元中。 (5)DS:定义存储区。从指定的地址单元开始,保留一定数量
5.3.3 C语言程序设计
1 顺序结构 2 选择结构
(1) if 语句 if 、if else及if else if else。
(2) switch-case 语句 3 循环结构
while、do while 及for 4 转移语句
goto、break、continue 和return。
5.3.4 80C51功能单元的C语言编程
(3)宏指令:用以代替汇编语言源程序中重 复使用的程序段的一种语句,汇编时产生相应 的目标代码。
3
汇编语言组成
汇编语言源程序是由汇编语句(即指令) 组成的。汇编语言一般由四部分组成。 其典型的汇编语句格式如下:
标号: 操作码 操作数
START: MOV
A,30H
;注释 ;A←(30H)
4
伪指令:P137
CLR C
MOV A, R3
RLC A MOV R3, A ;R3左移一位并送回
MOV A, R2
RLC A MOV R2, A ;R2左移一位并送回
MOV A, R6 ADDC A, R6 DA A MOV R6, A ;(R6)乘2+CY并调整后送回 MOV A, R5 ADDC A, R5 DA A MOV R5, A ;(R5)乘2+CY并调整后送回 MOV A, R4 ADDC A, R4 DA A MOV R4, A ;(R4)乘2+CY并调整后送回 DJNZ R7, LOOP AJMP MAIN END
存储单元。
BASE DS 100H
(6)ORG:汇编起始地址
(7)END:汇编结束
5
5.2 汇编语言程序设计
1.分析问题 2.确定算法 3.设计程序流程图 4.分配内存单元 5.编写汇编语言源程序 6.调试程序
6
设计方法:五种基本结构
5.2.1 顺序结构程序 5.2.2 选择结构程序 5.2.3 循环结构程序 5.2.4 子程序 5.2.5 中断服务程序
通过指明存储器类型,可将所定义 的变量存储在指定的存储区域中
内部RAM比外部RAM快的多。因此,应该把频繁使用的变量 放置在内部数据存储器中,把很少使用的变量放在外部数据 存储器中。
在变量的声明中,可以包括存储器类型和signed或unsigned 属性。如:
char data var1;
char code text[ ] = "ENTER PARAMETER";
(1)数字0~9的非压缩BCD码 +48(30H)即为ASCII码;
(2)查表法。
17
5.3 C语言及其程序设计
5.3.1 Keil C语言
1、概述
在Keil C语言的软件包中,包含①C51编译器,②A51宏汇编 器,③BL51连接/定位器,④LIB51库管理器
如图5-10所示
2、Keil C对ANSI C的扩展
int xdata *numtab; /* 指向xdata 区域的 int */
由于存储器类型在编译时已经确定,通用指针中用来表示存 储器类型的字节就不再需要了。
指向idata,data,bdata和pdata的存储器指针使用一个字节 来保存;
指向code和xdata的存储器指针用两个字节来保存。
(3)高级语言:高级语言是接近于人的自然 语言,面向过程而独立于机器的通用语言。
2
汇编语言指令类型P135
MCS-51单片机汇编语言,包含两类不同性质 的指令。
(1)基本指令:即指令系统中的指令。它们 都是机器能够执行的指令,每一条指令都有对 应的机器码。
(2)伪指令:汇编时用于控制汇编的指令。 它们都是机器不执行的指令,无机器码。
将多字节二进制数依次带进位左移到结果单元中。每 次左移后,结果单元内容*2+CY二十调整结果单 元内容。
如AAH=10101010B=1*2^7+0*2^6+1*2^5 +0*2^4+1*2^3+0*2^2+1*2^1+0*2^0,在相加的 过程中不断地进行二十调整,最终得170
在此相加过程中,不进行二十调整的后果是什么?仍
extern int func (int i, int j) large;
/* 修饰为大模式 */
4)中断服务程序
在函数声明时包括interrupt m,将把所声明的函数定义为一个中断服务程序。 其格式为:
viod 函数标识符(viod) interrupt m
其中,
m=0~31,
0对应于外部中断0;
11
开始 取数,A←(30H)
Y A←64H
A为负数? N
A=0? N
A←X+2
Fra Baidu bibliotek
A←|X|
存数,(31H)←A(30H) 结束
12
参考程序
13
LIBU5_3多字节二进制整数转换成压缩的BCD码
单字节二进制数转BCD码可用DIV指令除以64H (100)、除以0AH(10)的方法得到。但多字节二进 制数不行。
第五章 80C51单片机的程序设计
要点及重点:顺序结构程序、选择结构程 序、循环结构程序、子程序、中断服务程 序
1
5.1 概 述
按照语言的结构及其功能计算机语言可以分为 三种:
(1)机器语言:机器语言是用二进制代码0和 1表示指令和数据的最原始的程序设计语言。
(2)汇编语言:在汇编语言中,指令用助记 符表示,地址、操作数可用标号、符号地址及 字符等形式来描述。
一般情况下,应该使用SMALL模式。在定义变量时,最好要指定存储器 类型。只有当应用不可能在SMALL模式下操作时,才需要往上增加存储 模式。
(4)指针
C51编译器支持通用和存储器两种类型指针 1)通用指针 指针的声明和标准C语言一样。需要三个字节来存
储:第一个字节用是存储器类型,第二个字节是指 针的高字节,第三字节是指针的低字节。
(3)存储模式
在C51编译器中,可以在命令行用SMALL,COMPACT和LARGE参数定义 存储模式。存储模式决定了默认的存储器类型。
1)小(SMALL)模式 所有变量都默认定义在内部RAM中。与data类型定义变量等价。特点:
变量访问快速。问题:堆栈空间面临溢出。如果内部RAM能放下,则这 种模式最佳。 2)紧凑(COMPACT)模式 所有变量都默认存放在外部数据存储器的一页中。与pdata显式定义变 量等价。最多256字节的变量。不如SMALL模式高效,但比LARGE模式 要快。 3)大(LARGE)模式 所有的变量都默认在外部存储器(xdata)中。与xdata显式定义变量等 价。此数据访问类型比SMALL和COMPACT模式需要更多的代码。
char *s; /* string ptr */ int *numptr; /* int ptr */ 通用指针很方便,但是也很慢。在所指向目标的存
储空间不明确的情况下,它们用的最多。
2)存储器指针
在定义时要包含一个存储器类型说明。例如:
char data *str;
/* 指向data 区域的字符串 */
MAIN: LOOP:
ORG 0000H
AJMP MAIN
ORG 0030H MOV R3, #80H ;(R2R3)为双
;字节二进制数 MOV R2, #00H ;(R4R5R6)为
;转换完的压缩型BCD码
CLR A MOV R4, A ;R4清0 MOV R5, A ;R5清0 MOV R6, A ;R6清0 MOV R7, #10H ;计数初值
{
if (++interruptcnt == 4000) /* 计数到 4000 */
{
second++;
/* 秒计数器 */
interruptcnt = 0; /* 清除中断计数器 */
}
}
5.3.2 C与汇编的混合编程(简单介绍)
C语言编程与汇编语言编程各有所长。 使用C语言,开发速度快,可读性、可维护性、可
16
实验二:BCD码转换成ASCII码
将本人的班号学号以压缩 BCD码的形式由低到高存 放在50H开始的单元中, 如0805094101。将 0150H、4151H、 0952H、0553H、 0854H。然后编程将 50H~54H中压缩的BCD 码转换成ASCII码,并由 低到高存放在60H开始的 单元中。
{ int x;
x = table [i];
return (x * b);}
2)函数使用指定的寄存器组 using n
函数使用指定寄存器组的定义性说明如下:
viod 函数标识符(形参表)using n
其中 n=0~3为寄存器组号,对应51中的四个寄存器组。
3)函数使用指定的存储模式
存储模式为本函数的参数和局部变量指定的存储空间,在指定了存储模 式之后,该空间将再也不随编译模式而变。如:
1对应于定时器0中断;
2对应于外部中断1;
3对应于定时器1中断;
4对应于串行口中断;
其它为预留。
从定义中可以看出,中断的函数必须是无参数、无返回值的函数。如:
unsigned int interruptcnt; unsigned char second;
void timer0 (void) interrupt 1 using 2
unsigned long xdata array[100];
float idata x,y,z;
unsigned int pdata dimension;
unsigned char xdata vector[10][4][4];
char bdata flags;
如果在变量的定义中,没有包括存储器类型,将自动选用默 认的存储器类型。
(1)数据类型
ANSI C没有, 下面解释。
1)bit 类型。内部RAM16个位寻址区,最多只能声 明128个位变量。
2)sbit 类型。特殊功能寄存器SFR中的位,如PSW 的各位。
3)sfr 类型。特殊功能寄存器SFR。如PSW。 4)sfr16 类型。两个8位的SFR作为一个16位的SFR
移植性都好;
而使用汇编语言,则可以更为充分地利用芯片的软 、硬件资源,使得程序代码的执行效率高。
为了发挥C语言与汇编语言两种语言各自的优势, 希望能够实现它们的混合编程。
这一点特别适用于要求占用空间小、有严格时间限 制的子程序设计,这类子程序总是希望用汇编语言 来编写,然后由C 语言主程序来调用。
7
典型程序 七段码显示器
LIBU5_1查表程序
8
P226表7-1
9
让学生演示程序 LED1并解释
10
LIBU5_2
设X存在30H单元中,根据下式
X+2 X>0
Y = 100 X=0 求出Y值,将Y值存入31H单元。
∣X∣ X<0
解:根据数据的符号位判别该数的正负, 若最高位为0,再判别该数是否为0。程 序流程如下图所示。
为AAH,而非170D。
14
R2R3:待转换的二进制数。 R4R5R6:存放压缩的BCD码。
注意: 每一步CY均 有可能变化 此CY非彼CY
CY
R2
R3
R6*2+CY R6 DA
R5*2+CY R5 DA
循 环 n R4*2+CY 次
R4
DA
15
转换程序,如有时间学生上来演示BINBCD.ASM