《单片机原理及应用》编程题题库参考答案 MOV TL0,#78H
SETB TR0 六、编程(每题10分)
CPL P1.2
1、 内部RAM 30H和31H单元中存放着2个0-9的ASCII码(高位字节在前),请将其转换为压缩BCD
RETI
码(高位在前)并存入外部RAM 2300H单元中。
END
解: ORG 0H
评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设
LJMP START
计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量
ORG 30H
指令可酌情给1-2分。
START: MOV A,30H
ANL A,#0FH
3、将存放在内部RAM 30H-35H单元的压缩型BCD码转换成相应的ASCII码,依次存放到外部RAM
SWAP A
2100H开始的单元区中。
MOV R0,A
ORG 0H
MOV A,31H
LJMP START
ANL A,#0FH
ORG 30H
ORL A,R0
START:MOV R0,#30H
MOV DPTR,#2300H
MOV R2,#06H
MOVX @DPTR,A
MOV DPTR,#2100H
END
LOOP:MOV A,@R0
评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写
SWAP A
对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
ANL A,#0FH
ORL A,#30H
2、 设单片机的晶体震荡频率为12MHz,利用定时器T0编程由P1.2输出周期为10mS的方波。(要求:
MOVX @DPTR,A
T0工作在方式1下,采用中断方式工作)
INC DPTR
解:周期为10mS则半周期为5mS,因此T0的定时初值为65536-5000/1=60536=0EC78H
MOV A,@R0
ORG 0
ANL A,#0FH
LJMP START
ORL A,#30H
ORG 000BH
MOVX @DPTR,A
LJMP TS
INC DPTR
ORG 30H
INC R0
START: MOV TMOD,#01H
DJNZ R2,LOOP
MOV TH0,#0ECH
SJMP $
MOV TL0,#78H
END
SETB ET0
评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写
SETB TR0
对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
SETB EA
CLR P1.2
4、已知8051单片机应用系统的晶体振荡频率为12MHz,请利用定时器T0实现在P1.0引脚上输出周
SJMP $
期为100mS的方波。(要求:采用中断方式,T0工作在方式1下)
TS: CLR TR0
解:输出方波周期为100mS,故半周期为50mS,因此T0的定时初值是65536-50000/1=15536=3CB0H
第1页 共27页
ORG 0H LJMP START ORG 000BH LJMP TS ORG 30H
START: MOV TMOD,#01H MOV TH0,#3CH MOV TL0,#0B0H SETB ET0 SETB TR0 SETB EA CLR P1.2 SJMP $ TS: CLR TR0 MOV TH0,#3CH MOV TL0,#0B0H SETB TR0 CPL P1.2 RETI END
评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
5、设8031单片机应用系统的晶振频率为12MHz,请利用T0在P1.0和P1.1引脚上输出频率为20Hz、互补(两个波形互为反相)的方波。要求:采用中断方式,T0工作在方式1。
解:输出频率为20Hz,则周期为1/20=50mS,半周期为50/2=25mS,
T0的定时初值为:65536-25000/1=40536=9E58H
ORG 0H LJMP START ORG 000BH LJMP TS ORG 30H
START:MOV TMOD,#01H ;T0设定为定时器,工作方式1 MOV TH0,#9EH MOV TL0,#58H SETB ET0 SETB EA SETB TR0 CLR P1.0 SETB P1.1 SJMP $ TS: CLR TR0 MOV TH0,#9EH MOV TL0,#58H SETB TR0 CPL P1.0 CPL P1.1 RETI END
评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
6、内部RAM 20H和30H开始的单元分别存放着16个16进制数,请将对应单元的内容相加(不考虑溢出),并将和存入外部RAM 2000H开始的单元中。
解: ORG 0
LJMP START ORG 30H START: MOV R0,#20H MOV R1,#30H MOV DPTR,#2000H
MOV R2,#08H ;每个单元存放2个16进制数,故16个16进制数占用8个单元 LOOP: MOV A,@R0 ADD A,@R1 MOVX @DPTR,A INC R0 INC R1 INC DPTR DJNZ R2,LOOP SJMP $ END
评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
7、8031单片机应用系统的晶体振荡器频率为12MHz,请利用定时器T0编程实现在P1.7引脚输出频率为20Hz的方波。要求:采用中断方式,T0工作在方式1下。
20Hz方波的周期是1/20=50mS,则其半周期为50/2=25mS
第2页 共27页
T0的定时初值为:65536-25000*12/12=40536=9E58H ORG 0H LJMP START ORG 000BH LJMP TS ORG 30H
START: MOV TMOD,#01H ;T0设定为定时器,工作方式1 MOV TH0,#9EH MOV TL0,#58H SETB ET0 SETB EA SETB TR0 SJMP $ TS: CLR TR0 MOV TH0,#9EH MOV TL0,#58H SETB TR0 RETI END
评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
8、请编写多字节无符号数减法程序。被减数存放在内部RAM 20H开始的8个单元中,减数存放在内部RAM 30H开始的8个单元,请将差存放到外部RAM 2000H开始的8个单元中,借位存放到OV标志中。注意:所有数据均按照从低字节到高字节的顺序存放。 ORG 0 LJMP START ORG 30H START: MOV R0,#20H MOV R1,#30H MOV DPTR,#2000H MOV R2,#08H
CLR C
LOOP: MOV A,@R0 SUBB A,@R1 MOVX @DPTR,A INC R0 INC R1 INC DPTR DJNZ R2,LOOP MOV OV,C SJMP $ END
评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
9、内部RAM 40H和41H单元中存放着2个0-9的ASCII码(高位字节在前),请将其转换为压缩BCD码(高位在前)并存入外部RAM 2000H单元中。
解: ORG 0H LJMP START ORG 30H START: MOV A,40H ANL A,#0FH SWAP A
MOV R0,A MOV A,41H ANL A,#0FH ORL A,R0
MOV DPTR,#2000H MOVX @DPTR,A END
评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
10、 设单片机的晶体振荡频率为12MHz,利用定时器T0编程由P1.0和P1.1输出周期为10mS、互补(互为反相)的方波。(要求:T0工作在方式1下,采用中断方式工作)
解:周期为10mS则半周期为5mS,因此T0的定时初值为65536-5000*12/12=60536=0EC78H ORG 0
LJMP START ORG 000BH LJMP TS ORG 30H
START: MOV TMOD,#01H MOV TH0,#0ECH MOV TL0,#78H SETB ET0 SETB TR0
第3页 共27页
SETB EA CLR P1.0 SETB P1.1 SJMP $ TS: CLR TR0
MOV TH0,#0ECH MOV TL0,#78H SETB TR0 CPL P1.0 CPL P1.1 RETI END
评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
11、将存放在内部RAM 20H-2FH单元的压缩型BCD码(高位在前)转换成相应的ASCII码,依次存放到外部RAM 1000H开始的单元区中。
ORG 0H LJMP START ORG 30H START: MOV R0,#20H MOV R2,#10H MOV DPTR,#1000H LOOP: MOV A,@R0 SWAP A
ANL A,#0FH
ORL A,#30H (或 ADD A,#30H) MOVX @DPTR,A INC DPTR MOV A,@R0 ANL A,#0FH
ORL A,#30H (或 ADD A,#30H) MOVX @DPTR,A INC DPTR INC R0
DJNZ R2,LOOP SJMP $ END 评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
12、已知8051单片机应用系统的晶体振荡频率为12MHz,请利用定时器T1实现在P1.0和P1.1引脚上输出互补(互为反相)的周期为100mS的方波。(要求:采用中断方式,T1工作在方式1下)
解:输出方波周期为100mS,故半周期为50mS,因此T1的定时初值是65536-50000*12/12=15536
=3CB0H
ORG 0H LJMP START ORG 001BH LJMP TS ORG 30H
START: MOV TMOD,#10H (或#1XH) MOV TH1,#3CH MOV TL1,#0B0H SETB ET1 SETB TR1 SETB EA CLR P1.0 SETB P1.1 SJMP $ TS: CLR TR1 MOV TH1,#3CH MOV TL1,#0B0H SETB TR1 CPL P1.0 CPL P1.1 RETI END
评分办法:不要求写出程序的注释。T1的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
13、设8031单片机应用系统的晶振频率为12MHz,请利用T0在P1.0引脚上输出频率为20Hz的方波。要求:采用中断方式,T0工作在方式1。
解:输出频率为20Hz,则周期为1/20=50mS,半周期为50/2=25mS,
T0的定时初值为:65536-25000*12/12=40536=9E58H
ORG 0H LJMP START
第4页 共27页
ORG 000BH LJMP TS ORG 30H
START: MOV TMOD,#01H ;T0设定为定时器,工作方式1 MOV TH0,#9EH MOV TL0,#58H SETB ET0 SETB EA SETB TR0 CLR P1.0 SJMP $ TS: CLR TR0 MOV TH0,#9EH MOV TL0,#58H SETB TR0 CPL P1.0 RETI END
评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
14、内部RAM 30H和38H开始的单元分别存放着8个压缩BCD码,请将对应单元的内容相加(不考虑溢出),并将和存入外部RAM 1000H开始的单元中。
解: ORG 0
LJMP START ORG 30H START: MOV R0,#30H MOV R1,#38H MOV DPTR,#1000H MOV R2,#08 LOOP: MOV A,@R0 ADD A,@R1 DA A MOVX @DPTR,A INC R0 INC R1 INC DPTR DJNZ R2,LOOP SJMP $ END
评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
15、8031单片机应用系统的晶体振荡器频率为12MHz,请利用定时器T1编程实现在P1.6和P1.7引脚输出互补(互为反相)的、频率为20Hz的方波。要求:采用中断方式,T1工作在方式1下。
解:20Hz方波的周期是1/20=50mS,则其半周期为50/2=25mS
T1的定时初值为:65536-25000/1=40536=9E58H
ORG 0H LJMP START ORG 001BH LJMP TS ORG 30H
START: MOV TMOD,#10H ;T1设定为定时器,工作方式1 MOV TH1,#9EH MOV TL1,#58H SETB ET1 SETB EA CLR P1.6 SETB P1.7 SETB TR1 SJMP $ TS: CLR TR1
MOV TH1,#9EH MOV TL1,#58H SETB TR1 CPL P1.6 CPL P1.7 RETI END
评分办法:不要求写出程序的注释。T1的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
16、请编写多字节无符号数加法程序。被加数存放在内部RAM 20H开始的8个单元中,加数存放在内部RAM 30H开始的8个单元,请将和存放到外部RAM 2000H开始的8个单元中,进位存放到F0标志中。注意:所有数据均按照从低字节到高字节的顺序存放。 ORG 0
第5页 共27页
LJMP START ORG 30H START: MOV R0,#20H MOV R1,#30H MOV DPTR,#2000H MOV R2,#08H
CLR C
LOOP: MOV A,@R0 ADDC A,@R1 MOVX @DPTR,A INC R0 INC R1 INC DPTR DJNZ R2,LOOP MOV F0,C SJMP $ END
评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
17、两个8字节压缩BCD码分别存放在内部RAM 30H和40H开始的连续单元中(低位字节在前),请将二者求和(不考虑溢出情况),并将和存入外部RAM 1000H开始的单元中。 解: ORG 0
MOV R0,#30H
MOV R1,#40H MOV DPTR,#1000H MOV R2,#8 LOOP: MOV A,R0 ADD A,@R1 DA A MOVX @DPTR,A DJNZ R2,LOOP SJMP $ END
评分办法:程序设计思路正确可得5分;对于仅写出部分指令的学生可酌情给1-4分;程序编制正确可得满分,若存在少量错误,可酌情扣1-3分。
18、设单片机的晶体振荡频率为6MHz,利用定时器T1编程由P1.6和P1.7输出周期为500μS 、互补(互为反相)的方波。(要求:T1工作在方式2下,采用中断方式工作) 解:T1定时器的初值=256-6*250/12=131=83H
ORG 0
LJMP START ORG 1BH LJMP TS ORG 30H START: MOV TMOD,#20H MOV TH1,#131 MOV TL1,#131 SETB ET1
SETB EA (或 MOV IE,#88H) SETB TR1 CLR P1.6 SETB P1.7 SJMP $ TS: CPL P1.6 CPL P1.7 RETI END
评分办法:写对定时器方式字和初值各给1分,设计思路正确给4分,程序编制正确可得满分。若仅写出少量指令,可酌情给1-3分。
19、将存放在内部RAM 20H-2FH单元的十六进制数转换成ASCII码,依次存放到外部RAM 2000H开始的单元中。
解: MOV R0,#20H MOV R2,#16
MOV DPTR,#2000H MOV R3, DPH MOV R4, DPL LOOP: MOV A,@R0 ANL A,#0FH MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPH,R3 MOV DPL,R4 MOVX @DPTR,A INC DPTR MOV R3,DPH MOV R4,DPL MOV A,@R0
第6页 共27页
SWAP A
ANL A,#0FH MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPH,R3 MOV DPL,R4 MOVX @DPTR,A INC DPTR MOV R3,DPH MOV R4,DPL INC R0 DJNZ R2,LOOP SJMP $
TAB: DB ‘0123456789ABCDEF’ END
评分办法:程序设计思路正确可得5分;对于仅写出部分指令的学生可酌情给1-4分;程序编制正确可得满分,若存在少量错误,可酌情扣1-3分。
20、已知8051单片机应用系统的晶体振荡频率为12MHz,请利用定时器T1实现在P1.0和P1.1引脚上输出互补(互为反相)的周期为2ms的方波。(要求:采用中断方式,T1工作在方式2下)
解:半周期=1ms 。方式2定时设定为250μS,
其初值=256-250*12/12=6。只要T1中断4次计数即为1ms。
ORG 0 LJMP START ORG 1BH LJMP TS ORG 30H
START: MOV TMOD,#20H MOV TH1,#6 MOV TL1,#6 SETB ET1 SETB EA SETB TR0 CLR P1.0 SETB P1.1 MOV R2,#4 SJMP $
TS: DJNZ R2,TS1 MOV R2,#4 CPL P1.0 CPL P1.1 TS1: RETI END
评分办法:写对定时器方式字和初值各给1分,设计思路正确给4分,程序编制正确可得满分。若仅写出少量指令,可酌情给1-3分。
21、设8031单片机应用系统的晶振频率为12MHz,请利用T1在P1.0引脚上输出频率为1Hz的方波。要求:采用中断方式,T1工作在方式1。
解:1Hz方波的周期为1s,半周期为500ms。可采用T1定时50ms,并对中断计数10次来实现500ms定时。
50ms定时初值=65536-50000*12/12=15536=3CB0H
ORG 0
LJMP START ORG 1BH LJMP TS ORG 30H
MOV TMOD,#10H MOV TH1,#3CH MOV TL1,#0B0H SETB ET1
SETB EA (或 MOV IE,#88H) MOV R2,#10 CLR P1.0 SETB TR1 SJMP $ TS: CLR TR1
MOV TH1,#3CH MOV TL1,#0B0H SETB TR1 DJNZ R2,TS1 MOV R2,#10 CPL P1.0 TS1: RETI
评分办法:写对定时器方式字和初值各给1分,设计思路正确给4分,程序编制正确可得满分。若仅写出少量指令,可酌情给1-3分。
22、内部RAM 30H和外部RAM 2200H开始的单元分别存放着两个8字节十六进制数(低位字节存
第7页 共27页
放在前),请将二者相加(不考虑溢出情况),并将和存入内部RAM 40H开始的单元中。
解: ORG 0
MOV R0,#30H
MOV R1,#40H MOV DPTR,#2200H MOV R2,#8 CLR C LOOP: MOVX A,@DPTR ADDC A,@R0 MOV @R1,A INC R0 INC R1 INC DPTR DJNZ R2,LOOP SJMP $
评分办法:程序设计思路正确可得5分;对于仅写出部分指令的学生可酌情给1-4分;程序编制正确可得满分,若存在少量错误,可酌情扣1-3分。
23、8051单片机应用系统的晶体振荡器频率为6MHz,请利用定时器T1编程实现在P1.0和P1.1引脚输出互补(互为反相)的、频率为20Hz的方波。要求:采用中断方式,T1工作在方式2下。
解:20Hz方波的半周期为25ms,
T1的0.5ms定时初值=256-500*6/12=6
ORG 0
LJMP START ORG 1BH LJMP TS ORG 30H
START: MOV TMOD,#20H MOV TH1,#6 MOV TL1,#6
MOV R2,#50 ; 50*0.5ms=25ms CLR P1.0 SETB P1.1 SETB ET1
SETB EA ; (或 MOV IE,#88H) SETB TR1 SJMP $
TS: DJNZ R2,TS1 MOV R2,#50
CPL P1.0 CPL P1.1 TS1: RETI
评分办法:写对定时器方式字和初值各给1分,设计思路正确给4分,程序编制正确可得满分。若仅写出少量指令,可酌情给1-3分。
24、请编写多字节无符号数减法程序。被减数存放在内部RAM 30H开始的8个单元中,减数存放在内部RAM 38H开始的8个单元,请将差存放到外部RAM 1000H开始的8个单元中,借位存放到F0标志中。注意:所有数据均按照从低字节到高字节的顺序存放。
解: ORG 0
LJMP START ORG 30H START: MOV R0,#30H MOV R1,#38H MOV DPTR,#1000H MOV R2,#8 CLR C LOOP: MOV A,@R0 SUBB A,@R1 MOVX @DPTR,A INC R0 INC R1 INC DPTR DJNZ R2,LOOP MOV C,F0 SJMP $
评分办法:程序设计思路正确可得5分;对于仅写出部分指令的学生可酌情给1-4分;程序编制正确可得满分,若存在少量错误,可酌情扣1-3分。
25、请编写多字节无符号数减法程序。被减数存放在内部RAM 20H开始的16个单元中,减数存放在内部RAM 30H开始的16个单元,请将差存放到外部RAM 2000H开始的16个单元中,借位存放到OV标志中。注意:所有数据均按照从低字节到高字节的顺序存放。
解: ADDR1 EQU 20H ADDR2 EQU 30H LEN EQU 16 ADDR3 EQU 2000H ORG 0 LJMP START
第8页 共27页
ORG 30H
START: MOV R0,#ADDR1 MOV R1,#ADDR2 MOV DPTR,#ADDR3 MOV R2,#LEN CLR C LOOP: MOV A,@R0 SUBB A,@R1 MOVX @DPTR,A INC R0 INC R1 INC DPTR DJNZ R2,LOOP MOV OV,C SJMP $ END
评分办法:程序设计思路正确可得5分,指令完全写对可得10分。不要求使用伪指令。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。 26、8751单片机应用系统的晶体振荡器频率为12MHz,请利用定时器T0编程实现在P1.7引脚输出频率为20Hz的方波。要求:采用中断方式,T0工作在方式1下。
解:20Hz方波的周期是1/20=0.05 (s) =50 ms ,则半周期为25ms。
因此只要每隔25ms将P1.7取反即可得到20Hz的方波。 T0的定时初值=65536-25000*12/12=40536=9E58H ORG 0 LJMP START ORG 0BH LJMP TS ORG 30H
START: MOV TMOD,#01H ; 设定T0为定时器,方式1 MOV TH0,#9EH MOV TL0,#58H CLR P1.7 SETB ET0
SETB EA (或两条指令合并为MOV IE,#82H) SETB TR0 ; 启动T0定时 SJMP $
TS: CLR TR0 ; 停止T0定时
MOV TH0,#9EH MOV TL0,#58H
SETB TR0 ; 启动T0定时 CPL P1.7 RETI
END
评分办法:T0的方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。在中断服务程序中可以省略T0的停止与启动指令。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
27、将存放在内部RAM 20H-3FH单元的压缩BCD码转换成ASCII码,依次存放到外部RAM 2300H开始的单元中。(注:每个单元均先转换高四位) 解: LEN EQU 20H ADDR1 EQU 20H ADDR2 EQU 2300H ORG 0 LJMP START ORG 30H
START: MOV R0,#ADDR1 MOV DPTR,#ADDR2 MOV R2,#LEN LOOP: MOV A,@R0 ANL A,#0F0H SWAP A
ORL A,#30H (或 ADD A,#30H) MOVX @DPTR,A INC DPTR MOV A,@R0 ANL A,#0FH
ORL A,#30H (或 ADD A,#30H) MOVX @DPTR,A INC DPTR INC R0
DJNZ R2,LOOP SJMP $ END
评分办法:程序设计思路正确可得5分,指令完全写对可得10分。不要求使用伪指令。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
28、设8051单片机应用系统的晶振频率为12MHz,请利用T1在P1.0和P1.1引脚上输出频率为20Hz、
第9页 共27页
互补(两个波形互为反相)的方波。要求:采用中断方式,T1工作在方式1。
解:20Hz方波的周期是1/20=0.05 (s) =50 ms ,则半周期为25ms。因此只要每隔25ms将P1.0和P1.1取反即可得到互补的20Hz方波。
T1的定时初值=65536-25000*12/12=40536=9E58H ORG 0 LJMP START ORG 1BH LJMP TS ORG 30H
START: MOV TMOD,#10H ; 设定T1为定时器,方式1 MOV TH1,#9EH MOV TL1,#58H CLR P1.0 SETB P1.1 SETB ET1
SETB EA (或两条指令合并为MOV IE,#88H) SETB TR1 ; 启动T1定时 SJMP $
TS: CLR TR1 ; 停止T1定时
MOV TH1,#9EH
MOV TL1,#58H
SETB TR1 ; 启动T1定时 CPL P1.0 CPL P1.1 RETI END
评分办法:T1的方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。在中断服务程序中可以省略T1的停止与启动指令。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
29、将存放在内部RAM 30H-35H单元的十六进制数转换成相应的ASCII码,依次存放到外部RAM 1100H开始的单元区中。(注:每个字节转换时先转换高四位)
解: ORG 0
MOV R0,#30H MOV DPTR,#1100H MOV R2,#6
LOOP: MOV A,@R0 ; 取需要转换的数 ANL A,#0F0H ; 屏蔽低4位 SWAP A PUSH DPH
PUSH DPL ; 保护目的地址 MOV DPTR,#TAB
MOVC A,@A+DPTR ; 查表得ASCII码 POP DPL
POP DPH ; 恢复目的地址
MOVX @DPTR,A ; 存转换后的ASCII码 INC DPTR ; 修改目的地址指针 MOV A,@R0 ; 取需要转换的数 ANL A,#0FH ; 屏蔽高4位 PUSH DPH
PUSH DPL ; 保护目的地址 MOV DPTR,#TAB
MOVC A,@A+DPTR ; 查表得ASCII码 POP DPL
POP DPH ; 恢复目的地址 MOVX @DPTR,A
INC DPTR ; 修改目的地址指针 INC R0 ; 修改源地址指针 DJNZ R2,LOOP ; 未转换完则继续 SJMP $ TAB : DB ‘0123456789ABCDEF’ END
评分办法:程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
30、已知8051单片机应用系统的晶体振荡频率为12MHz,请利用定时器T0实现在P1.0引脚上输出频率为2kHz的方波。(要求:采用中断方式,T0工作在方式2下)
解:2kHz方波的周期是1/2000=0.5ms =500 μs,则半周期为250 μs。因此只要每隔250 μs将P1.0取反即可得到互补的2kHz方波。 T0的定时初值=256-250*12/12=6 ORG 0 LJMP START ORG 0BH LJMP TS ORG 30H
START: MOV TMOD,#02H ; 设定T0为定时器,方式2 MOV TH0,#6
第10页 共27页
MOV TL0,#6 次即是0.5秒,这时将P1.0取反即可。 CLR P1.0 T0的定时初值=65536-50000*12/12=15536=3CB0H SETB ET0 ORG 0
SETB EA (或两条指令合并为MOV IE,#82H) LJMP START SETB TR0 ; 启动T0定时 ORG 0BH SJMP $ LJMP TS
TS: CPL P1.0 ORG 30H RETI START: MOV TMOD,#01H ; 设定T0为定时器,方式1 END MOV TH0,#3CH 评分办法:T0方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得 MOV TL0,#0B0H ; 50ms定时初值送T0 满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。 MOV R2,#10 ; 中断10次 SETB ET0 31、内部RAM 30H开始的单元中存放着16个0-9的ASCII码(高位字节在前),请将其转换为压缩 SETB EA ;(或两条指令合并为MOV IE,#82H) BCD码(高位在前)并存入外部RAM 1000H开始的单元中。 SETB TR0 ; 启动定时 解: ORG 0 SJMP $ ; 等待中断 MOV R0,#30H TS: CLR TR0 MOV DPTR,#1000H MOV TH0,#3CH MOV R2,#8 ; 16个ASCII码转换为8个压缩BCD码 MOV TL0,#0B0H ; 50ms定时初值送T0 LOOP: MOV A,@R0 SETB TR0 ANL A,#0FH ; 屏蔽高4位得到BCD码 DJNZ R2,NEXT SWAP A MOV R2,#10 MOV R1,A CPL P1.0 INC R0 ; 指向下一个ASCII码 NEXT: RETI MOV A,@R0 END ANL A,#0FH ; 屏蔽高4位得到BCD码 ORL A,R1 ; 合成压缩BCD码 评分办法:T0的方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可 MOVX @DPTR,A ; 存压缩BCD码 得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。 INC DPTR INC R0 33、设有两个长度为16字节的数组,分别存放在外部RAM 0200H和0300H为首址的存储区域中,试 DJNZ R2,LOOP 编写程序求其对应项之和(不考虑溢出的情况),结果存放在以0400H为首址的外部RAM中。 SJMP $ 解: 参考程序清单如下: END ORG 0 MOV R2,#16 ; 数组长度为16个字节 评分办法:程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3 MOV R3,#02H ; 数组1的首地址高8位 分;若仅有少量指令写错,可酌情扣1-3分。 MOV R4,#03H ; 数组2的首地址高8位
MOV R5,#04H ; 和数组的首地址高8位 32、设单片机的晶体振荡频率为12MHz,利用定时器T0编程由P1.0输出周期为1秒的方波。(要求: MOV DPL,#0 ; 数据指针低8位清零 T0工作在方式1下,采用中断方式工作) LOOP: MOV DPH,R3
解:周期为1秒的方波只需要每隔0.5秒将P1.0取反即可。将T0设定为50ms定时中断,中断10 MOVX A,@DPTR ; 取被加数
第11页 共27页
MOV R1,A ; 存被加数 MOV DPH,R4
MOVX A,@DPTR ; 取加数 ADD A,R1 ; 求和 MOV DPH,R5
MOVX @DPTR,A ; 存和
INC DPL ; 指向下一字节 DJNZ R2,LOOP ; 未加完则循环 END
评分办法:程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
34、设单片机的晶体振荡频率为6MHz,利用定时器T0编程由P1.0和P1.1输出周期为1s、互补(互为反相)的方波。(要求:T0工作在方式1下,采用中断方式工作)
解:周期为1s则半周期为500ms,只需要每隔500ms将P1.0和P1.1的输出取反即可。可以利用T0定时100ms中断,对T0中断计5次实现500ms定时。
T0的定时初值为65536-100000*6/12=15536=03CB0H 参考程序清单如下:
ORG 0
LJMP START ORG 0BH LJMP TS ORG 30H
START: MOV TMOD,#01H MOV TH0,#03CH MOV TL0,#0B0H
MOV R2,#5 ; 中断5次为500ms SETB ET0 SETB TR0 SETB EA CLR P1.0 SETB P1.1 SJMP $
TS: CLR TR0 ; 该指令可以省略 MOV TH0,#03CH MOV TL0,#0B0H
SETB TR0 ; 该指令可以省略 DJNZ R2,TS1
MOV R2,#5 ; 恢复中断次数初值 CPL P1.0 CPL P1.1 TS1: RETI END
评分办法:T0方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
35、8031单片机应用系统的晶体振荡器频率为6MHz,请利用定时器T0编程实现在P1.0引脚输出频率为0.1Hz的方波。要求:采用中断方式,T0工作在方式1下。
解:0.1Hz方波的周期是1/0.1=10s,则其半周期为10/2=5s,每5s将P1.0取反即可。 可以利用T0定时100ms中断,对100ms中断计50次即可实现5s定时。
T0的定时初值为:65536-100000*6/12=15536=3CB0H 参考程序清单如下:
ORG 0H LJMP START ORG 000BH LJMP TS ORG 30H
START: MOV TMOD,#01H ; 设定为定时器,工作方式1 MOV TH0,#3CH MOV TL0,#0B0H MOV R2,#32H SETB ET0 SETB EA SETB TR0 SJMP $
TS: CLR TR0 ; 此指令可以省略 MOV TH0,#3CH MOV TL0,#0B0H
SETB TR0 ; 此令可以省略 DJNZ R2,NEXT MOV R2,#32H CPL P1.0 NEXT: RETI END
评分办法:T0方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
36、编程求内部RAM中40H~4FH共16个单元中的内容的和(结果为2字节),并将和放入50H和51H
第12页 共27页
单元中(高8位在50H)。 解: 参考程序清单如下:
ORG 0
LJMP START ORG 30H
START: MOV R0,#40H ; 数据区首地址送R0 MOV R2,#16 ; 单元数送R2
MOV R3,#0 ; 和的高8位清零
CLR A ; 和的低8位清零
LOOP: CLR C
ADD A,@R0 ; 求和
JNC NEXT ; 没有进位则转移
INC R3 ; 和的高8位存储单元内容加1 NEXT: INC R0 ; 指向下一个单元
DJNZ R2,LOOP ; 没加完则循环,和在R3和A中 MOV 51H,A ; 存低8位结果 MOV 50H,R3 ; 存高8位结果 SJMP $ END
评分办法:程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
37、有一个长度为16字节的ASCII码字符串存放在外部RAM 1000H为首址的存储区域中,字符串中的每一个字符均不相同,试编写程序查找字符串中是否存在ASCII码“9”。如果在字符串中存在ASCII码“9”,则将其存储单元的地址存放到内部RAM 30H和31H单元中(高8位地址在30H单元中),同时将OV标志位清零。否则,将30H和31H单元的内容清零,并将OV标志位置“1”。 解: ORG 0
MOV SP,#60H MOV DPTR,#1000H MOV R2,#16 LOOP: MOVX A,@DPTR CJNE A,#39H,EXIT MOV 30H,DPH MOV 31H,DPL CLR OV SJMP $ EXIT: INC DPTR DJNZ R2,LOOP MOV 30H,#0 MOV 31H,#0 SETB OV SJMP $ END
评分办法:程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。 38、设单片机的晶体振荡频率为3MHz,利用定时器T0编程由P1.6和P1.7输出周期为10s、互补(互为反相)的方波。(要求:T0工作在方式1下,采用中断方式工作)
解: 方波周期是10秒,只需要每隔5秒将P1.6和P1.7取反即可。 用T0产生100ms定时中断,对该中断计50次即可得到5秒定时。 T0的定时初值=65536-100000×3÷12=40536=9E58H ORG 0 LJMP START ORG 0BH LJMP TS ORG 30H START: MOV SP,#60H MOV TMOD,#01H MOV TH0,#9EH MOV TL0,#58H SETB ET0 SETB EA CLR P1.6
MOV R2,#32H (或 MOV R2,#50) SETB TR0 SJMP $
TS: MOV TH0,#9EH MOV TL0,#58H DJNZ R2,TS1
MOV R2,#32H (或 MOV R2,#50) CPL P1.6 CPL P1.7 TS1: RETI END
评分办法:T0方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
39、89C51单片机应用系统的晶体振荡器频率为12MHz,请利用定时器T1编程实现在P1.0引脚输出
第13页 共27页
频率为2Hz的方波。要求:T1采用中断方式工作,工作在方式1下。 解:2Hz方波其周期为0.5秒,只需要每隔0.25秒将P1.0取反即可。 T1在12MHz晶振下定时时间最大为65.536ms,因此只需要50ms定时中断,然后对中断计5次即可实现0.25秒定时。
T1的50ms定时初值为:65536-50000×12÷12=15536=3CB0H 程序清单如下:
ORG 0 LJMP START ORG 1BH LJMP TS ORG 30H START: MOV SP,#60H MOV TMOD,#10H MOV TH1,#3CH MOV TL1,#0B0H SETB ET1 SETB EA MOV R2,#5 SETB TR1 SJMP $
TS: MOV TH1,#3CH MOV TL1,#0B0H DJNZ R2,TS1 MOV R2,#5 CPL P1.0 TS1: RETI END
评分办法:T1的方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
40、有两个8字节的16进制数a和b,它们分别存放在内部RAM中30H~37H和40H~47H的单元中(高位字节在前)。请编程求a-b,并将差存入30H开始的内部RAM单元中(高位字节在前)。若差小于零则将F0标志位置“1”,否则清零。
解:设计思路:从16进制数的最低位字节(37H和47H)开始相应字节带借位相减,然后修改地址指针在对次低位字节进行相减,一共循环8次完成两个8字节16进制数的相减。最后将Cy标志的内容传送给F0标志位即可。
ORG 0
MOV R0,#37H MOV R1,#47H MOV R2,#8 CLR C LOOP: MOV A,@R0 SUBB A,@R1 MOV @R0,A DEC R0 DEC R1
DJNZ R2,LOOP MOV F0,C SJMP $ END
评分办法:程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
41、若外部RAM的(3000H)=X,(3001H)=Y,编程实现Z=X*X+2Y,并将结果存到片内RAM的40H单元(设Z<256 。
解: X EQU 3000H Y EQU 3001H Z EQU 40H ORG 0
MOV DPTR,#X ; 变量X的地址送DPTR MOVX A,@DPTR ; 取变量X
MOV B,A ; 变量X的值送给B寄存器
MUL AB ; 求X*X,根据题意知积为1字节(在A中) MOV R0,A ; X*X的结果存入R0中 INC DPTR ; 指向变量Y MOVX A,@DPTR ; 取变量Y MOV B,#2
MUL AB ; 求2*Y,根据题意知积为1字节(在A中) ADD A,R0 ; 求X*X+2*Y
MOV Z,A ; 和存入40H单元 SJMP $ ; 停机 END
评分办法:不要求写出程序的注释和使用伪指令。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
42、设单片机的晶体振荡频率为12MHz,P1.0接有一个共阴极驱动方式连接的发光二极管。现要求利用定时器T1编程使该发光二极管每10秒钟点亮一次,每次点亮时间为1秒。(要求:T1工作在方式1下,采用中断方式工作,在中断服务程序中控制发光二极管的亮与灭)
第14页 共27页
解:共阴极驱动的发光二极管需要高电平点亮,故当P1.0为1时发光二极管点亮。
由于一个周期为10秒,因此需要一个1秒钟的定时,同时需要一个闪烁标志位来表明LED的亮与灭。
T1的定时时间选择50ms,这样中断20次即为1秒钟,其定时初值为: 65536-50000*12/12=15536=3CB0H
FLASH BIT 00H ; LED亮与灭的标志,“1”表示亮 ORG 0 LJMP START ORG 1BH LJMP TS ORG 30H
START: MOV TMOD,#10H ; 设定T1为定时器,方式1 MOV TH1,#3CH MOV TL1,#0B0H
MOV R2,#20 ; 中断20次为1秒
MOV R3,#9 ; LED熄灭的时间为9秒 SETB ET1 ; 允许T1中断 SETB EA ; 开中断 SETB FLASH
SETB P1.0 ; 点亮LED SETB TR1 ; 启动计数 SJMP $
TS: MOV TH1,#3CH MOV TL1,#0B0H
DJNZ R2,TS2 ; 没到1秒钟则返回 MOV R2,#20
JB FLASH,TS1 ; 若LED亮则转移 DJNZ R3,TS2 ; 没到9秒钟则返回 MOV R3,#9
SETB P1.0 ; 点亮LED SETB FLASH SJMP TS2
TS1: CLR P1.0 ; 1秒到,熄灭LED CLR FLASH TS2: RETI END
评分办法:不要求写出程序的注释和使用伪指令。T1的方式控制字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。 43、89C51单片机应用系统的晶体振荡器频率为6MHz,单片机的P1.7引脚接有一个共阳极驱动方式连接的发光二极管,请利用定时器T0编程实现使该发光二极管点亮1秒钟,熄灭1秒钟的循环。(要求:T0采用中断方式工作,工作在方式1下,在中断服务程序中控制发光二极管的亮与灭。)
解:由于LED是亮与灭的时间均为1秒,故需要一个1秒的定时程序。可以利用T0定时100ms(或50ms)中断10次(或20次)来实现1秒的定时。T0的定时初值为:
65536-100000*6/12=15536=3CB0H (或 65536-50000*6/12=40536=9E58H) ORG 0 LJMP START ORG 0BH LJMP TS
START: MOV TMOD,#1 ; 设T0为定时器,方式1 MOV TH0,#3CH ; 100ms定时初值 MOV TL0,#0B0H SETB ET0 SETB EA
MOV R2,#10 ; 中断10次为1秒 SETB TR0 SJMP $
TS: MOV TH0,#3CH ; 100ms定时初值 MOV TL0,#0B0H
DJNZ R2,TS1 ; 1秒没到则返回
MOV R2,#10 ; 1秒钟中断次数送R2 CPL P1.7 ; 改变LED的状态 TS1: RETI END
评分办法:不要求写出程序的注释。T0方式字和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
44、设外部RAM 2000H单元为数据块的起始地址,数据块长度为10,试编程求数据块中的最小值,存入内部RAM 30H单元。
解:设计思路:将数据块的第1个数据放入结果单元,然后依次与剩余的9个数据进行比较。如果新的数据比结果单元中的数据还小则将该数据存入结果单元,9次比较完成则结果单元中的数据就是最小值。
ORG 0
MOV DPTR,#2000H
MOVX A,@DPTR ;取数据块的第一个数 MOV 30H,A ;存入结果单元 MOV R2,#9 ; 共比较9次
第15页 共27页
INC DPTR ;指向第2个数 LOOP: CLR C
MOVX A,@DPTR SUBB A,30H
JNC LP ; 没有借位则说明结果单元的数小,不用更换最小值 MOVX A,@DPTR
MOV 30H,A ; 更换最小值 LP: INC DPTR ; 指向下一个数
DJNZ R2,LOOP ; 没有比较完则继续循环 SJMP $ ; 停机 END
评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
45、若外部RAM的(1000H)=X,(1001H)=Y,请编程实现Z=2X+Y*Y+5(设Z<65536),并将结果保存到片内RAM的30H和31H单元(31H单元存放结果的高8位,30H单元存放结果的低8位)。
解: X EQU 1000H ZH EQU 31H ZL EQU 30H ORG 0
MOV ZH,#0 ;结果单元清零 MOV ZL,#0
MOV DPTR,#1000H
MOVX A,@DPTR ;取X的值 MOV B,#2
MUL AB ;计算2X ADD A,ZL
MOV ZL,A ;存结果低8位 MOV A,B ;取乘积高8位 ADD A,ZH
MOV ZH,A ;存结果高8位 INC DPTR ;指向Y MOVX A,@DPTR ;取Y MOV B,A
MUL AB ;计算Y*Y
ADD A,ZL ;计算结果低8位 MOV ZL,A
MOV A,B ;取乘积的高8位
ADDC A,ZH ;计算结果高8位,注意必须带进位加 MOV ZH,A MOV A,ZL
ADD A,#5 ;计算结果加5 MOV ZL,A
MOV ZH,A ;存结果低8位
ADDC A,#0 ;将低8位进位加到结果高8位,注意必须带进位加 MOV ZH,A ;存结果高8位 END
评分办法:不要求写出程序的注释和使用伪指令。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
46、已知89C51单片机的晶体振荡频率为3MHz,请编程从P1.0和P1.1口输出互补的(即互为反相)、周期为2秒的方波。(要求:T0工作在方式1下,采用中断方式工作,在中断服务程序中控制P1.0和P1.1的输出)
解:要求输出周期为2秒的方波,只需每隔半个周期(1秒)将输出取反即可。设定T0定时为200ms,只需对T0的200ms定时中断计5次即可得到1秒钟的定时。
T0的定时初值为:65536-200*1000*3/12=15536=3CB0H (计算正确得1分) ORG 0 LJMP START ORG 0BH LJMP TS ORG 30H
START: MOV TMOD,#01H ;设T0为方式1,定时器 (写对得1分) MOV TH0,#3CH ;送200ms定时初值 MOV TL0,#0B0H
SETB ET0 ;允许T0中断 SETB EA ;开中断 CLR P1.0 ;输出初始化 SETB P1.1
MOV R7,#5 ;中断5次为1秒钟 SETB TR0 ;启动T0计数 SJMP $ ;等待中断
TS: MOV TH0,#3CH ;送200ms定时初值 MOV TL0,#0B0H
DJNZ R7,TS1 ;没到1秒钟则返回 MOV R7,#5 ;中断5次为1秒钟 CPL P1.0 ;输出取反 CPL P1.1 TS1: RETI
第16页 共27页
END 评分办法:不要求写出程序的注释和使用伪指令。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
47、89C51单片机应用系统的晶体振荡器频率为6MHz,单片机的P1.0引脚接有一个共阴极驱动方式连接的发光二极管,请利用定时器T1编程实现使该发光二极管点亮2秒钟,熄灭3秒钟的循环。(要求:T1采用中断方式工作,工作在方式1下,在中断服务程序中控制发光二极管的亮与灭。)
解: 共阴极接法的发光二极管需要高电平点亮,因此当P1.0为高电平时发光二极管点亮。 需要利用T1产生1秒钟的定时,可以对T1的100ms中断计10次实现1秒定时。 T1的定时初值为:65536-100*1000*6/12=15536=3CB0H (计算正确得1分) FLASH BIT 00H ;发光二极管点亮标志,“1”表示点亮 ORG 0 LJMP START ORG 1BH LJMP TS ORG 30H
START: MOV TMOD,#10H ;将T1设为方式1,定时器 (写对得1分) MOV TH1,#3CH ;送100ms定时初值 MOV TL1,#0B0H
SETB ET1 ;允许T1中断 SETB EA ;开中断
MOV R7,#10 ;中断10次为1秒钟
MOV R5,#2 ;发光二极管点亮时间为2秒 MOV R6,#3 ;发光二极管熄灭时间为3秒 SETB P1.0 ;点亮发光二极管
SETB FLASH ;通知中断服务程序发光二极管处于点亮状态 SETB TR1 ;启动T1计数 SJMP $ ;等待中断
TS: MOV TH1,#3CH ;送100ms定时初值 MOV TL1,#0B0H
DJNZ R7,TS2 ;1秒未到则返回
MOV R7,#10 ;100ms中断计数值重新赋值
JNB FLASH,TS1 ;如果发光二极管处于熄灭状态则转移 DJNZ R5,TS2 ;点亮的时间2秒未到则返回 MOV R5,#2
CLR P1.0 ;熄灭发光二极管 CLR FLASH SJMP TS2 TS1: DJNZ R6,TS2 ;熄灭的时间没到3秒则返回 MOV R6,#3
SETB P1.0 ;点亮发光二极管 SETB FLASH TS2: RETI END
评分办法:不要求写出程序的注释。T1方式字和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
48、设外部RAM 1000H单元为数据块的起始地址,数据块长度为60字节,试编程求数据块中所有数据的和,并将其存入内部RAM 30H和31H单元(30H单元存放和的低8位,31H单元存放和的高8位)。 解:
ADDR EQU 100HH ;数据块首地址 LEN EQU 60 ;数据块长度 ZH EQU 31H ;和的高8位地址 ZL EQU 30H ;和的低8位地址 ORG 0
MOV DPTR,#ADDR ;数据块首地址送DPTR MOV R7,#LEN ;数据块长度送R7 MOV ZH,#0 ;结果单元清零 MOV ZL,#0
LOOP: MOVX A,@DPTR ;取数据
ADD A,ZL ;将数据加到结果单元的低8位 MOV ZL,A ;存结果低8位 MOV A,ZH ;取结果高8位
ADDC A,#0 ;将低8位计算的进位加到高8位中 MOV ZH,A ;存高8位
INC DPTR ;修改地址指针,指向下一个数据 DJNZ R7,LOOP ;没有计算完则继续 SJMP $ END
评分办法:不要求写出程序的注释和使用伪指令。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
49、若外部RAM的(1000H)=X,内部RAM(30H)=Y,请编程实现Z=X*X+3Y+18(设Z<65536),并将结果保存到片内RAM的40H和41H单元(41H单元存放结果的高8位,40H单元存放结果的低8位)。 解: X EQU 1000H Y EQU 30H
第17页 共27页
ZH EQU 41H LJMP START ZL EQU 40H ORG 1BH ORG 0 LJMP TS MOV ZH,#0 ;结果单元清零 ORG 30H MOV ZL,#0 START: MOV TMOD,#10H ;设T1为方式1,定时器 (写对得1分) MOV DPTR,#1000H MOV TH1,#0F8H ;送200ms定时初值 MOVX A,@DPTR ;取X的值 MOV TL1,#30H MOV B,A SETB ET1 ;允许T1中断 MUL AB ;计算X*X SETB EA ;开中断 ADD A,ZL CLR P1.6 ;输出初始化 MOV ZL,A ;存结果低8位 SETB P1.7 MOV A,B ;取乘积高8位 SETB TR1 ;启动T1计数 ADD A,ZH SJMP $ ;等待中断 MOV ZH,A ;存结果高8位 TS: MOV TH1,#0F8H ;送1ms定时初值 MOVX A,Y ;取Y MOV TL1,#30H MOV B,#3 CPL P1.0 ;输出取反 MUL AB ;计算3*Y CPL P1.1 ADD A,ZL ;计算结果低8位 TS1: RETI MOV ZL,A END MOV A,B ;取乘积的高8位 评分办法:不要求写出程序的注释和使用伪指令。T1的方式控制字写对和定时初值计算正确可各得1 ADDC A,ZH ;计算结果高8位,注意必须带进位加 分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若 MOV ZH,A 仅写出少量指令可酌情给1-2分。 MOV A,ZL
2
ADD A,#18 ;计算结果加18 51、若外部RAM的(1000H)=X,请编程实现Y=X+2X+1(设Y<65536),并将结果保存到片内RAM的 MOV ZL,A ;存结果低8位 30H和31H单元(31H单元存放结果的高8位,30H单元存放结果的低8位)。 MOV A,ZH ;取结果高8位 解: ADDC A,#0 ;将低8位进位加到结果高8位,注意必须带进位加 ORG 0 MOV ZH,A ;存结果高8位 MOV 30H,#0 ;结果单元清零 END MOV 31H,#0 评分办法:不要求写出程序的注释和使用伪指令。程序设计思路正确可得5分,指令完全写对可得 MOV DPTR,#1000H 10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。 MOV A,@DPTR ;取X的值 MOV B,A 50、已知89C51单片机的晶体振荡频率为24MHz,请编程从P1.6和P1.7口输出互补的(即互为反相)、 MUL AB ;求X的平方 频率为500Hz的方波。(要求:T1工作在方式1下,采用中断方式工作,在中断服务程序中控制P1.6和 MOV 30H,A ;存低8位 P1.7的输出) MOV A,B 解:要求输出频率为500Hz的方波,其周期为1/500=2ms,故只需每隔半个周期(1ms)将输出取反即 MOV 31H,A ;存高8位 可。设定T1定时为1ms,则 MOVX A,@DPTR ;取X的值 T0的定时初值为:65536-1000*24/12=63536=0F830H (计算正确得1分) MOV B,#2 ORG 0 MOV AB ;求2X
第18页 共27页
ADD A,30H ; 求低8位和 MOV 30H,A ;存和的低8位 MOV A,B ;取积的高8位 ADDC A,31H ;求高8位和 MOV 31H,A ;存和的高8位 MOV A,30H
ADD A,#1 ;加1
MOV 30H,A ;存和的低8位 MOV A,31H
ADDC A,#0 ;和的高8位加上低8位运算的进位 MOV 31H,A ;存和的高8位 SJMP $ ;停机 END
评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
52、2、已知89C51单片机的晶体振荡频率为12MHz,请编程从P1.0口输出频率为50Hz的方波。(要求:T0工作在方式2下,采用中断方式工作,在中断服务程序中控制P1.0的输出)
解:50Hz方波的周期=1/50=20ms,因此只需每隔10ms将P1.0取反就可以了。T0在方式2下最大的定时时间为256微秒(对于12MHz晶振),可以将定时时间设为250微秒,然后对250微秒定时中断计40次即以得到10ms的定时。
T0的定时初值=256-250*12/12=6 ORG 0 LJMP START ORG 0BH LJMP TS ORG 30H
START: MOV TMOD,#2 ;将T0设为方式2,定时器 MOV TH0,#6 ;送定时初值 MOV TL0,#6
SETB ET0 ;允许T0中断 SETB EA ;开中断
MOV R2,#40 ;中断40次为10ms SETB TR0 ;启动T0计数 SJMP $ ;等待中断 TS: DJNZ R2,TS1
MOV R2,#40 ;中断40次为10ms到 CPL P1.0 ;输出取反 TS1: RETI ;中断返回 END
评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
53、89C51单片机应用系统的晶体振荡器频率为3MHz,请编程实现从单片机的P1.0引脚输出25Hz方波。(要求:T1采用中断方式工作,工作在方式2下,在中断服务程序中控制P1.0的输出。) 解:25Hz方波的周期=1/25=40ms,即每隔20ms将P1.0输出取反即可。
T1在方式2下的最大定时时间为:256*12/3=1024微秒=1.024毫秒,因此只需要定时1ms,然后对1ms定时计20次即可得到20ms的定时。T1定时初值=256-1000*3/12=6。 ORG 0 LJMP START ORG 1BH LJMP TS ORG 30H
START: MOV TMOD,#20H ;设T1为定时器,方式2 MOV TH1,#6 ;送1ms定时初值 MOV TL1,#6
SETB ET1 ;允许T1中断 SETB EA ;开中断
MOV R2,#20 ;中断20次为20ms SETB TR1 ;启动T1计数 SJMP $ ;等待中断
TS: DJNZ R2,TS1 ;20ms未到则转移 MOV R2,#20 ;中断20次为20ms CPL P1.0 ;输出取反 TS1: RETI ;中断返回 END
评分办法:不要求写出程序的注释。T1的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
54、设外部RAM 2000H单元为数据块的起始地址,数据块长度为100字节。假设在数据块中存在唯一的一个ASCII字符“A”,试编程找到它,并将其在外部RAM的存放地址存入内部RAM 30H和31H单元中(30H单元存放地址的高8位,31H单元存放地址的低8位)。 解:
ORG 0
MOV DPTR,#2000H ;数据块首地址送DPTR MOV R2,#100 ;数据块长度送R2
第19页 共27页
LOOP: MOVX A,@DPTR ;取数据
CJNE A,#41H,NEXT ;数据不是“A”则转移 MOV A,DPH
MOV 30H,A ;存高8位地址 MOV A,DPL
MOV 31H,A ;存低8位地址 SJMP $ ;停机
NEXT: INC DPTR ;修改地址指针 DJNZ R2,LOOP ;没有找到则继续 SJMP $ ;停机
评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
22
55、若内部RAM的(20H)=a,外部RAM(1300H)=b,请编程实现y=a+b+5(设y<65536),并将结果保存到片内RAM的30H和31H单元(31H单元存放结果的高8位,30H单元存放结果的低8位)。 解:
ORG 0
MOV A,20H ;取a MOV B,A
2
MUL AB ;求a
MOV 30H,A ;存和的低8位 MOV A,B
MOV 31H,A ;存和的高8位 MOV DPTR,#1300H
MOVX A,@DPTR ;取b MOV B,A
2
MUL AB ;求b
22
ADD A,30H ;求a+b MOV 30H,A MOV A,B ADDC A,31H MOV 31H,A MOV A,30H
ADD A,#5 ;加5 MOV 30H,A MOV A,31H
ADDC A,#0 ;加上低8位的进位 MOV 31H,A
SJMP $ ;停机 END
评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
56、已知89C51单片机的晶体振荡频率为24MHz,请编程从P1.0和P1.1口输出互补的(即互为反相)、频率为100Hz的方波。(要求:T1工作在方式2下,采用中断方式工作,在中断服务程序中控制P1.0和P1.1的输出)
解: 100Hz的方波其周期=1/100=10ms,只需要每隔5ms将输出取反即可。
T1在24MHz晶振情况下方式2的最大定时时间=256*12/24=128微秒,因此只需要定时0.1ms,并对中断次数计50次即可得到5ms的定时。T1定时初值=256-100*24/12=6 ORG 0 LJMP START ORG 1BH LJMP TS ORG 30H
START: MOV TMOD,#20H ;设T1为方式2,定时器 MOV TH1,#6 ;送0.1ms定时初值 MOV TL1,#6
SETB ET1 ;允许T1中断 SETB EA ;开中断
MOV R2,#50 ;中断50次为5ms CLR P1.0
SETB TR1 ;启动T1计数 SJMP $ ;等待中断
TS: DJNZ R2,TS1 ;不到5ms则转移 MOV R2,#50 ;中断50次为5ms CPL P1.0 ;输出取反 CPL P1.1
TS1: RETI ;中断返回 END
评分办法:不要求写出程序的注释。T1的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
2
57、若内部RAM的(30H)=X,(31H)=Y,请编程实现Z=X+5Y(设Z<65536),并将结果保存到片外RAM的1000H和1001H单元(1001H单元存放结果的高8位,1000H单元存放结果的低8位)。 解: ORG 0
MOV DPTR,#1000H ;结果地址指针赋值 MOV A,30H ;取X
第20页 共27页
MOV B,A
2
MUL AB ;求X
2
MOVX @DPTR,A ;存X低8位
INC DPTR ;指向结果单元高8位 MOV A,B
2
MOVX @DPTR,A ;存X高8位
DEC DPL ;指向结果单元低8位 MOV A,31H ;取Y MOV B,#5
MUL AB ;求5Y MOV R0,A MOVX A,@DPTR
2
ADD A,R0 ;求X+5Y的低8位和
2
MOVX @DPTR,A ;存X+5Y的低8位和 INC DPTR ;指向结果单元高8位 MOVX A,@DPTR ;取结果单元高8位
2
ADDC A,B ;求X+5Y的高8位和(注意加上低8位的进位)
2
MOVX @DPTR,A ;存X+5Y的高8位和 SJMP $ ;停机 END
评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
58、已知89C51单片机的晶体振荡频率为24MHz,请编程从P1.0口输出频率为2Hz的方波。(要求:T0工作在方式1下,采用中断方式工作,在中断服务程序中控制P1.0的输出)
解:2Hz的方波其周期为500ms,半周期是250ms。利用T0定时25ms,并对中断计10次即可。 25ms的定时初值为:65536-25000*24/12=15536=3CB0H ORG 0 LJMP START ORG 0BH LJMP TS ORG 30H
STRAT: MOV TMOD,#1 ;设T0为定时器,方式1 MOV TH0,#3CH
MOV TL0,#0B0H ;送25ms定时初值 MOV R0,#10 ;中断10次为250ms SETB ET0 ;允许T0中断 SETB EA ;开中断
SETB TR0 ;启动T0计数 SJMP $ ;等待中断 TS: MOV TH0,#3CH
MOV TL0,#0B0H ;送25ms定时初值 DJNZ R0,TS1
MOV R0,#10 ;中断计次单元重新赋值 CPL P1.0 ;输出取反 TS1: RETI END
评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
59、89C51单片机应用系统的晶体振荡器频率为24MHz,请编程实现从单片机的P1.3引脚输出100Hz方波。(要求:T1采用中断方式工作,工作在方式2下,在中断服务程序中控制P1.3的输出。)
解:100Hz方波的周期是1/100=10ms,其半周期为5ms。将T1定时0.1ms,对定时中断计50次即可。 T1的定时初值为:256-100*24/12=56=38H ORG 0 LJMP START ORG 1BH LJMP TS ORG 30H
START: MOV TMOD,#20H ;设T1为定时器,方式2 MOV TH1,#56
MOV TL1,#56 ;送0.1ms定时初值 SETB ET1 ;允许T1中断 SETB EA ;开中断
MOV R0,#50 ;中断50次为5ms SETB TR1 ;启动T1计数 SJMP $ ;等待中断
TS: DJNZ R0,TS1 ;中断不够50次则跳转 MOV R0,#50 ;中断50次为5ms CPL P1.3 ;输出取反 TS1:RETI ;中断返回 END
评分办法:不要求写出程序的注释。T1的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
60、设内部RAM 20H单元为数据块的起始地址,数据块长度为32字节。请将整个数据块求和(共
第21页 共27页
32字节的数据求和,设和小于65536),并把和存入外部RAM 1000H和1001H的单元中(和的高8位存入1001H单元)。
解: ORG 0
MOV R0,#20H ;数据块首地址送R0 MOV R2,#32 ;数据块长度送R2 CLR A ;累加器清零 MOV DPTR,#1000H ;指向和的低8位 MOVX @DPTR,A ;和的低8位清零 INC DPTR ;指向和的高8位 MOVX @DPTR,A ;和的高8位清零 DEC DPL ;指向和的低8位 LOOP: MOV A,@R0 ;取数据 MOV R1,A ;暂存在R1 MOVX A,@DPTR ;取和的低8位 ADD A,R1 ;求和
MOVX @DPTR,A ;存和的低8位 INC DPTR ;指向和的高8位 MOVX A,@DPTR ;取和的高8位
ADDC A,#0 ;将和的低8位的进位加到高8位中 MOVX @DPTR,A ;存和的高8位 DEC DPL ;指向和的低8位 INC R0 ;数据块指针加1 DJNZ R2,LOOP ;没有加完则循环 SJMP $ ;停机 END
评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
22
61、若内部RAM的(20H)=a,(21H)=b,请编程实现y=a+b(设y<65536),并将结果保存到片外RAM的2000H和2001H单元(2001H单元存放结果的高8位,2000H单元存放结果的低8位)。 解: ORG 0
MOV DPTR,#2000H ;结果单元低8位地址送DPTR MOV A,20H ;取a的值 MOV B,A
2
MUL AB ;求a
2
MOVX @DPTR,A ;存a低8位 MOV A,B
INC DPTR ;指向结果单元高8位 MOVX @DPTR,A ;存结果高8位 DEC DPL ;指向结果单元低8位 MOV A,21H ;取b的值 MOV B,A
2
MUL AB ;求b
2
MOV R0,A ;暂存b的低8位 MOVX A,@DPTR ;取结果低8位 ADD A,R0 ;求低8位的和 MOVX @DPTR,A ;存结果低8位
INC DPTR ;指向结果单元高8位 MOVX A,@DPTR ;取结果高8位
2
ADDC A,B ;加上b的高8位和低8位求和的进位 MOVX @DPTR,A ;存结果高8位 SJMP $ ;停机 END
评分办法:不要求写出程序的注释,也不要求使用子程序。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
62、已知89C52单片机的晶体振荡频率为12MHz,请编程从P1.6和P1.7口输出互补的(即互为反相)、频率为4Hz的方波。(要求:T1工作在方式1下,采用中断方式工作,在中断服务程序中控制P1.6和P1.7的输出)
解:4Hz方波的周期为250ms,其半周期为125ms。只要利用T1产生5ms的定时中断,对该定时中断计25次即可得到125ms定时。
5ms定时初值为:65536-5000*12/12=60536=0EC78H 程序清单如下: ORG 0
LJMP START ;跳转到START处 ORG 1BH
LJMP TS ;跳转到定时器1中断服务程序 ORG 40
START: MOV TMOD,#10H ;设T1为定时器,方式1 MOV TH1,#0ECH
MOV TL1,#78H ;送5ms定时初值 SETB ET1 ;允许T1中断 SETB EA ;开中断
MOV R0,#25 ;中断25(19H)次为125ms
CLR P1.6 ;P1.6输出低电平,P1.7复位后为高电平 SETB TR1 ;启动T1计数 SJMP $ ;等待中断 TS: MOV TH1,#0ECH
第22页 共27页
MOV TL1,#78H ;送5ms定时初值 DJNZ R0,TS1 ;125ms没到则跳转
MOV R0,#25 ;中断计次单元恢复初值 CPL P1.6 ;P1.6取反输出 CPL P1.7 ;P1.7取反输出 TS1: RETI ;中断返回 END
评分办法:不要求写出程序的注释。T1的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
63、将内部RAM 40H为起始地址的32个连续单元中的十六进制数转换成ASCⅡ码存入外部RAM 3000H开始的存储单元中。 解: ORG 0
MOV R0,#40H ;源数据块首地址送R0 MOV R2,#32 ;数据块长度送R2
MOV DPTR,#3000H ;目的数据块首地址送DPTR LOOP: MOV A,@R0 ;取待转换数据 ANL A,#0F0H ;取高四位数据
SWAP A ;高低四位数据交换 PUSH DPH ;保护目标地址指针 PUSH DPL
MOV DPTR,#TAB ;数据指针指向表格首地址 MOVC A,@A+DPTR ;查表得到ASCII码 POP DPL ;恢复目标地址指针 POP DPH
MOVX @DPTR,A ;存转换结果
INC DPTR ;指向下一个存储单元 MOV A,@R0 ;取待转换数据 ANL A,#0FH ;取低四位数据
PUSH DPH ;保护目标地址指针 PUSH DPL
MOV DPTR,#TAB ;数据指针指向表格首地址 MOVC A,@A+DPTR ;查表得到ASCII码 POP DPL ;恢复目标地址指针 POP DPH
MOVX @DPTR,A ;存转换结果
INC DPTR ;指向下一个存储单元 INC R0 ;指向下一个待转换数据 DJNZ R2,LOOP ;没有转换完则继续 SJMP $ ;停机 TAB: DB ‘0123456789ABCDEF’ END
评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
64、已知89C52单片机的晶体振荡频率为24MHz,请编程从P1.5输出频率为10Hz、占空比为10%(即高电平持续时间为信号周期的10%,低电平持续时间为信号周期的90%)的矩形波。(要求:T1工作在方式1下,采用中断方式工作,在中断服务程序中控制P1.5的输出)
解:设计思路为:输出信号周期=1/10=0.1秒=100ms,因此输出信号的高电平持续时间为10ms,低电平持续时间为90ms。设定T1的定时时间为10ms,对T1定时中断记9次即可得到90ms的定时。 T1的定时初值=65536-10*1000*24/12=45536=0B1E0H 程序清单如下:
ORG 0
LJMP START ;跳转到主程序入口
ORG 1BH ;T1中断服务程序入口地址 LJMP TS ;跳转到定时中断服务程序 ORG 30H
START: MOV TMOD,#10H ;设定T1为定时器,方式1 MOV TH1,#0B1H ;送10ms定时初值 MOV TL1,#0E0H
SETB ET1 ;允许T1中断 SETB EA ;开中断
MOV R2,#9 ;送低电平中断次数
SETB F0 ;高电平标志置1,表示输出高电平 SETB TR1 ;启动T1计数 SJMP $ ;等待中断
TS: MOV TH1,#0B1H ;送10ms定时初值 MOV TL1,#0E0H
JNB F0,TS1 ;如果目前输出低电平则转移
CLR F0 ;高电平标志清零,表示该输出低电平。 CLR P1.5 ;输出低电平 SJMP TS2
TS1: DJNZ R2,TS2 ;90ms没到则转移 MOV R2,#9 ;中断次数送R2
SETB F0 ;高电平标志置1,表示该输出高电平 SETB P1.5 ;输出高电平
第23页 共27页
TS2: RETI ;中断返回 END
评分办法:不要求写出程序的注释。T1的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
65、设内部RAM 20H单元为数据块的起始地址,数据块长度为10H,数据为8位无符号数,试编程找出数据块中的最小值,并将其存入40H单元。 解:
ORG 0
MOV R0,#20H ;数据区首地址送R0 MOV R2,#10H ;数据块长度送R2 MOV 40H,#0FFH ;结果单元送入最大值 LOOP: MOV A,@R0 ;取数据 CLR C ;清进位
SUBB A,40H ;利用减法判断该数据是否比最小值单元的数小?
JNC NEXT ;如果没有借位说明待比较数据比最小值单元的值大则转移 MOV A,@R0 ;取最小值 MOV 40H,A ;存最小值 NEXT: INC R0 ;修改地址指针
DJNZ R2,LOOP ;没有比较完则继续比较。 SJMP $ ;停机 END
评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
66、已知8051单片机的晶体振荡频率为6MHz,请编程从P1.3和P1.2口输出互补的(即互为反相)、频率为20Hz的方波。(要求:T0工作在方式2下,采用中断方式工作,在中断服务程序中控制P1.1和P1.0的输出)。
解:20Hz方波周期=1/20=50ms,只需每25ms将输出取反即可。方式2下最大定时时间0.512ms,可以设定定时0.5ms,对于0.5ms定时中断计50次即可得到25ms定时。 T0定时初值=256-500*6/12=6 ORG 0 LJMP START ORG 0BH LJMP TS ORG 30H
START: CLR P1.2 ;P1.2清为低电平,P1.3上电后是高电平 MOV TMOD,#02H ;设T0为方式2,定时器
MOV TH0,#6 ;送0.5ms定时初值 MOV TL0,#6
MOV R2,#50 ;中断50次为25ms SETB ET0 ;允许T0中断 SETB EA ;开中断
SETB TR0 ;启动定时计数 SJMP $ ;等待中断
TS: DJNZ R2,TS1 ;10ms没到则返回 MOV R2,#50 ;中断50次为25ms CPL P1.3 ;输出取反 CPL P1.2 TS1: RETI END
评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
67、比较两个ASCII码字符串是否相等。字符串长度在内部RAM 2FH单元,两字符串的首地址分别为30H、40H。如果两个字符串相等,置CY=1,否则,置CY=0。 解: ORG 0
MOV R0,#30H ;第一个字符串首地址送R0 MOV R1,#40H ;第一个字符串首地址送R1 MOV R2,2FH ;取字符串长度
LOOP: MOV A,@R0 ;取第一个字符串的字符 CLR C
SUBB A,@R1 ;比较两个字符是否相等
JNZ STOP ;结果不为零说明两个字符串不相等 INC R0 ;修改地址指针 INC R1
DJNZ R2,LOOP ;没有比较完则继续
SETB C ;比较完,置两字符串相等标志 SJMP $ ;停机
STOP: CLR C ;两字符串不相等,清进位标志 SJMP $ ;停机 END
评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
68、已知8051单片机系统时钟频率fosc=12MHz,试编写程序,使P1.0输出如下的矩形脉冲(要求利
第24页 共27页
用中断技术,使用定时器0,并且其工作在方式2下)。
P1.0 → 40μs ←-- 1ms --→ 解:1ms/40μs=25,因此可以设定T0定时40μs,对40μs中断计25次即可得到1ms。 T0定时初值=256-40*12/12=216=0D8H。 ORG 0 LJMP START ORG 0BH LJMP TS ORG 30H
START: MOV TMOD,#02H ;设T0为定时器,方式2 MOV TH0,#216 ;送40μs定时初值 MOV TL0,#216
MOV R2,#25 ; 40μs中断25次为1ms SETB F0 ;高电平标志位,“1”表示输出高电平。 SETB ET0 ;允许T0中断 SETB EA ;开中断 SETB TR0 ;启动定时 SJMP $ ;等待中断
TS: JB F0,TS1 ;如果当前输出高电平则转移 DJNZ R2,TS2 ;输出低电平时间未到则返回 MOV R2,#25 ; 40μs中断25次为1ms SETB P1.0 ;输出高电平
SETB F0 ;输出高电平标志置1 TS2: RETI
TS1: CLR P1.0 ;输出低电平
CLR F0 ;清输出高电平标志 RETI END
评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
69、将MCS51内部RAM 60H~65H单元存放的12个16进制数变为ASCII码,存放到0100H单元开始的外部RAM中。
解: ADDR1 EQU 60H ADDR2 EQU 0100H LEN EQU 6
ORG 0
MOV R0,#ADDR1 ;待转换数据首地址送R0
MOV DPTR,#ADDR2 ;转换后ASCII码存放首地址送DPTR MOV R2,#LEN ;原数据长度送R2 LOOP: MOV A,@R0 ;取待转换数据
ANL A,#0FH ;取待转换数据低四位 PUSH DPH ;保护目的区地址指针 PUSH DPL
MOV DPTR,#TAB ;码表首地址送DPTR MOVC A,@A+DPTR ;查表
POP DPL ;恢复目的区地址指针 POP DPH
MOVX @DPTR,A ;存转换好的ASCII码 INC DPTR ;目的地址加1
MOV A,@R0 ;取待转换数据 SWAP A ;高低四位交换
ANL A,#0FH ;取待转换高四位数据 PUSH DPH ;保护目的区地址指针 PUSH DPL
MOV DPTR,#TAB ;码表首地址送DPTR MOVC A,@A+DPTR ;查表
POP DPL ;恢复目的区地址指针 POP DPH
MOVX @DPTR,A ;存转换好的ASCII码 INC DPTR ;目的地址加1 INC R0 ;原地址指针加1 DJNZ R2,LOOP ;没有转换完则转移 SJMP $ ;停机 TAB: DB ‘0123456789ABCDEF’
END
评分办法:不要求使用伪指令,也不要求写出程序的注释。程序设计中也可以先转换高四位。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
70、已知MCS-51单片机应用系统的晶振频率为12MHz,现要求在P1.0上输出周期为200ms、占空比为1:1的方波,输出500个方波后停止输出,请编程实现。要求:使用T0,并工作在方式1、中断方式下,在中断服务程序中实现对P1.0输出方波进行控制。
解:方波周期200ms,只需要每隔半周期100ms将P1.0取反即可。12MHz晶振下T0定时时间最大只有65.536ms,因此将T0的定时时间设为50ms,中断2次即为100ms。输出500个方波即P1.0的状态变
第25页 共27页
化1000次即可。
T0的定时初值为:65536-50000*12/12=15536=3CB0H ORG 0 LJMP START ORG 0BH LJMP TS ORG 30H
START: MOV TMOD,#01H ;T0设为方式1 MOV TH0,#3CH ;送50ms定时初值 MOV TL0,#0B0H SETB ET0 SETB EA
MOV R2,#2 ;中断2次为100ms
MOV R3,#250 ;P1.0发生1000(250*4)次状态变化为输出500个方波 MOV R4,#4
SETB TR0 ;启动定时 SJMP $ ;等待中断
TS: MOV TH0,#3CH ;送50ms定时初值 MOV TL0,#0B0H
DJNZ R2,TS1 ;100ms未到则返回 MOV R2,#2 ;中断2次为100ms CPL P1.0 ;输出取反
DJNZ R3,TS1 ;输出变化不够250次则返回 MOV R3,#250 ;为下一次的250次循环赋初值 DJNZ R4,TS1 ;输出变化不到1000次则返回
CLR TR0 (或CLR EA) ;停止定时(或禁止中断) TS1: RETI ;中断返回 END
评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
71、将片外数据存储器的2500H单元与2501H单元中的数据作十进制加法运算,和送入2503H和2502H单元中,即(2500H)+(2501H)→(2503H)(2502H)。 解:
ORG 0
MOV DPTR,#2500H ;指向被加数 MOVX A,@DPTR ;取被加数 MOV R0,A ;存被加数 INC DPTR ;指向加数 MOVX A,@DPTR ;取加数 ADD A,R0 ;求和
DA A ;十进制调整 INC DPTR ;指向和的低8位 MOVX @DPTR,A ;存和的低8位 INC DPTR ;指向和的高8位 ADDC A,#0 ;计算和的高8位 MOVX @DPTR,A ;存和的高8位 SJMP $ ;停机 END
评分办法:要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
72、已知AT89C51单片机系统晶振频率fosc=24MHz,试编写程序,使P1.1输出频率为500Hz的方波信号(要求在中断服务程序中控制P1.1的输出,使用定时器1,并且其工作在方式2下)。 解:500Hz方波的周期是1/500=0.002s=2ms,其半周期为1ms。
在24MHz晶振下,T1在方式2下的最大定时时间为256*12/24=128μs 故选择T1定时100μs,中断10次即为1ms。 T1的定时初值为:256-100*24/12=56 ORG 0 LJMP START ORG 1BH LJMP TS ORG 30H
START: MOV TMOD,#20H ;设T1为方式2,定时器 MOV TH1,#56 ;100μs MOV TL1,#56
SETB ET1 ;允许T1中断 SETB EA ;开中断
MOV R2,#10 ;中断10次为1ms CLR P1.1 ;输出低电平 SETB TR ;启动计数 SJMP $ ;等待中断
TS: DJNZ R2,TS1 ;1ms没到则返回 MOV R2,#10 ;中断10次为1ms CPL P1.1 ;输出取反 TS1: RETI ;中断返回 END
第26页 共27页
评分办法:不要求写出程序的注释。T1的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。
第27页 共27页
因篇幅问题不能全部显示,请点此查看更多更全内容