单片机原理与应用-第2版-源代码1

更新时间:2023-09-20 18:45:01 阅读量: 医药卫生 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

例4-2 有两个4位压缩BCD码,分别存储在30H、31H和40H、41H单元,要求把两个BCD码数相加,结果送至51H、52H中(高位在前,低位在后)。

程序如下:

ORG 0000H CLR C MOV A,31H ADD A,41H DA A MOV 52H,A MOV A,30H ADDC A,40H DA A MOV 51H,A END

;CY清0 ;(31H)→A

;(31H)+(41H)→A ;对A进行十进制调整 ; (A)→52H ;(30H)→A

;(30H)+(40H)+CY→A ;对(A)进行十进制调整 ;(A)→51H

例4-3 求双字节有符号数的补码。 参考程序如下:

CMPT2: MOV

JNB MOV MOV CPL MOV MOV CPL ADD MOV CLR ADDC MOV MOV MOV

EXT: RET

A,R7

ACC.7,EXT C,ACC.7 F0,C A R7,A A,R6 A A,#1 R6,A A A,R7 C,F0 ACC.7,C R7,A

;取高字节数

;(A)>0,不需要转换 ;符号位暂存→F0 ;(A)取反

;取低字节数

;加1

;存储数的补码(低字节)

;取符号位送入C ;恢复符号位 ;存储数的补码(高字节)

例4-4 求分段函数的值。分段函数定义如下:

FENFUC: MOV

CJNE AJMP NZEAR: JB ADD AJMP POSI: MOV NEGT: MOV RET

A,30H

A,#00H,NZEAR NEGT ACC.7,POSI A,#1 NEGT

A,#81H 31H,A

;取数据X至A

;判断A不等于0跳转 ;A等于0

;判断符号位,A<1跳转 ;A>0,Y=X+1 ;X<0时,Y=-1 ;保存结果

例4-5 根据寄存器R2的内容,转向各个处理程序PRGx(x=0~n)。

(R2)=0,转PRG0 (R2)=1,转PRG1

(R2)=n,转PRGn

程序如下:

JMP8: MOV DPTR,#TAB

;转移表首地址送DPTR

MOV A,R2 ADD A,R2 MOV R3,A CLR A ADDC A,DPH MOV DPH,A MOV A,R3

JMP @A+DPTR TAB: AJMP PRG0 AJMP PRG1 AJMP PRGn

;分支转移参数送A ;分支转移参数乘2 ;结果的低字节存入R3

;结果的高字节数据加到DPH中

;分支转移选择

;多分支转移表

例4-6 根据31H(高字节)、30H(低字节)的内容(分支转移参数)转向不同的处理程序。程序如下:

JMP4: MOV DPTR,#TAB1 MOV A,30H MOV B,#3 MUL AB MOV R3,A MOV A,B ADD A,DPH MOV DPH,A MOV A,31H MOV B,#3 MUL AB

ADD A,DPH MOV DPH,A MOV A,R3 JMP @A+DPTR TAB1: LJMP PRG0 LJMP PRG1 LJMP PRGn

;分支转移表首地址送DPTR ;分支转移参数低字节送A ;参数低字节乘3 ;乘积低字节送R3 ;乘积高字节送A ;DPH+高字节内容 ;参数高字节送A并乘3

;DPH+乘积低字节内容 ;和送DPH ;参数低字节送A ;跳相应的分支

;分支转移表

例4-7 设有一串字符,依次存储在内部RAM从30H单元开始的连续单元中,该字符串以0FFH为结束标志,要求编程测试字符串长度。

参考程序如下:

MOV R0,#0FFH ;计数器初值送R0 MOV R1,#2FH ;字符串指针初值送R1 NEXT: INC R0 INC R1 CJNE @R1,#0FFH,NEXT ;比较不相等循环 RET

例4-8 设8051使用12 MHz晶振,试设计延迟100 ms的延时程序。 可用双重循环方法写出如下的延时程序:

DELAY:MOV R2,#200 ;延时一个机器周期T = 1 ?s LOOP1:MOV B,#250 ;每循环延时1 ?s LOOP2:DJNZ B,LOOP2 ;250×2×1us =500 ?s

DJNZ R2,LOOP1 ;500×200×1 ?s = 100 ms RET

可修改程序:

DELAY: MOV R2,#200 ;延时一个机器周期T = 1 ?s LOOPS: MOV B,#248 ;每循环延时1 ?s NOP ;每循环延时1 ?s DJNZ B,$ ;248×2×1us =496 ?s DJNZ R2,LOOPS ;(496+2+2)×200×1 ?s RET ;[(496+2+2)×200+1+2]×1 ?s =100.003 ms

例4-9 编写一个通用子程序,实现N个单字节无符号数之和(N <100H,存储在2FH单元)。调用该子程序完成将片内30H~5FH中存储的单字节无符号数求和,结果存入60H、61H单元中(高位在前)。

子程序如下:

