搜索
您的当前位置:首页正文

《单片机》编程题题库答案

来源:易榕旅网
 MOV TH0,#0ECH

《单片机原理及应用》编程题题库参考答案 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页

因篇幅问题不能全部显示,请点此查看更多更全内容

Top