资源描述
例4.1(顺序结构)被加数存于片内RAM的32H、31H、30H单元,加数存于片内RAM的35H、34H、33H单元相加之和存于片内RAM的32H、31H、30H单元,进位存于片内RAM的00H单元。程序如下:
START: MOV R0, #30H
MOV R1, #33H
MOV A, @R0
ADD A, @R1
MOV @R0, A
INC R0
INC R1
MOV A, @R0
ADDC A, @R1
MOV @R0, A
INC R0
INC R1
MOV A, @R0
ADDC A, @R1
MOV @R0, A
CLR A
ADDC A, #00H
MOV 00H, A
RET
例4.2(分支结构)假定在片外RAM的2000H、2001H、2002H这3个连续单元中,2000H和2001H单元存放着两个无符号数。要求找出两个无符号数中较大者,并存放于2002H单元。程序如下:
ORG 0100H
START: CLR C
MOV DPTR, #2000H
MOVX A, @DPTR
MOV R2, A
INC DPTR
MOVX A, @DPTR
SUBB A, R2
JNC LOOP1
XCH A, R2
LOOP0: INC DPTR
MOVX @DPTR, A
RET
LOOP1: MOVX A, @DPTR
SJMP LOOP0
例4.5两个多字节数的减法。
设有2个n字节无符号数,分别存放在片内的ram单元中,低字节在前,高字节在后。
CLR C
MOV R2,#N
LOOP:MOV A,@R0
SUBB A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,LOOP
RET
例4.3(循环结构)将片内RAM的20H单元为起始地址的数据串(最长为32 Bytes),传送到外部RAM的2000H单元为首地址的区域,直到发现“$”字符的ASCⅡ码为止。程序如下:
START: MOV R0, #20H
MOV DPTR, #2000H
MOV R7, #32
LOOP0: MOV A, @R0
XRL A, #24H
JZ LOOP1
MOV A, @R0
MOVX @DPTR, A
INC R0
INC DPTR
DJNZ R7, LOOP0
LOOP1: RET
例4.7假设被乘数放在r6和r7中,乘数放在r4和r5中,求乘积放于40H~43H单元中,低字节在前。
ORG 30H
MUL16:MOV R0,#40H
MOV A,R6
MOV B,R4
MUL AB
MOV @R0,A
MOV R3,B
MOV A,R7
MOV B, R4
MUL AB
ADD A,R3
MOV R3,A
MOV A,#0
ADDC A,B
MOV R2,A
MOV A,R6
MOV B,R5
MUL AB
ADD A,R3
INC R0
MOV @R0,A
MOV R1,#0
MOV A,.R2
ADDC A,B
MOV R2,A
JNC NEXT
INC R1
NEXT: MOV A,R7
MOV B,R5
MUL AB
ADD A,R2
INC R0
MOV A,B
ADDC A,R1
INC R0
MOV @R0,A
RET
例5.5将89s51的P1口设置成数据输入口,外围设备每准备好一个数据时,发出一个选通信号,经D触发器74LS74送给单片机引脚INT1,通知cpu进行处理。编写主程序和中断服务程序。
主程序:
ORG 0000H
LJMP MAIN
ORG 0013H
LJMP INT1
ORG 0030H
MAIN: CLR IT1
SETB EA
SETB EX1
MOV DPTR,#1000H
……
终端服务程序:
ORG 0200H
INT1:PUSH PSW
PUSH ACC
CLR P3.0
NOP
NOP
SETB P3.0
MOV A, P1
MOVX @DPTR, A
INC DPTR
……
POP ACC
POP PSW
TETI
中断和查询相结合的多外部中断源系统
主程序:
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INSER
MAIN:MOV R1,#0FFH
SETB IT0
SETB EX0
SETB EA
HERE:AJMP HERE
外部中断0的中断服务程序:
INSER:JNB P1.1 ,L1
CLR P1.0
L1: JNB P1.3 ,L2
CLR P1.2
L2: JNB P1.5 ,L3
CLR P1.4
L3: JNB P1.7 ,L4
CLR P1.6
L4: RETI
例4.4(加法)设有两个4字节的二进制数,分别存放在片内以30H和50H为起始地址的单元中(先存放低字节)。求两个数的和,并将结果存入以30H为起始地址的单元中。如下:
ORG 800H
JAZ: MOV R0, #30H
MOV R1, #50H
MOV R2, #4
LCALL JAFA
JC OVER
MOV 34H, #00H
SJMP HERE
OVER: MOV 34H,#01H
HERE: SJMP HERE
ORG 1000H
JAFA: CLR C
JAADD:MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,JAADD
RET
定时程序:
单循环定时程序:
MOV R7, #time
LOOP: NOP
NOP
DJNZ R7, LOOP
RET
NOP指令的机器周期为1,DJNZ指令的机器周期为2,则一次循环共4个机器周期。如果单片机的晶振频率为6MHz,则一个机器周期是2μS,所以一次循环的延迟时间为8μS。定时程序的延迟时间是循环程序段执行时间的整数倍,该程序的延迟时间为8×time(μS)。这个程序的最长延迟时间为2048μS。
较长时间的定时程序:
MOV R7, #time1
LOOP1:MOV R6, #time2
LOOP2: NOP
NOP
DJNZ R6, LOOP2
DJNZ R7, LOOP1
RET
为了加长定时时间,通常采用多重循环的方法。如下面的双重循环定时程序,最长可延时262914个机器周期,即525828μS或大约526mS(设晶振频率为6MHz)。
例4.8(除法运算程序:采用“左移被除数相除法”)假设被除数存放于40H、41H单元中,除数存放于44H、45H单元中,要求将商存放于40H、41H单元中,余数存放于42H、43H单元中,低字节在前。48H、49H作为暂存单元。双字节除法程序如下:
DIV16: MOV R0,#40H
MOV A,@R0
JNZ LOOP0
INC R0
MOV A, @R0
JNZ LOOP0
CLR A
MOV 42H,A
MOV 43H,A
RET
LOOP0: MOV R0,#44H
MOV A, @R0
JNZ LOOP1
INC R0
MOV A, @R0
JNZ LOOP1
RET
LOOP1: CLR A
MOV 42H, A
MOV 43H, A
MOV R6, #16
LOOP2: CLR C
MOV R3. #4
MOV R0, #40H
LOOP3: MOV A, @R0
RLC A
MOV @R0, A
INC R0
DJNZ R3, LOOP3
MOV R0, #42H
MOV R1, #44H
MOV A, @R0
CLR C
SUBB A, @R1
MOV 48H, A
INC R0
INC R1
MOV A, @R0
SUBB A, @R1
MOV 49H, A
JC LOOP4
MOV R0, #42H
MOV R1, #48H
MOV A, @R1
MOV @R0, A
INC R0
INC R1
MOV A, @R1
MOV @R0, A
MOV A, 40H
INC A
MOV 40H, A
LOOP4: DJNZ R2, LOOP2
RET
十六进制数转换成ASCII码的程序
例4.9 在片内RAM 20H单元中,存放有2位十六进制数,将其转换成ASCII码,并存放于21H和22H两个单元中。程序如下。
MOV SP, #3FH
TRAN: PUSH 20H
LCALL HASC
POP 21H
SWAP A
PUSH ACC
LCALL HASC ;
POP 22H
RET
HASC: DEC SP
DEC SP
POP ACC
ANL A, #0FH
ADD A, #7
MOVC A, @A+PC
PUSH ACC
INC SP
INC SP
RET
ASCTAB: DB '0123456789ABCDEF’
ASCII码转换十六进制数的程序
例4.10 将片外RAM 30H~3FH单元中的ASCII码依次转换成十六进制数,并存入片内RAM的60H~67H单元中。
程序如下:
TRANST: MOV R0, #30H
MOV R1, #60H
MOV R7, #8
LOOP1: LCALL TRAN
SWAP A
MOV @R1, A
INC R0
LCALL TRAN
XCHD A, @R1
INC R0
INC R1
DJNZ R7, LOOP1
RET
TRAN: CLR C
MOVX A, @R0
SUBB A, #30H
CJNE A, #10
SJMP LOOP3
LOOP2: JC DONE
LOOP3: SUBB A, #7
DONE: RET
已知单片机 的 fosc =12MHz,分别设计延时0.1s、1s、1min的子程序。
设晶振频率为12MHz,一个机器周期为1µs,
延时0.1秒
DELAY:MOV R7,#250
LOOP1:MOV R6,#100
LOOP2:NOP
NOP
NOP
DJNZ R6,LOOP2
DJNZ R7,LOOP1
RET
延时1秒
DELAY1: MOV R5,#10
DL: ACALL DELAY
DJNZ R5,DL
RET
延时1分钟
DELAY2: MOV R4,60
DL1: ACALL DELAY1
DJNZ R4,DL1
RET
定时器计数器T0对外部脉冲信号计数,每100个脉冲后T0转为定时器工作模式。定时1ms,又转为计数器工作模式,如此循环。假定单片机的晶振频率6MHz,请使用工作方式1实现。
ORG 0000H
AJMP MAIN
ORG 000BH
LJMP PTOJ
ORG 0100H
MAIN:MOV TMOD,#05H
MOV TH0,#FFH
MOV TL0,#9CH
CLR F0
SETB TR0
SETB ET0
SETB EA
HERE:AJMP HERE
PTOJ:JB F0,PTOD
MOV TMOD,#01H
MOV TH0,#FEH
MOV TL0,#0CH
SETB F0
RETI
PTOD:CLR 0
MOV TMOD,#05H
MOV TH0,#FFH
MOV TL0,#9CH
RETI
END
RAM内以data开始区域存放10个单字节的十进制数,求其累加和,并将结果存入sum和sum+1单元
ORG 2000H
START: MOV R0,#DATA
MOV R2,#10
MOV SUM+1,#00H
CLR C
CLR A
LOOP: ADDC A,@R0
DA A
MOV SUM ,A
JNC NEXT
MOV A,SUM+1
ADD A,#1
DA A
MOV SUM+1,A
NEXT: INC R0
DJNZ R2, LOOP
SJMP
某系统有3个外部中断源,分别为中断源1,中断源2,中断源3。当某一中断源变低电平时即要求cpu处理,优先级顺序高到底是3,2,1,中断源服务程序入口地址为2100h,2200h,2300h,编写主程序和中断服务程序。
ORG 0000H
AJMP MAIN
ORG 0003H
LJMP PINT0
ORG 0100H
MAIN: SETB IT0
SETB EX0
SETB EA
HERE: SJMP HERE
PINT0: PUSH PSW
PUSH A
JNB P1.3 , IR3
JNB P1.2 , IR2
JNB P1.1 , IR1
PINTIR: POP A
POP PSW
RET I
IR3: LJMP IR3INT
IR2: LJMP IR2INT
IR1: LJMP IR1INT
ORG 2100H
IR3INT: LJMP PINTIR
ORG 2200H
IR2INT: LJMP PINTIR
ORG 2300H
IR1INT: LJMP PINTIR
END
89S51和ADC0809接口电路。假如我们要从A/D芯片模拟通道IN0~0N7每隔1秒读入一个数据,并将数据存入地址0080H~0087H的外部数据存储器。是设计程序。
MOV R0 , #A0H
MOV R2 , #0FH
MOV DPTR , #FEF8H
MOV R, #08H
LOOP1: MOVX @DPTR, A
CALL DELAY
MOVX A ,@DPTR
MOVX @R0,A
INC DPTR
INC R0
DEC R2
CJNE R2,#00H,LOOP1
MOV DPTR , #0087H
LOOP2: MOVX A,@R0
MOVX @DPTR A
DEC DPTR
DEC R1
DEC R0
CJNE R1,#00H,LOOP2
编写汇编程序使内存ram的20H~4fH单元的数据按降序排列。
ORG 1000H
SUB: MOV R7,#30H
DEC R7
LP0: CLR F0
MOV R0,#20H
MOV R1,#21H
MOV A,R7
MOV R6,A
LP1: MOV B,@R0
MOV A,@R1
CJNE A,B NEXT
SJMP NCH
NEXT: JC NCH
SETB F0
MOV @R0,A
MOV @R1,B
NVH:INC R0
INC R1
DJNZ R6 ,LP1
JNB F0,EXIT
DJNE,R0,LP0
EXIT:RET
例6.1 设单片机的晶振频率为=12MHz,要求在P1.0引脚上输出周期为2ms的方波。
(1) 用定时器/计数器T1的定时工作方式1编程,采用中断方式。
ORG 0000H
AJMP START
ORG 001BH
AJMP T1INT
ORG 0030H
START: MOV SP, #60H
MOV TMOD, #10H
MOV TH1, #0FCH MOV TL1, #18H SETB TR1 SETB ET1 SETB EA
MAIN: AJMP MAIN
T1INT: CPL P1.0 MOV TH1, #0FCH MOV TL1, #18H RETI
(1)锯齿波的D/A转换程序:
ORG 2000H
START:MOV DPTR,#7FFFH
MOV A,#00H
LOOP: MOVX @DPTR,A
ACALL DELAY2ms
INC A
SJMP LOOP
(2)三角波
START: MOV DPTR, #7FFFH
STR1: MOV R6, #00H
STR2: MOV A, R6
MOVXX @DPTR,A
INC R6
CJNE R6, #0FFH,STR2
STR3: DEC R6
MOV A,R6
MOVX @DPTR, A
CJNE R6, #00H,STR3
AJMP STR1
(3)矩形波
START: MOV DPTR,#7FFFH
LOOP1: MOV A,#DATAL
MOVX @DPTR, A
ACALL DELAYL
MOV AA, #DATAH
MOVX @DPTR, A
ACALL DELAYH
AJMP LOOP1
(4)梯形波
START: MOV DPTR,#7FFFH
L1: MOV A, #DATAL-1
UP: INC A
MOVX @DPTR, A
CJNE A,#DATAH, L3
L3: JC UP
L2 LCALL DELAY
DOWN: DEC A
MOVX @DPTR, A
CJNE A, #DATAL,L4
L4: JNC DOWN
SJMP L1
例7.1 用并行输入8位移位寄存器74HC165扩展16位并行输入口。编程实现从16位扩展口读入20个字节数据,并把它们转存到内部RAM的50H~63H中。
MOV R7,#20
MOV R0,#50H
SETB F0
RCV0: CLR P1.0
SETB P1.0
RCV1: MOV SCON,#10H
JNB RI,$
CLR RI
MOV A,SBUF
INC R0
CPL F0
JB F0,RCV2
DEC R7
SJMP RCV1
RCV2: DJNZ R7,RCV0
… … … …
例3 单片机串行口按双工方式收发ASCII字符,最高位用来作奇偶校验位,采用奇校验方式,要求传送的波特率为1200bps,编写有关的通信程序。
解:
主程序:
MOV TMOD,#20H
MOV TL1,#0F3H
MOV TH1, #0F3H
SETB TR1
MOV SCON,#50H
MOV R0,#20H
MOV R1,#40H
ACALL SOUT
SETB ES
SETB EA
LOOP:SJMP $
主程序:
MOV TMOD,#20H
MOV TL1,#0F3H
MOV TH1, #0F3H
SETB TR1
MOV SCON,#50H
MOV R0,#20H
MOV R1,#40H
ACALL SOUT
SETB ES
SETB EA
LOOP:SJMP $
中断服务程序如下:
ORG 0023H
AJMP SBR1
ORG 0100H
SBR1: JNB RI,SEND
ACALL SIN
SJMP NEXT
SEND:ACALL SOUT
NEXT:RETI
发送子程序:
SOUT: CLR TI
MOV A,@R0
MOV C,P
CPL C
MOV ACC.7,C
INC R0
MOV SBUF,A
RET
接收子程序:
SIN: CLR RI
MOV A,SBUF
MOV C,P
CPL C
ANL A,#7FH
MOV @R1,A
INC R1
RET
展开阅读全文