《单片机》编程题题库答案.docx
《《单片机》编程题题库答案.docx》由会员分享,可在线阅读,更多相关《《单片机》编程题题库答案.docx(67页珍藏版)》请在冰豆网上搜索。
《单片机》编程题题库答案
《单片机原理及应用》编程题题库参考答案六
1、内部RAM30H和31H单元中存放着2个0-9的ASCII码(高位字节在前),请将其转换为压缩BCD码(高位在前)并存入外部RAM2300H单元中。
解:
ORG0H
LJMPSTART
ORG30H
START:
MOVA,30H
ANLA,#0FH
SWAPA
MOVR0,A
MOVA,31H
ANLA,#0FH
ORLA,R0
MOVDPTR,#2300H
MOVX@DPTR,A
END
评分办法:
不要求写出程序的注释。
程序设计思路正确可得5分,指令完全写对可得10分。
若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
2、将存放在内部RAM30H-35H单元的压缩型BCD码转换成相应的ASCII码,依次存放到外部RAM2100H开始的单元区中。
ORG0H
LJMPSTART
ORG30H
START:
MOVR0,#30H
MOVR2,#06H
MOVDPTR,#2100H
LOOP:
MOVA,@R0
SWAPA
ANLA,#0FH
ORLA,#30H
MOVX@DPTR,A
INCDPTR
MOVA,@R0
ANLA,#0FH
ORLA,#30H
MOVX@DPTR,A
INCDPTR
INCR0
DJNZR2,LOOP
SJMP$
END
评分办法:
不要求写出程序的注释。
程序设计思路正确可得5分,指令完全写对可得10分。
若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
3、内部RAM20H和30H开始的单元分别存放着16个16进制数,请将对应单元的内容相加(不考虑溢出),并将和存入外部RAM2000H开始的单元中。
解:
ORG0
LJMPSTART
ORG30H
START:
MOVR0,#20H
MOVR1,#30H
MOVDPTR,#2000H
MOVR2,#08H;每个单元存放2个16进制数,故16个16进制数占用8个单元
LOOP:
MOVA,@R0
ADDA,@R1
MOVX@DPTR,A
INCR0
INCR1
INCDPTR
DJNZR2,LOOP
SJMP$
END
评分办法:
不要求写出程序的注释。
程序设计思路正确可得5分,指令完全写对可得10分。
若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
4、请编写多字节无符号数减法程序。
被减数存放在内部RAM20H开始的8个单元中,减数存放在内部RAM30H开始的8个单元,请将差存放到外部RAM2000H开始的8个单元中,借位存放到OV标志中。
注意:
所有数据均按照从低字节到高字节的顺序存放。
ORG0
LJMPSTART
ORG30H
START:
MOVR0,#20H
MOVR1,#30H
MOVDPTR,#2000H
MOVR2,#08H
CLRC
LOOP:
MOVA,@R0
SUBBA,@R1
MOVX@DPTR,A
INCR0
INCR1
INCDPTR
DJNZR2,LOOP
MOVOV,C
SJMP$
END
评分办法:
不要求写出程序的注释。
程序设计思路正确可得5分,指令完全写对可得10分。
若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
5、内部RAM40H和41H单元中存放着2个0-9的ASCII码(高位字节在前),请将其转换为压缩BCD码(高位在前)并存入外部RAM2000H单元中。
解:
ORG0H
LJMPSTART
ORG30H
START:
MOVA,40H
ANLA,#0FH
SWAPA
MOVR0,A
MOVA,41H
ANLA,#0FH
ORLA,R0
MOVDPTR,#2000H
MOVX@DPTR,A
END
评分办法:
不要求写出程序的注释。
程序设计思路正确可得5分,指令完全写对可得10分。
若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
6、将存放在内部RAM20H-2FH单元的压缩型BCD码(高位在前)转换成相应的ASCII码,依次存放到外部RAM1000H开始的单元区中。
ORG0H
LJMPSTART
ORG30H
START:
MOVR0,#20H
MOVR2,#10H
MOVDPTR,#1000H
LOOP:
MOVA,@R0
SWAPA
ANLA,#0FH
ORLA,#30H(或ADDA,#30H)
MOVX@DPTR,A
INCDPTR
MOVA,@R0
ANLA,#0FH
ORLA,#30H(或ADDA,#30H)
MOVX@DPTR,A
INCDPTR
INCR0
DJNZR2,LOOP
SJMP$
END
评分办法:
不要求写出程序的注释。
程序设计思路正确可得5分,指令完全写对可得10分。
若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
7、内部RAM30H和38H开始的单元分别存放着8个压缩BCD码,请将对应单元的内容相加(不考虑溢出),并将和存入外部RAM1000H开始的单元中。
解:
ORG0
LJMPSTART
ORG30H
START:
MOVR0,#30H
MOVR1,#38H
MOVDPTR,#1000H
MOVR2,#08
LOOP:
MOVA,@R0
ADDA,@R1
DAA
MOVX@DPTR,A
INCR0
INCR1
INCDPTR
DJNZR2,LOOP
SJMP$
END
评分办法:
不要求写出程序的注释。
程序设计思路正确可得5分,指令完全写对可得10分。
若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
8、请编写多字节无符号数加法程序。
被加数存放在内部RAM20H开始的8个单元中,加数存放在内部RAM30H开始的8个单元,请将和存放到外部RAM2000H开始的8个单元中,进位存放到F0标志中。
注意:
所有数据均按照从低字节到高字节的顺序存放。
ORG0
LJMPSTART
ORG30H
START:
MOVR0,#20H
MOVR1,#30H
MOVDPTR,#2000H
MOVR2,#08H
CLRC
LOOP:
MOVA,@R0
ADDCA,@R1
MOVX@DPTR,A
INCR0
INCR1
INCDPTR
DJNZR2,LOOP
MOVF0,C
SJMP$
END
评分办法:
不要求写出程序的注释。
程序设计思路正确可得5分,指令完全写对可得10分。
若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
9、两个8字节压缩BCD码分别存放在内部RAM30H和40H开始的连续单元中(低位字节在前),请将二者求和(不考虑溢出情况),并将和存入外部RAM1000H开始的单元中。
解:
ORG0
MOVR0,#30H
MOVR1,#40H
MOVDPTR,#1000H
MOVR2,#8
CLRC
LOOP:
MOVA,@R0
ADDCA,@R1
DAA
MOVX@DPTR,A
INCR0
INCR1
INCDPTR
DJNZR2,LOOP
SJMP$
END
10、将存放在内部RAM20H-2FH单元的十六进制数转换成ASCII码,依次存放到外部RAM2000H开始的单元中。
解:
MOVR0,#20H
MOVR2,#16
MOVDPTR,#2000H
MOVR3,DPH
MOVR4,DPL
LOOP:
MOVA,@R0
ANLA,#0FH
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVDPH,R3
MOVDPL,R4
MOVX@DPTR,A
INCDPTR
MOVR3,DPH
MOVR4,DPL
MOVA,@R0
SWAPA
ANLA,#0FH
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVDPH,R3
MOVDPL,R4
MOVX@DPTR,A
INCDPTR
MOVR3,DPH
MOVR4,DPL
INCR0
DJNZR2,LOOP
SJMP$
TAB:
DB‘0123456789ABCDEF’
END
11、内部RAM30H和外部RAM2200H开始的单元分别存放着两个8字节十六进制数(低位字节存放在前),请将二者相加(不考虑溢出情况),并将和存入内部RAM40H开始的单元中。
解:
ORG0
MOVR0,#30H
MOVR1,#40H
MOVDPTR,#2200H
MOVR2,#8
CLRC
LOOP:
MOVXA,@DPTR
ADDCA,@R0
MOV@R1,A
INCR0
INCR1
INCDPTR
DJNZR2,LOOP
SJMP$
END
12、请编写多字节无符号数减法程序。
被减数存放在内部RAM30H开始的8个单元中,减数存放在内部RAM38H开始的8个单元,请将差存放到外部RAM1000H开始的8个单元中,借位存放到F0标志中。
注意:
所有数据均按照从低字节到高字节的顺序存放。
解:
ORG0
LJMPSTART
ORG30H
START:
MOVR0,#30H
MOVR1,#38H
MOVDPTR,#1000H
MOVR2,#8
CLRC
LOOP:
MOVA,@R0
SUBBA,@R1
MOVX@DPTR,A
INCR0
INCR1
INCDPTR
DJNZR2,LOOP
MOVC,F0
SJMP$
END
13、请编写多字节无符号数减法程序。
被减数存放在内部RAM20H开始的16个单元中,减数存放在内部RAM30H开始的16个单元,请将差存放到外部RAM2000H开始的16个单元中,借位存放到OV标志中。
注意:
所有数据均按照从低字节到高字节的顺序存放。
解:
ADDR1EQU20H
ADDR2EQU30H
LENEQU16
ADDR3EQU2000H
ORG0
LJMPSTART
ORG30H
START:
MOVR0,#ADDR1
MOVR1,#ADDR2
MOVDPTR,#ADDR3
MOVR2,#LEN
CLRC
LOOP:
MOVA,@R0
SUBBA,@R1
MOVX@DPTR,A
INCR0
INCR1
INCDPTR
DJNZR2,LOOP
MOVOV,C
SJMP$
END
14、将存放在内部RAM20H-3FH单元的压缩BCD码转换成ASCII码,依次存放到外部RAM2300H开始的单元中。
(注:
每个单元均先转换高四位)
解:
LENEQU20H
ADDR1EQU20H
ADDR2EQU2300H
ORG0
LJMPSTART
ORG30H
START:
MOVR0,#ADDR1
MOVDPTR,#ADDR2
MOVR2,#LEN
LOOP:
MOVA,@R0
ANLA,#0F0H
SWAPA
ORLA,#30H(或ADDA,#30H)
MOVX@DPTR,A
INCDPTR
MOVA,@R0
ANLA,#0FH
ORLA,#30H(或ADDA,#30H)
MOVX@DPTR,A
INCDPTR
INCR0
DJNZR2,LOOP
SJMP$
END
评分办法:
程序设计思路正确可得5分,指令完全写对可得10分。
不要求使用伪指令。
若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
15、将存放在内部RAM30H-35H单元的十六进制数转换成相应的ASCII码,依次存放到外部RAM1100H开始的单元区中。
(注:
每个字节转换时先转换高四位)
解:
ORG0
MOVR0,#30H
MOVDPTR,#1100H
MOVR2,#6
LOOP:
MOVA,@R0;取需要转换的数
ANLA,#0F0H;屏蔽低4位
SWAPA
PUSHDPH
PUSHDPL;保护目的地址
MOVDPTR,#TAB
MOVCA,@A+DPTR;查表得ASCII码
POPDPL
POPDPH;恢复目的地址
MOVX@DPTR,A;存转换后的ASCII码
INCDPTR;修改目的地址指针
MOVA,@R0;取需要转换的数
ANLA,#0FH;屏蔽高4位
PUSHDPH
PUSHDPL;保护目的地址
MOVDPTR,#TAB
MOVCA,@A+DPTR;查表得ASCII码
POPDPL
POPDPH;恢复目的地址
MOVX@DPTR,A
INCDPTR;修改目的地址指针
INCR0;修改源地址指针
DJNZR2,LOOP;未转换完则继续
SJMP$
TAB:
DB‘0123456789ABCDEF’
END
评分办法:
程序设计思路正确可得5分,指令完全写对可得10分。
若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
16、内部RAM30H开始的单元中存放着16个0-9的ASCII码(高位字节在前),请将其转换为压缩BCD码(高位在前)并存入外部RAM1000H开始的单元中。
解:
ORG0
MOVR0,#30H
MOVDPTR,#1000H
MOVR2,#8;16个ASCII码转换为8个压缩BCD码
LOOP:
MOVA,@R0
ANLA,#0FH;屏蔽高4位得到BCD码
SWAPA
MOVR1,A
INCR0;指向下一个ASCII码
MOVA,@R0
ANLA,#0FH;屏蔽高4位得到BCD码
ORLA,R1;合成压缩BCD码
MOVX@DPTR,A;存压缩BCD码
INCDPTR
INCR0
DJNZR2,LOOP
SJMP$
END
17、设有两个长度为16字节的数组,分别存放在外部RAM0200H和0300H为首址的存储区域中,试编写程序求其对应项之和(不考虑溢出的情况),结果存放在以0400H为首址的外部RAM中。
解:
参考程序清单如下:
ORG0
MOVR2,#16;数组长度为16个字节
MOVR3,#02H;数组1的首地址高8位
MOVR4,#03H;数组2的首地址高8位
MOVR5,#04H;和数组的首地址高8位
MOVDPL,#0;数据指针低8位清零
LOOP:
MOVDPH,R3
MOVXA,@DPTR;取被加数
MOVR1,A;存被加数
MOVDPH,R4
MOVXA,@DPTR;取加数
ADDA,R1;求和
MOVDPH,R5
MOVX@DPTR,A;存和
INCDPL;指向下一字节
DJNZR2,LOOP;未加完则循环
END
评分办法:
程序设计思路正确可得5分,指令完全写对可得10分。
若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
18、编程求内部RAM中40H~4FH共16个单元中的内容的和(结果为2字节),并将和放入50H和51H单元中(高8位在50H)。
解:
参考程序清单如下:
ORG0
LJMPSTART
ORG30H
START:
MOVR0,#40H;数据区首地址送R0
MOVR2,#16;单元数送R2
MOVR3,#0;和的高8位清零
CLRA;和的低8位清零
LOOP:
CLRC
ADDA,@R0;求和
JNCNEXT;没有进位则转移
INCR3;和的高8位存储单元内容加1
NEXT:
INCR0;指向下一个单元
DJNZR2,LOOP;没加完则循环,和在R3和A中
MOV51H,A;存低8位结果
MOV50H,R3;存高8位结果
SJMP$
END
19、有一个长度为16字节的ASCII码字符串存放在外部RAM1000H为首址的存储区域中,字符串中的每一个字符均不相同,试编写程序查找字符串中是否存在ASCII码“9”。
如果在字符串中存在ASCII码“9”,则将其存储单元的地址存放到内部RAM30H和31H单元中(高8位地址在30H单元中),同时将OV标志位清零。
否则,将30H和31H单元的内容清零,并将OV标志位置“1”。
解:
ORG0
MOVSP,#60H
MOVDPTR,#1000H
MOVR2,#16
LOOP:
MOVXA,@DPTR
CJNEA,#39H,EXIT
MOV30H,DPH
MOV31H,DPL
CLROV
SJMP$
EXIT:
INCDPTR
DJNZR2,LOOP
MOV30H,#0
MOV31H,#0
SETBOV
SJMP$
END
20、有两个8字节的16进制数a和b,它们分别存放在内部RAM中30H~37H和40H~47H的单元中(高位字节在前)。
请编程求a-b,并将差存入30H开始的内部RAM单元中(高位字节在前)。
若差小于零则将F0标志位置“1”,否则清零。
解:
设计思路:
从16进制数的最低位字节(37H和47H)开始相应字节带借位相减,然后修改地址指针在对次低位字节进行相减,一共循环8次完成两个8字节16进制数的相减。
最后将Cy标志的内容传送给F0标志位即可。
ORG0
MOVR0,#37H
MOVR1,#47H
MOVR2,#8
CLRC
LOOP:
MOVA,@R0
SUBBA,@R1
MOV@R0,A
DECR0
DECR1
DJNZR2,LOOP
MOVF0,C
SJMP$
END
21、若外部RAM的(3000H)=X,(3001H)=Y,编程实现Z=X*X+2Y,并将结果存到片内RAM的40H单元(设Z<256)。
解:
XEQU3000H
YEQU3001H
ZEQU40H
ORG0
MOVDPTR,#X;变量X的地址送DPTR
MOVXA,@DPTR;取变量X
MOVB,A;变量X的值送给B寄存器
MULAB;求X*X,根据题意知积为1字节(在A中)
MOVR0,A;X*X的结果存入R0中
INCDPTR;指向变量Y
MOVXA,@DPTR;取变量Y
MOVB,#2
MULAB;求2*Y,根据题意知积为1字节(在A中)
ADDA,R0;求X*X+2*Y
MOVZ,A;和存入40H单元
SJMP$;停机
END
评分办法:
不要求写出程序的注释和使用伪指令。
程序设计思路正确可得5分,指令完全写对可得10分。
若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
22、设外部RAM2000H单元为数据块的起始地址,数据块长度为10,试编程求数据块中的最小值,存入内部RAM30H单元。
解:
设计思路:
将数据块的第1个数据放入结果单元,然后依次与剩余的9个数据进行比较。
如果新的数据比结果单元中的数据还小则将该数据存入结果单元,9次比较完成则结果单元中的数据就是最小值。
ORG0
MOVDPTR,#2000H
MOVXA,@DPTR;取数据块的第一个数
MOV30H,A;存入结果单元
MOVR2,#9;共比较9次
INCDPTR;指向第2个数
LOOP:
CLRC
MOVXA,@DPTR
SUBBA,30H
JNCLP;没有借位则说明结果单元的数小,不用更换最小值
MOVXA,@DPTR
MOV30H,A;更换最小值
LP:
INCDPTR;指向下一个数
DJNZR2,LOOP;没有比较完则继续循环
SJMP$;停机
END
评分办法:
不要求写出程序的注释。
程序设计思路正确可得5分,指令完全写对可得10分。
若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
23、若外部RAM的(1000H)=X,(1001H)=Y,请编程实现Z=2X+Y*Y+5(设Z<65536),并将结果保存到片内RAM的30H和31H单元(31H单元存放结果的高8位,30H单元存放结果的低8位)。
解:
XEQU1000H
ZHEQU31H
ZLEQU30H
ORG0
MOVZH,#0;结果单元清零
MOVZL,#0
MOVDPTR,#1000H
MOVXA,@DPTR;取X的值
MOVB,#2
MULAB;计算2X
ADDA,ZL
MOVZL,A;存结果低8位
MOVA,B;取乘积高8位
ADDA,ZH
MOVZH,A;存结果高8位
INCDPTR;指向Y
MOVXA,@DPTR;取Y
MOVB,A
MULAB;计算Y*Y
ADDA,ZL;计算结果低8位
MOVZL,A
MOVA,B;取乘积的高8位
ADDCA,ZH;计算结果高8位,注意必须带进位加
MOVZH,A
MOVA,ZL
ADDA,#5;计算结果加5
MOVZL,A
MOVZH,A;存结果低8位
ADDCA,#0;将低8位进位加到结果高8位,注意必