电子教案单片机原理与应用技术_单片机原理与应用技术
电子教案单片机原理与应用技术由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“单片机原理与应用技术”。
电子教案——单片机原理与应用技术
⒉ 计算机汇编
四.程序设计的基本方法 编写程序要求:
不仅要完成规定的功能任务,而且还要求:
执行速度快、占用内存少、条理清晰、阅读方便、便于移植、巧妙而实用。一般应按以下几个步骤进行:
⑴ 分析问题,确定算法或解题思路 ⑵ 画流程图 ⑶ 编写源程序 ⑷ 汇编和调试
§1-2 汇编语言程序设计举例
一.顺序程序
顺序程序是指按顺序依次执行的程序,也称为简单程序或直线程序。
顺序程序结构虽然比较简单,但也能完成一定的功能任务,是构成复杂程序的基础。
根据不同条件转向不同的处理程序,这种结构的程序称为分支程序。
80C51指令系统中的条件转移指令、比较转移指令和位转移指令,可以实现分支程序。【例】 已知16位二进制负数存放在R1R0中,试求其补码,并将结果存在R3R2中
解:二进制负数的求补方法可归结为“求反加1”,符号位不变。利用CPL指令实现求反;加1时,则应低8位先加1,高8位再加上低位的进位。注意这里不能用INC指令,因为INC指令不影响标志位。程序如下:
CONT:
MOV
A,R0;读低8位
CPL A;取反
ADD
A,#1;加1
MOV
R2,A;存低8位
MOV
A,R1;读高8位
CPL A;取反
ADDC
A,#80H;加进位及符号位
MOV
R3,A;存高8位
RET
;二.分支程序
根据不同条件转向不同的处理程序,这种结构的程序称为分支程序。
80C51指令系统中的条件转移指令、比较转移指令和位转移指令,可以实现分支程序。① S0单独按下,红灯亮,其余灯灭; ② S1单独按下,绿灯亮,其余灯灭; ③ 其余情况,黄灯亮。
解:程序如下
SGNL:ANL
P1,#11100011B;红绿黄灯灭
ORL
P1,#00000011B;置P1.0、P1.1输入态, P1.5~P1.7状态不变 SL0: JNB
P1.0,SL1
;P1.0=0,S0未按下,转判S1
JNB
P1.1,RED
;P1.0=1,S0按下;且P1.1=0,S1未按下,转红灯亮 YELW:SETB P1.4
;黄灯亮
CLR
P1.2
;红灯灭
CLR
P1.3
;绿灯灭
SJMP SL0
;转循环
SL1: JNB
P1.1,YELW
;P1.0=0,S0未按下;P1.1=0,S1未按下,转黄灯亮 GREN:SETB P1.3
;绿灯亮
CLR
P1.2
;红灯灭
CLR
P1.4
;黄灯灭
SJMP SL0
;转循环 RED: SETB P1.2
;红灯亮
CLR
P1.3
;绿灯灭
CLR
P1.4
;黄灯灭
SJMP SL0
;转循环
课堂练习题:
电路及灯亮灭要求同上述【例】题,其中
三.循环程序
循环程序一般包括以下几个部分:
⑴ 循环初值;
⑵ 循环体;
⑶ 循环修改;
⑷ 循环控制;
以上四部分可以有两种组织形式,其结构如图4-6所示.【例】 编制一个循环闪烁灯的程序。
设80C51单片机的P1口作为输出口,经驱动电路74LS240(8反相三态缓冲/驱动器)接8只发光二极管,如图4-8所示。当输出位为“1”时,发光二极管点亮,输出位为“0”时为暗。试编程实现:每个灯闪烁点亮10次,再转移到下一个灯闪烁点亮10次,循环不止。
解:程序如下:
FLASH:MOV
A,#01H;置灯亮初值 FSH0: MOV
R2,#0AH;置闪烁次数 FLOP: MOV
P1,A;点亮
LCALL DY1s;延时1s
MOV
P1,#00H;熄灭
LCALL DY1s;延时1s
DJNZ
R2,FLOP;闪烁10次
RL
A;左移一位
SJMP
FSH0;循环
RET
;【例】设Xi均为单字节数,并按顺序存放在以50H为首地址的内RAM存储单元中,数据长度(个数)N存在R2中,试编程求和S=X1+X2+‥‥+XN,并将S(双字节)存放在R3R4中,(设S<65536)。解:程序如下:
SXN: MOV
R2,#N
;置数据长度(循环次数)
MOV
R3,#00H ;和单元(高8位)清0
MOV
R4,#00H ;和单元(低8位)清0
MOV
R0,#50H ;求和数据区首址 LOOP:MOV
A,R4
;读前次低8位和
ADD
A,@R0 ;低8位累加
MOV
R4,A
;存低8位和
CLR
A;
ADDC
A,R3
;高8位加进位
MOV
R3,A
;存高8位和
INC
R0
;指向下一数据
循环修改
DJNZ
R2,LOOP ;判N个数据累加完否?
循环控制
RET
;退出循环
退出循环
【例】编写延时10ms子程序,fosc=12MHz。
解:fosc=12MHz,一个机器周期为。DY10ms:MOV R6,#20;置外循环次数 DLP1: MOV R7,#250;置内循环次数
DLP2: DJNZ R7,DLP2;2机周×250 =500机周DJNZ R6,DLP1;500机周×20= 10000机周RET
;说明:MOV Rn指令为1个机器周期;
DJNZ指令为2个机器周期;
RET指令为2个机器周期;{[(2机周×机周≈10ms 【课堂练习题】 按下列要求编写延时子程序: ⑴ 延时2ms,fosc=6MHz; ⑵ 延时5ms,fosc=12MHz; ⑶ 延时10s,fosc=12MHz;
设80C51单片机的P1口作为输出口,经驱动电路74LS240(8反相三态缓冲/驱动器)接8只发光二极管,如图4-8所示。当输出位为¡°1¡±时,发光二极管点亮,输出位为¡°0¡±时为暗。试编程实现:每个灯闪烁点亮10次,再转移到下一个灯闪烁点亮10次,循环不止。
FLASH:MOV
A,#01H;置灯亮初值 FSH0: MOV
R2,#0AH;置闪烁次数 FLOP: MOV
P1,A;点亮
LCALL DY1s;延时1s
MOV
P1,#00H;熄灭
LCALL DY1s;延时1s
DJNZ
R2,FLOP;闪烁10次
RL
A;左移一位
SJMP
FSH0;循环
RET
;
【课堂练习题】
根据图4-8电路,设计灯亮移位程序,要求8只发光二极管每次点亮一个,点亮时间为250ms,顺序是从下到上一个一个地循环点亮。设fosc=6MHz。
【例】已知P1口数据每隔10ms刷新一次,试求其1s内的平均值, 平均值存30H。解:本题需求100个数据的平均值,一般有两种方法:
一种是全部累加后再平均;
另一种是边平均边累加,现给出两种方法的程序。
AVRG1: MOV
R2,#0
;低8位累加寄存器清0
MOV
R3,#0
;高8位累加寄存器清0
MOV
R4,#100
;置平均次数 ALOP: MOV
A,P1;读P1口数据
ADD
A,R2;低8位累加
MOV
R2,A;回存
CLR
A;高8位与进位累加
ADDC
A,R3;
MOV
R3,A;回存
LCALL
DY10ms
;延时10ms
DJNZ
R4,ALOP;判100次累加完否?未完继续
MOV
A,R3;100次累加完,求平均值,被除数→A、B
MOV
B,R2;
MOV
R0,30H
;置商间址
MOV
R6,#0;置除数100,除数→R6R5
MOV
R5,#100;
LCALL
SUM;(A、B)÷(R6、R5)= 商 @R0, 余数A
CJNE
A,#50,NEXT;四舍五入 NEXT: JC GRET;C=1,<50, 舍
INC 30H;C=0,≥50, 入 GRET: RET;
AVRG2: MOV 30H,#0;商累加寄存器清0
MOV 31H,#0;余数累加寄存器清0
MOV R4,#100;置平均次数 ALOP: MOV A,P1;读P1口数据
MOV B,#100;置除数(平均次数)
DIV AB;P1口数据除以100
ADD A,30H;商累加
MOV
30H,A;回存
MOV
A,B;
ADD A,31H;余数累加
MOV 31H,A;回存
CLR C
;
SUBB A,#100;
JC GON;余数累加<100,余数累加寄存器不变
INC 30H;余数累加≥100, 商累加寄存器+1
MOV 31H,A;减去100后差→余数累加寄存器 GON: LCALL DY10ms;延时10ms
DJNZ R4,ALOP
;判100次累加完否?未完继续
MOV A,31H;100次累加完毕,余数累加四舍五入
CJNE A,#50,NEXT;NEXT: JC GRET;C=1,<50, 舍
INC 30H;C=0,≥50, 入 GRET: RET
;
【课堂练习题】
已知某单片机系统每隔20ms测一次温度,8位温度A/D值存在特殊功能寄存器SBUF中,试分别求其1s和1分内的平均值, 分别存30H和31H。
当用PC作基址寄存器时,其表格首地址与PC值间距不能超过256字节,且编程要事先计算好偏移量,比较麻烦。因此,一般情况下用DPTR作基址寄存器。解:编程如下:
CHAG:MOV
DPTR,#TABD;置共阴字段码表首址
MOV
A,30H
;读显示数字
MOVC A,@A+DPTR;查表,转换为显示字段码
MOV
30H,A
;存显示字段码
RET
;TABD:DB 3FH,06H,5BH,4FH,66H;0~4共阴字段码表
DB 6DH,7DH,07H,7FH,6FH;5~9共阴字段码表 四.查表程序
用于查表的指令有两条: ⑴
MOVC
A,@A+DPTR ⑵ MOVC
A,@A+PC 当用DPTR作基址寄存器时,查表的步骤分三步: ① 基址值(表格首地址)→DPTR;
② 变址值(表中要查的项与表格首地址之间的间隔字节数)→A; ③ 执行MOVC A,@A+DPTR。
当用PC作基址寄存器时,其表格首地址与PC值间距不能超过256字节,且编程要事先计算好偏移量,比较麻烦。因此,一般情况下用DPTR作基址寄存器。
【例】 在单片机应用系统中,常用LED数码管显示数码,但显示数字(≤9)与显示数字编码并不相同,需要将显示数字转换为显示字段码,通常是用查表的方法。现要求将30H中的显示数字转换为显示字段码并存入30H。已知共阴字段码表首址为TABD。解:编程如下:
CHAG:MOV
DPTR,#TABD;置共阴字段码表首址
MOV
A,30H
;读显示数字
MOVC A,@A+DPTR;查表,转换为显示字段码
MOV
30H,A
;存显示字段码
RET
;TABD:DB 3FH,06H,5BH,4FH,66H;0~4共
DB 6DH,7DH,07H,7FH,6FH;5~9共阴字段码表
【例】 用查表程序求0~40之间整数的立方。已知该整数存在内RAM 30H中,查得立方数存内RAM 30H(高8位)31H。已知立方表(双字节)首地址为TAB。解:编程如下:
CUBE: MOV
DPTR,#TAB;置立方表首址
MOV
A,30H
;读数据
ADD
A,30H
;数据×2→A
MOV
30H,A
;暂存立方表数据序号
MOVC A, @A+DPTR;读立方数据高8位
XCH
A,30H
;存立方数据高8位,立方表数据序号→A
INC
A
;指向立方数据低8位
MOVC A,@A+DPTR;读立方数据低8位
MOV
31H,A
;存立方数据低8位
RET
;TAB: DW 0,0,0,1,0,8,0,27,0,64;0~40立方表
DW 0,125,0,216,„,0FAH,00H;说明:数据×2→A原因是立方表数据为双字节 【课堂练习题】
已知8位显示数字已存入首址为30H的内RAM中,试将其转换为共阴显示字段码,存入首址为40H的内RAM中。五.散转程序
散转程序是一种并行多分支程序。【例】 单片机四则运算系统。
在单片机系统中设置四个运算命令键,它们的键号分别为0、1、2、3。当其中一个键按下时,进行相应的运算。操作数由P1口和P3口输入,运算结果仍由P1口和P3口输出。具体如下:P1口输入被加数、被减数、被乘数和被除数,输出运算结果的低8位或商;P3口输入加数、减数、乘数和除数,输出进位(借位)、运算结果的高8位或余数。键盘号已存放在30H中。解:程序如下:
PRGM: MOV
P1,#0FFH
;P1口置输入态
MOV
P3,#0FFH
;P3口置输入态
MOV
DPTR,#TBJ;置¡°+-×÷¡±表首地址
MOV
A,30H
;读键号
RL
A
;键号2→A
ADD
A,30H
;键号3→A
JMP
@A+DPTR
;散转
TBJ:
LJMP
PRGM0
;转PRGM0(加法)
LJMP
PRGM1
;转PRGM1(减法)
LJMP
PRGM3
;转PRGM3(除法)
LJMP
PRGM2
;转PRGM2(乘法)PRGM0: MOV
A,P1
;读加数
ADD
A,P3
;P1+P3
MOV
P1,A
;和→P1
CLR
A
;
ADDC
A,#00H
;进位→A
MOV
P3,A
;进位→P3
RET
;
PRGM1: MOV
A,P1
;读被减数
CLR
C
;
SUBB A,P3
;P1-P3
MOV
P1,A
;差→P1
CLR
A
;
RLC
A
;借位→A
MOV
P3,A
;借位→P3
RET
;PRGM2: MOV
A,P1
;读被乘数
MOV
B,P3
;置乘数
MUL
AB;P1×P3
MOV
P1,A;积低8位→P1
MOV
P3,B;积高8位→P3
RET;PRGM3: MOV
A,P1
;读被除数
MOV
B,P3
;置除数
DIV
AB;P1÷P3
MOV
P1,A
;商→P1
MOV
P3,B
;余数→P3
RET
;说明:由于LJMP为3字节指令,因此键号需先乘3,以便转到正确的位置。