单片微型计算机原理与接口技术
005A 500D JNC IOB4
005C E521 MOV A,21H .
005E F8 MOV R0,A ;存入中值
005F D0E0 LOB2:POP ACC ;恢复ACC和PSW 0061 D0D0 POP PSW 0063 22 RET
0064 E520 LOB3: MOV A,20H 0066 F8 MOV R0,A 0067 015F AJMP LOB2
0069 E522 LOB4: MOV A,22H
006B F8 MOV R0,A ;存入中值 006C 015F AJMP LOB2
执行结果为(RO)=56 H。
【4-21】根据8100 H单元中的值X,决定P1口引脚输出为:
加上必要的伪指令,并对源程序加以注释。 . 【答】程序如下: ORG 0000H SJMP BEGIN ORG 0030H
BEGIN: MOV DPTR,#8100H MOVX A,@DPTR MOV R2,A
JB ACC.7,SMALLER;有符号数<0 SJMP UNSIGNED ;无符号数≥0
SMALLER:DEC A ;X<0,输出-X(先减1,再取反) CPL A
MOV P1,A SJMP OK
UNSIGNED:CJNE A,#00H,BIGGER ;不等于0即大于0 MOV P1,#80H ;X等于0,输出80H SJMP OK
BIGGER: CLR C ;X大于0,输出A×2 RLC A ;A×2 MOV P1,A
OK: SJMP $ END
例如:输入55 H,P1口引脚输出AAH;输入00 H,P1口引脚输出80 H;输入F1(一1 5的补码),P1口引脚输出0FH。
【4-22】将4000 H~40FF H中256个ASCII码加上奇校验后从P1口依次输出。加上必要的伪指令,并对源程序加以注释。
【答】注意:ASCII码的有效位为7位,其最高位D7可与程序状态字PSW中的奇偶校验
31
单片微型计算机原理与接口技术
位P配合进行校验。 ORG 0000H SJMP BEGIN ORG 0030H
BEGIN:
MOV DPTR,#4000H ;首地址 MOV R0,#00H ;发送计数器 LOOP:
MOVX A,@DPTR MOV C,P CPL C
MOV ACC.7,C , ;置奇校验 MOV PI,A ;从PI口输出 INC DPTR
DJNZ R0,LOOP ;循环 AJMP $ END
【4-23】 编写将1 O位十六进制数转换为ASCII码的程序。假定十六进制数存放在内部RAM的20 H单元开始的区域中,转换得到的ASCII码存放在内存3O H单元开始的区域中。加上必要的伪指令,并对源程序加以注释。 【答】查表法: ORG 0000H SJMP BEGIN ORG 0030H
BEGIN: MOV R2,#5 ;10位十六进制数 MOV R0,#20H ;读指针 MOV RI,#30H ;写指针
MOV DPTR,#ASCTB ~ASCII码表首址 LOOP: MOV A,@R0 ‘ ANL A,#0FOH ;取高半字节 SWAP A
ACALL TRANS ;调用十六进制到ASCII码转换子程序 MOV A,@R0
ANL A,#0FH ;取低半字节
ACALL TRANS ;调用十六进制到ASCII码转换子程序 INC R0
DJNZ R2,LOOP
SJMP $ ;查表法子程序 . TRANS:
MOVC A,@A+DPTR ;取得ASCII码 MOV @R1,A INC R1 RET
ASCTB: ;ASCII码表
32
单片微型计算机原理与接口技术
DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H DB 41H,42H,43H,44H,45H,46H END 注意:十六进制数0~9所对应的ASCII码为30 H~39 H,十六进制数A~F所对应的ASCII码为41 H~46 H。 ,
例如:在20 H开始输入5个十六进制数:11 H,F4 H,F1 H,12 H,34 H。
执行程序后:内存3 0 H单元开始的区域中依次为31 H,31 H,46 H,34 H,46 H,31 H,31 H,32 H,33 H,34 H。 、
【4-24]80C51单片机的P1.7、P1.6和P 1.5输出的6拍波形如图4-3所示,后面输出波形重复,输出波形9O拍后停止。请编写源程序,并加以注释,并加上必要的伪指令。
【答】由图4-3分析,可以得到一个周期为6拍的波形表。 ORG 0000H
0000 802E SJMP BEGIN ORG 003 0H 0030 7860 BEGIN: MOV R0,#90 ;90拍波形计数器 0032 7906 LOOP2: MOV R1,#6 ;6拍波形计数器 0034 9 00047 MOV DPTR,#TAB 0037 E4 LOOPI: CLR A
0038 93 MOVC A,@A+DPTR ;查表得到输出波形值 0039 F59 0 MOV PI,A
003B E8 MOV A,R0 、;判断90拍波形输出结束? 003C 14 DEC A
003D F8 MOV R0,A
003E 6005 JZ STOP ;90拍波形输出完,则转停止输出 0040 A3 INC DPTR
0041 D9F4 DJNZ R1,LOOP1 ;6拍波形循环 0043 80ED SJMP L00P2
0045 80FE STOP:SJMP STOP
0047 E040A0 TAB:DB 0E0H,40H,0A0H,60H,0C0H,60H;6拍波形表 004A 60C060
END 【4-25】编写求无符号数最大值的子程序。入口条件:采样值存放在外部RAM的1000 H~100F H单元中。出口结果:求得的最大值存入内部RAM区的20 H单元中。对源程序加以注释和加上必要的伪指令。
33
单片微型计算机原理与接口技术
【答】程序如下:
;求无符号数最大值的子程序CMP ORG 1000H
CMP: MOV R0,#10H ;采样值数据区长度 MOV DPTR,#1000H ;采样值存放首址
MOV 20H,#00H ;最大值单元初始值设为最小数 LP: MOVX A,@DPTR ;取采样值 CJNE A,20H,CHK ;数值比较 CHK: JC LPI ;A值小,转移
MOV 20H,A ;A值大,则送20H LPI: DJNZ R0,LP ;继续 RET ;结束
注意:20 H中始终存放两个数比较后的较大值,比较结束后存放的即是最大值。 【4-26】编写求无符号数最小值的子程序。
入口条件:20 H和21 H中存放数据块起始地址的低位和高位,22 H中存数据 块的长度。出口结果:求得的最小值存入3O H单元中。对源程序加以注释和加上必要的伪指令。 【答】程序如下: .
;求无符号数最小值的子程序CMPI ORG 2000H
CMPI: MOV DPL,20H MOV DPH,21H
MOV 30H,#0FFH ;最小值单元初始值设为最大值 LOOP: MOVX A,@DPTR
MOVX A,@DPTR ’
CJNE A,3 0H,CHK ;比较两个数大小 SJMP LOOP1 ;两个数相等,不交换 CHK: JNC LOOP1 ;A较大,不交换 MOV 30H,A ;A较小,交换 LOOP1: INC DPTR
DJNZ 22H.LOOP RET
注意:30 H中始终存放两个数比较后的较小值,比较结束后存放的即是最小值。 例如:(20 H)=00 H,(21 H)=80 H.(22 H)=0 5 H。从8000 H开始存放下列数:02 H, 04 H,01 H,FFH,03 H。
调用子程序CMPl后的结果:(30 H)=01 H
【4-27】数据组为X1,X2,…,X1 0共10个。采用冒泡法对10个数据进行排序。最小值存入低位地址单元。编写源程序并加以注释,加上必要的伪指令。 【答】程序如下: ORG 0000H
0000 755021 MOV 50H,#21H ;置准备排序的数据1 0个 0003 755132 MOV 51H,#32H 0006 755223 MOV 52H,#23H 0009 755322 MOV 53H,#22H 000C 755489 MOV 54H,#89H
34
单片微型计算机原理与接口技术
000F 75559A MOV 55H,#9AH 0012 755635 MOV 56H,#35H 0015 7557F6 MOV 57H,#0F6H 0018 755865 MOV 58H,#65H 001B 755983 MOV 59H,#083H
001E C200 PX: CLR 00H ;设交换过标志
002 0 7809 MOV R3,#09H ;第一次比较二个数,比较次数为(n-1) 0022 785 0 MOV R0,#5 0H ;1 0个无符号数存放单元首地址 0024 E6 MOV A,@R0 0025 08 PX3: INC R0
0026 F9 MOV R1,A ‘
0027 9 6 SUBB A,@R0 ;DX- (DX+1) 0028 E9 MOV A,R1
0029 4006 JC PX2 ;DX<(DX+1)则转PX2,不交换
002B D200 SETB 00H ;DX>(DX+1)量交换标志位,20H.0=1 002D C6 XCH A,@R0 ;DX与(DX+1)交换 002E 18 DEC R0
002F C6 XCH A,@R0 0030 08 INC R0
0031 E6 PX2: MOV A,@R0 ;A<(DX+1) 0032 DBFI DJNZ R3,PX3 ;比较9次
0034 2000E7 JB 00H,PX ;有交换则再比较一遍 0037 80FE END0: SJMP END0
执行结果:(50 H)=21 H,(51 H)=22 H,(52 H)=23 H,(53 H)=32 H,(54 H)=35 H, (55 H)=65 H,(56 H)=89 H,(57 H)=9A H,(58 H)=B3 H,(59 H)=F6 H。 第5章 【单片机的中断系统原理及应用】 思考与练习题解析 【5—1】什么是中断?
【答】单片机在程序执行过程中,允许外部或内部“事件’’通过硬件打断程序的执行.,使其转向执行处理外部或内部“事件’’的中断服务子程序;而在完成中断服务子程序以后,继续执行原来被打断的程序,这种情况称为“中断\,这样的过程称为“中断响应过程\。 【5—2】单片机的中断系统主要应该解决哪几个问题?
【答】单片机的中断系统主要应该解决3个问题,即: ‘
①当单片机内部或外部有中断申请时,能及时响应中断,中止正在执行的任务,转去处理中断服务子程序。中断服务处理以后,能正确回到原来的断点处继续处理原先的任务。 ②当有多个中断源同时申,请中断时,单片机应能首先响应优先级高的中断源,能实现中断优先级的控制。 ‘
③当低优先级中断源正在享用中断服务时,若这时优先级比它高的中断源也申请中断,则要求单片机能中止低优先级中断源的服务程序,转去执行更高优先级中断源的服务程序,实现中断嵌套,并能逐级正确返回原断点处,继续处理原先的任务。 【5—3】说明8 0 C5 1单片机的中断流程。
【答】80C51单片机的中断流程由以下几个方面组成。’ ①中断采样:解中断采样是针对外部中断请求信号进行的,而内部中断请求都发生在芯
35