ORG 0100H SUB2: PUSH PSW ;保护现场 MOV @R1,#0 ;目的单元清0 INC R1 MOV @R1,#0 LOOP: MOV A,@R0 ;取数 ADD A,@R1 ;求和 MOV @R1,A ;存和的低字节数 DEC R1 ;修改指针,指向和的高位地址 CLR A ADDC A,@R1 ;取进位位 MOV @R1,A ;存和的高字节数 INC R1 ;修改指针,指向和的低位地址 INC R0 ;修改指针,指向下一个单元 DJNZ R2,LOOP POP PSW ;恢复现场 RET

主程序如下:

ORG 0000

MAIN: MOV R0,#2FH ;设置R0为入口指针,指向2FH单元 MOV R1,#60H ;设置R1为出口指针,指向60H单元 MOV A,@R0 MOV R2,A ;取传递字节数→R2 INC R0 ACALL SUB2 END

例4-10 单字节有符号数的加减法子程序。 程序设计如下:

START: ADR3: SUB1: ADD1:

ORG

JNB ACALL SJMP ACALL AJMP MOV CPL MOV MOV ACALL MOV

0000

F0,ADR3 SUB1 EXQ ADD1 EXQ A,R3 ACC.7 R3,A A,R3 CMPT R3,A

;判断标志F0=0跳转到ADR3做加法

;否则F0=1,做减法,调用减法子程序

;调用加法子程序

;程序结束,原地踏步

;符号位取反,即相当于把减号变为加号

;调用CMPT单字节求补码子程序

MOV ACALL ADD JB ACALL MOV RET END

A,R2 CMPT A,R3 OV,OVER CMPT R7,A

;调用CMPT单字节求补码子程序

;判断运算是否产生溢出

;调用CMPT单字节求补码子程序,将结果转换成原

;保存结果值

OVER: EXQ:

例4-11 4字节无符号数加法程序设计。 程序如下:

MADD: MOV R0,#DATA1 MOV R1,#DATA2 MOV R2,#04H CLR C LOOP: MOV A,@R0 ADDC A,@R1 ;带进位加法 MOV @R0,A INC R0 INC R1 DJNZ R2,LOOP JC OTHER ;最高字节有进位,转其他程序处理 RET

例4-12 4位BCD码的减法程序设计。 程序设计如下:

SUBCD: EXQ:

ORG MOV MOV CLR ACALL MOV ACALL MOV SJMP MOV SUBB ADD DA CPL INC INC RET END

0000H R0,#30H R1,#40H C SUBCD 50H,A SUBCD 51H,A EXQ A,#9AH A,@R1 A,@R0 A C R0 R1

;R0指向被减数首地址(低位) ;R1指向减数首地址(低位) ;进位符号位清0

;调用BCD码减法子程序 ;调用BCD码减法子程序

;BCD码减法子程序

;十进制调整 ;进位符号位取反

例4-13 编写程序实现“1+2+3+…+99”加法运算,结果BCD码的千、百位存储在31H单元,十、个位存储在30H单元。

程序如下:

ADDM:

MOV 30H,#00 MOV 31H,#00 MOV R2,#99

;存储单元清0 ;控制循环次数

LOOP: MOV MOV ADD DA MOV CLR ADDC DA MOV MOV ADD DA MOV DJNZ RET

R3,#01 A,30H A,R3 A 30H,A A

A,31H A 31H,A A,R3 A,#01 A R3,A R2,LOOP

;加数初值

;取累加和的低字节 ;十进制调整

;存储累加和的低字节 ;取累加和的高字节 ;十进制调整

;存储累加和的高字节 ;调整加数自加1 ;十进制调整 ;存储加数

例4-14 设片内RAM有两个数据段分别从地址DATA1和DATA2开始存储了N个数据,编写程序实现两个数据段中相同数据的个数统计,结果放入DATA中。

程序如下:

DATA

DATA1 DATA2 N LJEXP: LOOP1: LOOP2:

EQU 2FH EQU 30H EQU 50H EQU 10H MOV R0,#DATA1 MOV R1,#DATA2 MOV R2,#00H MOV R3,#N MOV A,@R0 XRL A,@R1 INC R0 INC R1 JNZ LOOP2 INC R2 DJNZ R3 LOOP1 MOV DATA,R2 RET

;统计结果存储单元 ;DATA1数据段 ;DATA2数据段 ;数据长度

;比较数据 ;调整指针 ;不相同调整

;相同,计数器加1 ;保存统计个数

例4-15 试编程实现以下逻辑运算:Q?X?Y?Y?Z,其中,Q为P1.0,X为P1.1,Y为P1.2,Z为P1.3。程序如下:

START: Q BIT P1.0 X BIT P1.1 Y BIT P1.2 Z BIT P1.3 MOV C,X ANL C,Y MOV F0,C MOV C,Y ANL C,/Z ORL C,F0 MOV Q,C END ;X·Y ;保存X·Y的值 ;Y·Z ;X·Y+Y·Z ;保存结果

例4-16 单字节二进制码转换为BCD码。

本文来源:https://www.bwwdw.com/article/257h.html

Top