• 263.00 KB
  • 2022-04-22 11:18:39 发布

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

  • 49页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'《单片机原理及应用》编程题题库参考答案六1、内部RAM30H和31H单元中存放着2个0-9的ASCII码(高位字节在前),请将其转换为压缩BCD码(高位在前)并存入外部RAM2300H单元中。解:ORG0HLJMPSTARTORG30HSTART:MOVA,30HANLA,#0FHSWAPAMOVR0,AMOVA,31HANLA,#0FHORLA,R0MOVDPTR,#2300HMOVX@DPTR,AEND评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。2、将存放在内部RAM30H-35H单元的压缩型BCD码转换成相应的ASCII码,依次存放到外部RAM2100H开始的单元区中。ORG0HLJMPSTARTORG30HSTART:MOVR0,#30HMOVR2,#06HMOVDPTR,#2100HLOOP:MOVA,@R0SWAPAANLA,#0FHORLA,#30HMOVX@DPTR,AINCDPTRMOVA,@R0ANLA,#0FHORLA,#30HMOVX@DPTR,AINCDPTR第49页共49页 INCR0DJNZR2,LOOPSJMP$END评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。3、内部RAM20H和30H开始的单元分别存放着16个16进制数,请将对应单元的内容相加(不考虑溢出),并将和存入外部RAM2000H开始的单元中。解:ORG0LJMPSTARTORG30HSTART:MOVR0,#20HMOVR1,#30HMOVDPTR,#2000HMOVR2,#08H;每个单元存放2个16进制数,故16个16进制数占用8个单元LOOP:MOVA,@R0ADDA,@R1MOVX@DPTR,AINCR0INCR1INCDPTRDJNZR2,LOOPSJMP$END评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。4、请编写多字节无符号数减法程序。被减数存放在内部RAM20H开始的8个单元中,减数存放在内部RAM30H开始的8个单元,请将差存放到外部RAM2000H开始的8个单元中,借位存放到OV标志中。注意:所有数据均按照从低字节到高字节的顺序存放。ORG0LJMPSTARTORG30HSTART:MOVR0,#20HMOVR1,#30HMOVDPTR,#2000H第49页共49页 MOVR2,#08HCLRCLOOP:MOVA,@R0SUBBA,@R1MOVX@DPTR,AINCR0INCR1INCDPTRDJNZR2,LOOPMOVOV,CSJMP$END评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。5、内部RAM40H和41H单元中存放着2个0-9的ASCII码(高位字节在前),请将其转换为压缩BCD码(高位在前)并存入外部RAM2000H单元中。解:ORG0HLJMPSTARTORG30HSTART:MOVA,40HANLA,#0FHSWAPAMOVR0,AMOVA,41HANLA,#0FHORLA,R0MOVDPTR,#2000HMOVX@DPTR,AEND评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。6、将存放在内部RAM20H-2FH单元的压缩型BCD码(高位在前)转换成相应的ASCII码,依次存放到外部RAM1000H开始的单元区中。ORG0HLJMPSTARTORG30HSTART:MOVR0,#20HMOVR2,#10HMOVDPTR,#1000HLOOP:MOVA,@R0第49页共49页 SWAPAANLA,#0FHORLA,#30H(或ADDA,#30H)MOVX@DPTR,AINCDPTRMOVA,@R0ANLA,#0FHORLA,#30H(或ADDA,#30H)MOVX@DPTR,AINCDPTRINCR0DJNZR2,LOOPSJMP$END评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。7、内部RAM30H和38H开始的单元分别存放着8个压缩BCD码,请将对应单元的内容相加(不考虑溢出),并将和存入外部RAM1000H开始的单元中。解:ORG0LJMPSTARTORG30HSTART:MOVR0,#30HMOVR1,#38HMOVDPTR,#1000HMOVR2,#08LOOP:MOVA,@R0ADDA,@R1DAAMOVX@DPTR,AINCR0INCR1INCDPTRDJNZR2,LOOPSJMP$END评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。8、请编写多字节无符号数加法程序。被加数存放在内部RAM20H开始的8个单元中,加数存放在内部RAM30H开始的8个单元,请将和存放到外部RAM第49页共49页 2000H开始的8个单元中,进位存放到F0标志中。注意:所有数据均按照从低字节到高字节的顺序存放。ORG0LJMPSTARTORG30HSTART:MOVR0,#20HMOVR1,#30HMOVDPTR,#2000HMOVR2,#08HCLRCLOOP:MOVA,@R0ADDCA,@R1MOVX@DPTR,AINCR0INCR1INCDPTRDJNZR2,LOOPMOVF0,CSJMP$END评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。9、两个8字节压缩BCD码分别存放在内部RAM30H和40H开始的连续单元中(低位字节在前),请将二者求和(不考虑溢出情况),并将和存入外部RAM1000H开始的单元中。解:ORG0MOVR0,#30HMOVR1,#40HMOVDPTR,#1000HMOVR2,#8CLRCLOOP:MOVA,@R0ADDCA,@R1DAAMOVX@DPTR,AINCR0INCR1INCDPTRDJNZR2,LOOPSJMP$END10、将存放在内部RAM20H-2FH单元的十六进制数转换成ASCII码,依次存放到外部RAM2000H开始的单元中。解:MOVR0,#20HMOVR2,#16第49页共49页 MOVDPTR,#2000HMOVR3,DPHMOVR4,DPLLOOP:MOVA,@R0ANLA,#0FHMOVDPTR,#TABMOVCA,@A+DPTRMOVDPH,R3MOVDPL,R4MOVX@DPTR,AINCDPTRMOVR3,DPHMOVR4,DPLMOVA,@R0SWAPAANLA,#0FHMOVDPTR,#TABMOVCA,@A+DPTRMOVDPH,R3MOVDPL,R4MOVX@DPTR,AINCDPTRMOVR3,DPHMOVR4,DPLINCR0DJNZR2,LOOPSJMP$TAB:DB‘0123456789ABCDEF’END11、内部RAM30H和外部RAM2200H开始的单元分别存放着两个8字节十六进制数(低位字节存放在前),请将二者相加(不考虑溢出情况),并将和存入内部RAM40H开始的单元中。解:ORG0MOVR0,#30HMOVR1,#40HMOVDPTR,#2200HMOVR2,#8CLRCLOOP:MOVXA,@DPTRADDCA,@R0MOV@R1,AINCR0INCR1第49页共49页 INCDPTRDJNZR2,LOOPSJMP$END12、请编写多字节无符号数减法程序。被减数存放在内部RAM30H开始的8个单元中,减数存放在内部RAM38H开始的8个单元,请将差存放到外部RAM1000H开始的8个单元中,借位存放到F0标志中。注意:所有数据均按照从低字节到高字节的顺序存放。解:ORG0LJMPSTARTORG30HSTART:MOVR0,#30HMOVR1,#38HMOVDPTR,#1000HMOVR2,#8CLRCLOOP:MOVA,@R0SUBBA,@R1MOVX@DPTR,AINCR0INCR1INCDPTRDJNZR2,LOOPMOVC,F0SJMP$END13、请编写多字节无符号数减法程序。被减数存放在内部RAM20H开始的16个单元中,减数存放在内部RAM30H开始的16个单元,请将差存放到外部RAM2000H开始的16个单元中,借位存放到OV标志中。注意:所有数据均按照从低字节到高字节的顺序存放。解:ADDR1EQU20HADDR2EQU30HLENEQU16ADDR3EQU2000HORG0LJMPSTARTORG30HSTART:MOVR0,#ADDR1MOVR1,#ADDR2MOVDPTR,#ADDR3MOVR2,#LENCLRCLOOP:MOVA,@R0SUBBA,@R1第49页共49页 MOVX@DPTR,AINCR0INCR1INCDPTRDJNZR2,LOOPMOVOV,CSJMP$END14、将存放在内部RAM20H-3FH单元的压缩BCD码转换成ASCII码,依次存放到外部RAM2300H开始的单元中。(注:每个单元均先转换高四位)解:LENEQU20HADDR1EQU20HADDR2EQU2300HORG0LJMPSTARTORG30HSTART:MOVR0,#ADDR1MOVDPTR,#ADDR2MOVR2,#LENLOOP:MOVA,@R0ANLA,#0F0HSWAPAORLA,#30H(或ADDA,#30H)MOVX@DPTR,AINCDPTRMOVA,@R0ANLA,#0FHORLA,#30H(或ADDA,#30H)MOVX@DPTR,AINCDPTRINCR0DJNZR2,LOOPSJMP$END评分办法:程序设计思路正确可得5分,指令完全写对可得10分。不要求使用伪指令。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。15、将存放在内部RAM30H-35H单元的十六进制数转换成相应的ASCII码,依次存放到外部RAM1100H开始的单元区中。(注:每个字节转换时先转换高四位)第49页共49页 解:ORG0MOVR0,#30HMOVDPTR,#1100HMOVR2,#6LOOP:MOVA,@R0;取需要转换的数ANLA,#0F0H;屏蔽低4位SWAPAPUSHDPHPUSHDPL;保护目的地址MOVDPTR,#TABMOVCA,@A+DPTR;查表得ASCII码POPDPLPOPDPH;恢复目的地址MOVX@DPTR,A;存转换后的ASCII码INCDPTR;修改目的地址指针MOVA,@R0;取需要转换的数ANLA,#0FH;屏蔽高4位PUSHDPHPUSHDPL;保护目的地址MOVDPTR,#TABMOVCA,@A+DPTR;查表得ASCII码POPDPLPOPDPH;恢复目的地址MOVX@DPTR,AINCDPTR;修改目的地址指针INCR0;修改源地址指针DJNZR2,LOOP;未转换完则继续SJMP$TAB:DB‘0123456789ABCDEF’END评分办法:程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。16、内部RAM30H开始的单元中存放着16个0-9的ASCII码(高位字节在前),请将其转换为压缩BCD码(高位在前)并存入外部RAM1000H开始的单元中。第49页共49页 解:ORG0MOVR0,#30HMOVDPTR,#1000HMOVR2,#8;16个ASCII码转换为8个压缩BCD码LOOP:MOVA,@R0ANLA,#0FH;屏蔽高4位得到BCD码SWAPAMOVR1,AINCR0;指向下一个ASCII码MOVA,@R0ANLA,#0FH;屏蔽高4位得到BCD码ORLA,R1;合成压缩BCD码MOVX@DPTR,A;存压缩BCD码INCDPTRINCR0DJNZR2,LOOPSJMP$END17、设有两个长度为16字节的数组,分别存放在外部RAM0200H和0300H为首址的存储区域中,试编写程序求其对应项之和(不考虑溢出的情况),结果存放在以0400H为首址的外部RAM中。解:参考程序清单如下:ORG0MOVR2,#16;数组长度为16个字节MOVR3,#02H;数组1的首地址高8位MOVR4,#03H;数组2的首地址高8位MOVR5,#04H;和数组的首地址高8位MOVDPL,#0;数据指针低8位清零LOOP:MOVDPH,R3MOVXA,@DPTR;取被加数MOVR1,A;存被加数MOVDPH,R4MOVXA,@DPTR;取加数ADDA,R1;求和MOVDPH,R5MOVX@DPTR,A;存和INCDPL;指向下一字节DJNZR2,LOOP;未加完则循环END评分办法:程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。18、编程求内部RAM中40H~4FH共16个单元中的内容的和(结果为2字节),并将和放入50H和51H单元中(高8位在50H)。第49页共49页 解:参考程序清单如下:ORG0LJMPSTARTORG30HSTART:MOVR0,#40H;数据区首地址送R0MOVR2,#16;单元数送R2MOVR3,#0;和的高8位清零CLRA;和的低8位清零LOOP:CLRCADDA,@R0;求和JNCNEXT;没有进位则转移INCR3;和的高8位存储单元内容加1NEXT:INCR0;指向下一个单元DJNZR2,LOOP;没加完则循环,和在R3和A中MOV51H,A;存低8位结果MOV50H,R3;存高8位结果SJMP$END19、有一个长度为16字节的ASCII码字符串存放在外部RAM1000H为首址的存储区域中,字符串中的每一个字符均不相同,试编写程序查找字符串中是否存在ASCII码“9”。如果在字符串中存在ASCII码“9”,则将其存储单元的地址存放到内部RAM30H和31H单元中(高8位地址在30H单元中),同时将OV标志位清零。否则,将30H和31H单元的内容清零,并将OV标志位置“1”。解:ORG0MOVSP,#60HMOVDPTR,#1000HMOVR2,#16LOOP:MOVXA,@DPTRCJNEA,#39H,EXITMOV30H,DPHMOV31H,DPLCLROVSJMP$EXIT:INCDPTRDJNZR2,LOOPMOV30H,#0MOV31H,#0SETBOVSJMP$END20、有两个8字节的16进制数a和b,它们分别存放在内部RAM中30H~37H第49页共49页 和40H~47H的单元中(高位字节在前)。请编程求a-b,并将差存入30H开始的内部RAM单元中(高位字节在前)。若差小于零则将F0标志位置“1”,否则清零。解:设计思路:从16进制数的最低位字节(37H和47H)开始相应字节带借位相减,然后修改地址指针在对次低位字节进行相减,一共循环8次完成两个8字节16进制数的相减。最后将Cy标志的内容传送给F0标志位即可。ORG0MOVR0,#37HMOVR1,#47HMOVR2,#8CLRCLOOP:MOVA,@R0SUBBA,@R1MOV@R0,ADECR0DECR1DJNZR2,LOOPMOVF0,CSJMP$END21、若外部RAM的(3000H)=X,(3001H)=Y,编程实现Z=X*X+2Y,并将结果存到片内RAM的40H单元(设Z<256)。解:XEQU3000HYEQU3001HZEQU40HORG0MOVDPTR,#X;变量X的地址送DPTRMOVXA,@DPTR;取变量XMOVB,A;变量X的值送给B寄存器MULAB;求X*X,根据题意知积为1字节(在A中)MOVR0,A;X*X的结果存入R0中INCDPTR;指向变量YMOVXA,@DPTR;取变量YMOVB,#2MULAB;求2*Y,根据题意知积为1字节(在A中)ADDA,R0;求X*X+2*YMOVZ,A;和存入40H单元SJMP$;停机END评分办法:不要求写出程序的注释和使用伪指令。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。22、设外部RAM2000H单元为数据块的起始地址,数据块长度为10第49页共49页 ,试编程求数据块中的最小值,存入内部RAM30H单元。解:设计思路:将数据块的第1个数据放入结果单元,然后依次与剩余的9个数据进行比较。如果新的数据比结果单元中的数据还小则将该数据存入结果单元,9次比较完成则结果单元中的数据就是最小值。ORG0MOVDPTR,#2000HMOVXA,@DPTR;取数据块的第一个数MOV30H,A;存入结果单元MOVR2,#9;共比较9次INCDPTR;指向第2个数LOOP:CLRCMOVXA,@DPTRSUBBA,30HJNCLP;没有借位则说明结果单元的数小,不用更换最小值MOVXA,@DPTRMOV30H,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位)。解:XEQU1000HZHEQU31HZLEQU30HORG0MOVZH,#0;结果单元清零MOVZL,#0MOVDPTR,#1000HMOVXA,@DPTR;取X的值MOVB,#2MULAB;计算2XADDA,ZLMOVZL,A;存结果低8位MOVA,B;取乘积高8位ADDA,ZHMOVZH,A;存结果高8位INCDPTR;指向YMOVXA,@DPTR;取Y第49页共49页 MOVB,AMULAB;计算Y*YADDA,ZL;计算结果低8位MOVZL,AMOVA,B;取乘积的高8位ADDCA,ZH;计算结果高8位,注意必须带进位加MOVZH,AMOVA,ZLADDA,#5;计算结果加5MOVZL,AMOVZH,A;存结果低8位ADDCA,#0;将低8位进位加到结果高8位,注意必须带进位加MOVZH,A;存结果高8位END评分办法:不要求写出程序的注释和使用伪指令。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。24、设外部RAM1000H单元为数据块的起始地址,数据块长度为60字节,试编程求数据块中所有数据的和,并将其存入内部RAM30H和31H单元(30H单元存放和的低8位,31H单元存放和的高8位)。解:ADDREQU100HH;数据块首地址LENEQU60;数据块长度ZHEQU31H;和的高8位地址ZLEQU30H;和的低8位地址ORG0MOVDPTR,#ADDR;数据块首地址送DPTRMOVR7,#LEN;数据块长度送R7MOVZH,#0;结果单元清零MOVZL,#0LOOP:MOVXA,@DPTR;取数据ADDA,ZL;将数据加到结果单元的低8位MOVZL,A;存结果低8位MOVA,ZH;取结果高8位ADDCA,#0;将低8位计算的进位加到高8位中MOVZH,A;存高8位INCDPTR;修改地址指针,指向下一个数据DJNZR7,LOOP;没有计算完则继续SJMP$END评分办法:不要求写出程序的注释和使用伪指令。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。第49页共49页 25、若外部RAM的(1000H)=X,内部RAM(30H)=Y,请编程实现Z=X*X+3Y+18(设Z<65536),并将结果保存到片内RAM的40H和41H单元(41H单元存放结果的高8位,40H单元存放结果的低8位)。解:XEQU1000HYEQU30HZHEQU41HZLEQU40HORG0MOVZH,#0;结果单元清零MOVZL,#0MOVDPTR,#1000HMOVXA,@DPTR;取X的值MOVB,AMULAB;计算X*XADDA,ZLMOVZL,A;存结果低8位MOVA,B;取乘积高8位ADDA,ZHMOVZH,A;存结果高8位MOVXA,Y;取YMOVB,#3MULAB;计算3*YADDA,ZL;计算结果低8位MOVZL,AMOVA,B;取乘积的高8位ADDCA,ZH;计算结果高8位,注意必须带进位加MOVZH,AMOVA,ZLADDA,#18;计算结果加18MOVZL,A;存结果低8位MOVA,ZH;取结果高8位ADDCA,#0;将低8位进位加到结果高8位,注意必须带进位加MOVZH,A;存结果高8位END评分办法:不要求写出程序的注释和使用伪指令。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。26、若外部RAM的(1000H)=X,请编程实现Y=X2+2X+1(设Y<65536),并将结果保存到片内RAM的30H和31H单元(31H单元存放结果的高8位,30H单元存放结果的低8位)。第49页共49页 解:ORG0MOV30H,#0;结果单元清零MOV31H,#0MOVDPTR,#1000HMOVA,@DPTR;取X的值MOVB,AMULAB;求X的平方MOV30H,A;存低8位MOVA,BMOV31H,A;存高8位MOVXA,@DPTR;取X的值MOVB,#2MOVAB;求2XADDA,30H;求低8位和MOV30H,A;存和的低8位MOVA,B;取积的高8位ADDCA,31H;求高8位和MOV31H,A;存和的高8位MOVA,30HADDA,#1;加1MOV30H,A;存和的低8位MOVA,31HADDCA,#0;和的高8位加上低8位运算的进位MOV31H,A;存和的高8位SJMP$;停机END27、设外部RAM2000H单元为数据块的起始地址,数据块长度为100字节。假设在数据块中存在唯一的一个ASCII字符“A”,试编程找到它,并将其在外部RAM的存放地址存入内部RAM30H和31H单元中(30H单元存放地址的高8位,31H单元存放地址的低8位)。解:ORG0第49页共49页 MOVDPTR,#2000H;数据块首地址送DPTRMOVR2,#100;数据块长度送R2LOOP:MOVXA,@DPTR;取数据CJNEA,#41H,NEXT;数据不是“A”则转移MOVA,DPHMOV30H,A;存高8位地址MOVA,DPLMOV31H,A;存低8位地址SJMP$;停机NEXT:INCDPTR;修改地址指针DJNZR2,LOOP;没有找到则继续SJMP$;停机28、若内部RAM的(20H)=a,外部RAM(1300H)=b,请编程实现y=a2+b2+5(设y<65536),并将结果保存到片内RAM的30H和31H单元(31H单元存放结果的高8位,30H单元存放结果的低8位)。解:ORG0MOVA,20H;取aMOVB,AMULAB;求a2MOV30H,A;存和的低8位MOVA,BMOV31H,A;存和的高8位MOVDPTR,#1300HMOVXA,@DPTR;取bMOVB,AMULAB;求b2ADDA,30H;求a2+b2MOV30H,AMOVA,BADDCA,31HMOV31H,AMOVA,30HADDA,#5;加5MOV30H,AMOVA,31HADDCA,#0;加上低8位的进位MOV31H,ASJMP$;停机END评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。第49页共49页 29、若内部RAM的(30H)=X,(31H)=Y,请编程实现Z=X2+5Y(设Z<65536),并将结果保存到片外RAM的1000H和1001H单元(1001H单元存放结果的高8位,1000H单元存放结果的低8位)。解:ORG0MOVDPTR,#1000H;结果地址指针赋值MOVA,30H;取XMOVB,AMULAB;求X2MOVX@DPTR,A;存X2低8位INCDPTR;指向结果单元高8位MOVA,BMOVX@DPTR,A;存X2高8位DECDPL;指向结果单元低8位MOVA,31H;取YMOVB,#5MULAB;求5YMOVR0,AMOVXA,@DPTRADDA,R0;求X2+5Y的低8位和MOVX@DPTR,A;存X2+5Y的低8位和INCDPTR;指向结果单元高8位MOVXA,@DPTR;取结果单元高8位ADDCA,B;求X2+5Y的高8位和(注意加上低8位的进位)MOVX@DPTR,A;存X2+5Y的高8位和SJMP$;停机END评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。30、设内部RAM20H单元为数据块的起始地址,数据块长度为32字节。请将整个数据块求和(共32字节的数据求和,设和小于65536),并把和存入外部RAM1000H和1001H的单元中(和的高8位存入1001H单元)。解:ORG0MOVR0,#20H;数据块首地址送R0MOVR2,#32;数据块长度送R2CLRA;累加器清零MOVDPTR,#1000H;指向和的低8位MOVX@DPTR,A;和的低8位清零INCDPTR;指向和的高8位MOVX@DPTR,A;和的高8位清零DECDPL;指向和的低8位LOOP:MOVA,@R0;取数据MOVR1,A;暂存在R1第49页共49页 MOVXA,@DPTR;取和的低8位ADDA,R1;求和MOVX@DPTR,A;存和的低8位INCDPTR;指向和的高8位MOVXA,@DPTR;取和的高8位ADDCA,#0;将和的低8位的进位加到高8位中MOVX@DPTR,A;存和的高8位DECDPL;指向和的低8位INCR0;数据块指针加1DJNZR2,LOOP;没有加完则循环SJMP$;停机END评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。31、若内部RAM的(20H)=a,(21H)=b,请编程实现y=a2+b2(设y<65536),并将结果保存到片外RAM的2000H和2001H单元(2001H单元存放结果的高8位,2000H单元存放结果的低8位)。解:ORG0MOVDPTR,#2000H;结果单元低8位地址送DPTRMOVA,20H;取a的值MOVB,AMULAB;求a2MOVX@DPTR,A;存a2低8位MOVA,BINCDPTR;指向结果单元高8位MOVX@DPTR,A;存结果高8位DECDPL;指向结果单元低8位MOVA,21H;取b的值MOVB,AMULAB;求b2MOVR0,A;暂存b2的低8位MOVXA,@DPTR;取结果低8位ADDA,R0;求低8位的和MOVX@DPTR,A;存结果低8位INCDPTR;指向结果单元高8位MOVXA,@DPTR;取结果高8位ADDCA,B;加上b2的高8位和低8位求和的进位MOVX@DPTR,A;存结果高8位SJMP$;停机END评分办法:不要求写出程序的注释,也不要求使用子程序。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。第49页共49页 32、将内部RAM40H为起始地址的32个连续单元中的十六进制数转换成ASCⅡ码存入外部RAM3000H开始的存储单元中。解:ORG0MOVR0,#40H;源数据块首地址送R0MOVR2,#32;数据块长度送R2MOVDPTR,#3000H;目的数据块首地址送DPTRLOOP:MOVA,@R0;取待转换数据ANLA,#0F0H;取高四位数据SWAPA;高低四位数据交换PUSHDPH;保护目标地址指针PUSHDPLMOVDPTR,#TAB;数据指针指向表格首地址MOVCA,@A+DPTR;查表得到ASCII码POPDPL;恢复目标地址指针POPDPHMOVX@DPTR,A;存转换结果INCDPTR;指向下一个存储单元MOVA,@R0;取待转换数据ANLA,#0FH;取低四位数据PUSHDPH;保护目标地址指针PUSHDPLMOVDPTR,#TAB;数据指针指向表格首地址MOVCA,@A+DPTR;查表得到ASCII码POPDPL;恢复目标地址指针POPDPHMOVX@DPTR,A;存转换结果INCDPTR;指向下一个存储单元INCR0;指向下一个待转换数据DJNZR2,LOOP;没有转换完则继续SJMP$;停机TAB:DB‘0123456789ABCDEF’END评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。33、设内部RAM20H单元为数据块的起始地址,数据块长度为10H,数据为8位无符号数,试编程找出数据块中的最小值,并将其存入40H单元。解:ORG0第49页共49页 MOVR0,#20H;数据区首地址送R0MOVR2,#10H;数据块长度送R2MOV40H,#0FFH;结果单元送入最大值LOOP:MOVA,@R0;取数据CLRC;清进位SUBBA,40H;利用减法判断该数据是否比最小值单元的数小?JNCNEXT;如果没有借位说明待比较数据比最小值单元的值大则转移MOVA,@R0;取最小值MOV40H,A;存最小值NEXT:INCR0;修改地址指针DJNZR2,LOOP;没有比较完则继续比较。SJMP$;停机END评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。34、比较两个ASCII码字符串是否相等。字符串长度在内部RAM2FH单元,两字符串的首地址分别为30H、40H。如果两个字符串相等,置CY=1,否则,置CY=0。解:ORG0MOVR0,#30H;第一个字符串首地址送R0MOVR1,#40H;第一个字符串首地址送R1MOVR2,2FH;取字符串长度LOOP:MOVA,@R0;取第一个字符串的字符CLRCSUBBA,@R1;比较两个字符是否相等JNZSTOP;结果不为零说明两个字符串不相等INCR0;修改地址指针INCR1DJNZR2,LOOP;没有比较完则继续SETBC;比较完,置两字符串相等标志SJMP$;停机STOP:CLRC;两字符串不相等,清进位标志SJMP$;停机END评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。35、将MCS51内部RAM60H~65H单元存放的12个16进制数变为ASCII码,存放到0100H单元开始的外部RAM中。第49页共49页 解:ADDR1EQU60HADDR2EQU0100HLENEQU6ORG0MOVR0,#ADDR1;待转换数据首地址送R0MOVDPTR,#ADDR2;转换后ASCII码存放首地址送DPTRMOVR2,#LEN;原数据长度送R2LOOP:MOVA,@R0;取待转换数据ANLA,#0FH;取待转换数据低四位PUSHDPH;保护目的区地址指针PUSHDPLMOVDPTR,#TAB;码表首地址送DPTRMOVCA,@A+DPTR;查表POPDPL;恢复目的区地址指针POPDPHMOVX@DPTR,A;存转换好的ASCII码INCDPTR;目的地址加1MOVA,@R0;取待转换数据SWAPA;高低四位交换ANLA,#0FH;取待转换高四位数据PUSHDPH;保护目的区地址指针PUSHDPLMOVDPTR,#TAB;码表首地址送DPTRMOVCA,@A+DPTR;查表POPDPL;恢复目的区地址指针POPDPHMOVX@DPTR,A;存转换好的ASCII码INCDPTR;目的地址加1INCR0;原地址指针加1DJNZR2,LOOP;没有转换完则转移SJMP$;停机TAB:DB‘0123456789ABCDEF’END评分办法:不要求使用伪指令,也不要求写出程序的注释。程序设计中也可以先转换高四位。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。36、将片外数据存储器的2500H单元与2501H单元中的数据作十进制加法运算,和送入2503H和2502H单元中,即(2500H)+(2501H)→(2503H)(2502H)。第49页共49页 解:ORG0MOVDPTR,#2500H;指向被加数MOVXA,@DPTR;取被加数MOVR0,A;存被加数INCDPTR;指向加数MOVXA,@DPTR;取加数ADDA,R0;求和DAA;十进制调整INCDPTR;指向和的低8位MOVX@DPTR,A;存和的低8位INCDPTR;指向和的高8位ADDCA,#0;计算和的高8位MOVX@DPTR,A;存和的高8位SJMP$;停机END评分办法:要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。37、设单片机的晶体震荡频率为12MHz,利用定时器T0编程由P1.2输出周期为10ms的方波。(要求:T0工作在方式1下,采用中断方式工作)解:周期为10ms则半周期为5ms,因此T0的定时初值为65536-5000/1=60536=0EC78HORG0LJMPSTARTORG000BHLJMPTSORG30HSTART:MOVTMOD,#01HMOVTH0,#0ECHMOVTL0,#78HSETBET0SETBTR0SETBEACLRP1.2SJMP$TS:CLRTR0MOVTH0,#0ECHMOVTL0,#78HSETBTR0CPLP1.2第49页共49页 RETIEND评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。38、已知8051单片机应用系统的晶体振荡频率为12MHz,请利用定时器T0实现在P1.0引脚上输出周期为100mS的方波。(要求:采用中断方式,T0工作在方式1下)解:输出方波周期为100mS,故半周期为50mS,因此T0的定时初值是65536-50000/1=15536=3CB0HORG0HLJMPSTARTORG000BHLJMPTSORG30HSTART:MOVTMOD,#01HMOVTH0,#3CHMOVTL0,#0B0HSETBET0SETBTR0SETBEACLRP1.0SJMP$TS:CLRTR0MOVTH0,#3CHMOVTL0,#0B0HSETBTR0CPLP1.0RETIEND评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。39、设8031单片机应用系统的晶振频率为12MHz,请利用T0在P1.0和P1.1引脚上输出频率为20Hz、互补(两个波形互为反相)的方波。要求:采用中断方式,T0工作在方式1。解:输出频率为20Hz,则周期为1/20=50mS,半周期为50/2=25mS,T0的定时初值为:65536-25000/1=40536=9E58HORG0HLJMPSTARTORG000BH第49页共49页 LJMPTSORG30HSTART:MOVTMOD,#01H;T0设定为定时器,工作方式1MOVTH0,#9EHMOVTL0,#58HSETBET0SETBEASETBTR0CLRP1.0SETBP1.1SJMP$TS:CLRTR0MOVTH0,#9EHMOVTL0,#58HSETBTR0CPLP1.0CPLP1.1RETIEND评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。40、8031单片机应用系统的晶体振荡器频率为12MHz,请利用定时器T0编程实现在P1.7引脚输出频率为20Hz的方波。要求:采用中断方式,T0工作在方式1下。20Hz方波的周期是1/20=50mS,则其半周期为50/2=25mST0的定时初值为:65536-25000*12/12=40536=9E58HORG0HLJMPSTARTORG000BHLJMPTSORG30HSTART:MOVTMOD,#01H;T0设定为定时器,工作方式1MOVTH0,#9EHMOVTL0,#58HSETBET0SETBEASETBTR0SJMP$TS:CLRTR0MOVTH0,#9EHMOVTL0,#58H第49页共49页 SETBTR0RETIEND评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。41、设单片机的晶体振荡频率为12MHz,利用定时器T0编程由P1.0和P1.1输出周期为10ms、互补(互为反相)的方波。(要求:T0工作在方式1下,采用中断方式工作)解:周期为10ms则半周期为5ms,因此T0的定时初值为65536-5000*12/12=60536=0EC78HORG0LJMPSTARTORG000BHLJMPTSORG30HSTART:MOVTMOD,#01HMOVTH0,#0ECHMOVTL0,#78HSETBET0SETBTR0SETBEACLRP1.0SETBP1.1SJMP$TS:CLRTR0MOVTH0,#0ECHMOVTL0,#78HSETBTR0CPLP1.0CPLP1.1RETIEND评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。42、已知8051单片机应用系统的晶体振荡频率为12MHz,请利用定时器T1实现在P1.0和P1.1引脚上输出互补(互为反相)的周期为100mS的方波。(要求:采用中断方式,T1工作在方式1下)解:输出方波周期为100mS,故半周期为50mS,因此T1的定时初值是65536-50000*12/12=15536=3CB0H第49页共49页 ORG0HLJMPSTARTORG001BHLJMPTSORG30HSTART:MOVTMOD,#10H(或#1XH)MOVTH1,#3CHMOVTL1,#0B0HSETBET1SETBTR1SETBEACLRP1.0SETBP1.1SJMP$TS:CLRTR1MOVTH1,#3CHMOVTL1,#0B0HSETBTR1CPLP1.0CPLP1.1RETIEND评分办法:不要求写出程序的注释。T1的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。43、设8031单片机应用系统的晶振频率为12MHz,请利用T0在P1.0引脚上输出频率为20Hz的方波。要求:采用中断方式,T0工作在方式1。解:输出频率为20Hz,则周期为1/20=50ms,半周期为50/2=25ms,T0的定时初值为:65536-25000*12/12=40536=9E58HORG0HLJMPSTARTORG000BHLJMPTSORG30HSTART:MOVTMOD,#01H;T0设定为定时器,工作方式1MOVTH0,#9EHMOVTL0,#58HSETBET0SETBEASETBTR0CLRP1.0第49页共49页 SJMP$TS:CLRTR0MOVTH0,#9EHMOVTL0,#58HSETBTR0CPLP1.0RETIEND评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。44、8031单片机应用系统的晶体振荡器频率为12MHz,请利用定时器T1编程实现在P1.6和P1.7引脚输出互补(互为反相)的、频率为20Hz的方波。要求:采用中断方式,T1工作在方式1下。解:20Hz方波的周期是1/20=50ms,则其半周期为50/2=25msT1的定时初值为:65536-25000/1=40536=9E58HORG0HLJMPSTARTORG001BHLJMPTSORG30HSTART:MOVTMOD,#10H;T1设定为定时器,工作方式1MOVTH1,#9EHMOVTL1,#58HSETBET1SETBEACLRP1.6SETBP1.7SETBTR1SJMP$TS:CLRTR1MOVTH1,#9EHMOVTL1,#58HSETBTR1CPLP1.6CPLP1.7RETIEND评分办法:不要求写出程序的注释。T1的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。第49页共49页 45、设单片机的晶体振荡频率为6MHz,利用定时器T1编程由P1.6和P1.7输出周期为500μs、互补(互为反相)的方波。(要求:T1工作在方式2下,采用中断方式工作)解:T1定时器的初值=256-6*250/12=131=83HORG0LJMPSTARTORG1BHLJMPTSORG30HSTART:MOVTMOD,#20HMOVTH1,#131MOVTL1,#131SETBET1SETBEA(或MOVIE,#88H)SETBTR1CLRP1.6SETBP1.7SJMP$TS:CPLP1.6CPLP1.7RETIEND评分办法:写对定时器方式字和初值各给1分,设计思路正确给4分,程序编制正确可得满分。若仅写出少量指令,可酌情给1-3分。46、已知8051单片机应用系统的晶体振荡频率为12MHz,请利用定时器T1实现在P1.0和P1.1引脚上输出互补(互为反相)的周期为2ms的方波。(要求:采用中断方式,T1工作在方式2下)解:半周期=1ms。方式2定时设定为250μs,其初值=256-250*12/12=6。只要T1中断4次计数即为1ms。ORG0LJMPSTARTORG1BHLJMPTSORG30HSTART:MOVTMOD,#20HMOVTH1,#6MOVTL1,#6SETBET1SETBEASETBTR0CLRP1.0第49页共49页 SETBP1.1MOVR2,#4SJMP$TS:DJNZR2,TS1MOVR2,#4CPLP1.0CPLP1.1TS1:RETIEND评分办法:写对定时器方式字和初值各给1分,设计思路正确给4分,程序编制正确可得满分。若仅写出少量指令,可酌情给1-3分。47、设8031单片机应用系统的晶振频率为12MHz,请利用T1在P1.0引脚上输出频率为1Hz的方波。要求:采用中断方式,T1工作在方式1。解:1Hz方波的周期为1s,半周期为500ms。可采用T1定时50ms,并对中断计数10次来实现500ms定时。50ms定时初值=65536-50000*12/12=15536=3CB0HORG0LJMPSTARTORG1BHLJMPTSORG30HMOVTMOD,#10HMOVTH1,#3CHMOVTL1,#0B0HSETBET1SETBEA(或MOVIE,#88H)MOVR2,#10CLRP1.0SETBTR1SJMP$TS:CLRTR1MOVTH1,#3CHMOVTL1,#0B0HSETBTR1DJNZR2,TS1MOVR2,#10CPLP1.0TS1:RETI评分办法:写对定时器方式字和初值各给1分,设计思路正确给4分,程序编制正确可得满分。若仅写出少量指令,可酌情给1-3分。第49页共49页 48、8051单片机应用系统的晶体振荡器频率为6MHz,请利用定时器T1编程实现在P1.0和P1.1引脚输出互补(互为反相)的、频率为20Hz的方波。要求:采用中断方式,T1工作在方式2下。解:20Hz方波的半周期为25ms,T1的0.5ms定时初值=256-500*6/12=6ORG0LJMPSTARTORG1BHLJMPTSORG30HSTART:MOVTMOD,#20HMOVTH1,#6MOVTL1,#6MOVR2,#50;50*0.5ms=25msCLRP1.0SETBP1.1SETBET1SETBEA;(或MOVIE,#88H)SETBTR1SJMP$TS:DJNZR2,TS1MOVR2,#50CPLP1.0CPLP1.1TS1:RETI评分办法:写对定时器方式字和初值各给1分,设计思路正确给4分,程序编制正确可得满分。若仅写出少量指令,可酌情给1-3分。49、8751单片机应用系统的晶体振荡器频率为12MHz,请利用定时器T0编程实现在P1.7引脚输出频率为20Hz的方波。要求:采用中断方式,T0工作在方式1下。解:20Hz方波的周期是1/20=0.05s=50ms,则半周期为25ms。因此只要每隔25ms将P1.7取反即可得到20Hz的方波。T0的定时初值=65536-25000*12/12=40536=9E58HORG0LJMPSTARTORG0BHLJMPTSORG30HSTART:MOVTMOD,#01H;设定T0为定时器,方式1MOVTH0,#9EH第49页共49页 MOVTL0,#58HCLRP1.7SETBET0SETBEA(或两条指令合并为MOVIE,#82H)SETBTR0;启动T0定时SJMP$TS:CLRTR0;停止T0定时MOVTH0,#9EHMOVTL0,#58HSETBTR0;启动T0定时CPLP1.7RETIEND评分办法:T0的方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。在中断服务程序中可以省略T0的停止与启动指令。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。50、设8051单片机应用系统的晶振频率为12MHz,请利用T1在P1.0和P1.1引脚上输出频率为20Hz、互补(两个波形互为反相)的方波。要求:采用中断方式,T1工作在方式1。解:20Hz方波的周期是1/20=0.05s=50ms,则半周期为25ms。因此只要每隔25ms将P1.0和P1.1取反即可得到互补的20Hz方波。T1的定时初值=65536-25000*12/12=40536=9E58HORG0LJMPSTARTORG1BHLJMPTSORG30HSTART:MOVTMOD,#10H;设定T1为定时器,方式1MOVTH1,#9EHMOVTL1,#58HCLRP1.0SETBP1.1SETBET1SETBEA(或两条指令合并为MOVIE,#88H)SETBTR1;启动T1定时SJMP$TS:CLRTR1;停止T1定时MOVTH1,#9EHMOVTL1,#58HSETBTR1;启动T1定时CPLP1.0第49页共49页 CPLP1.1RETIEND评分办法:T1的方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。在中断服务程序中可以省略T1的停止与启动指令。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。51、已知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=6ORG0LJMPSTARTORG0BHLJMPTSORG30HSTART:MOVTMOD,#02H;设定T0为定时器,方式2MOVTH0,#6MOVTL0,#6CLRP1.0SETBET0SETBEA(或两条指令合并为MOVIE,#82H)SETBTR0;启动T0定时SJMP$TS:CPLP1.0RETIEND评分办法:T0方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。52、设单片机的晶体振荡频率为12MHz,利用定时器T0编程由P1.0输出周期为1秒的方波。(要求:T0工作在方式1下,采用中断方式工作)解:周期为1秒的方波只需要每隔0.5秒将P1.0取反即可。将T0设定为50ms定时中断,中断10次即是0.5秒,这时将P1.0取反即可。T0的定时初值=65536-50000*12/12=15536=3CB0HORG0LJMPSTARTORG0BHLJMPTSORG30H第49页共49页 START:MOVTMOD,#01H;设定T0为定时器,方式1MOVTH0,#3CHMOVTL0,#0B0H;50ms定时初值送T0MOVR2,#10;中断10次SETBET0SETBEA;(或两条指令合并为MOVIE,#82H)SETBTR0;启动定时SJMP$;等待中断TS:CLRTR0MOVTH0,#3CHMOVTL0,#0B0H;50ms定时初值送T0SETBTR0DJNZR2,NEXTMOVR2,#10CPLP1.0NEXT:RETIEND评分办法:T0的方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。53、设单片机的晶体振荡频率为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参考程序清单如下:ORG0LJMPSTARTORG0BHLJMPTSORG30HSTART:MOVTMOD,#01HMOVTH0,#03CHMOVTL0,#0B0HMOVR2,#5;中断5次为500msSETBET0SETBTR0SETBEACLRP1.0SETBP1.1第49页共49页 SJMP$TS:CLRTR0;该指令可以省略MOVTH0,#03CHMOVTL0,#0B0HSETBTR0;该指令可以省略DJNZR2,TS1MOVR2,#5;恢复中断次数初值CPLP1.0CPLP1.1TS1:RETIEND评分办法:T0方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。54、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参考程序清单如下:ORG0HLJMPSTARTORG000BHLJMPTSORG30HSTART:MOVTMOD,#01H;设定为定时器,工作方式1MOVTH0,#3CHMOVTL0,#0B0HMOVR2,#32HSETBET0SETBEASETBTR0SJMP$TS:CLRTR0;此指令可以省略MOVTH0,#3CHMOVTL0,#0B0HSETBTR0;此令可以省略DJNZR2,NEXTMOVR2,#32HCPLP1.0NEXT:RETIEND第49页共49页 评分办法:T0方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。55、设单片机的晶体振荡频率为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=9E58HORG0LJMPSTARTORG0BHLJMPTSORG30HSTART:MOVSP,#60HMOVTMOD,#01HMOVTH0,#9EHMOVTL0,#58HSETBET0SETBEACLRP1.6MOVR2,#32H(或MOVR2,#50)SETBTR0SJMP$TS:MOVTH0,#9EHMOVTL0,#58HDJNZR2,TS1MOVR2,#32H(或MOVR2,#50)CPLP1.6CPLP1.7TS1:RETIEND评分办法:T0方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。56、89C51单片机应用系统的晶体振荡器频率为12MHz,请利用定时器T1编程实现在P1.0引脚输出频率为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程序清单如下:ORG0第49页共49页 LJMPSTARTORG1BHLJMPTSORG30HSTART:MOVSP,#60HMOVTMOD,#10HMOVTH1,#3CHMOVTL1,#0B0HSETBET1SETBEAMOVR2,#5SETBTR1SJMP$TS:MOVTH1,#3CHMOVTL1,#0B0HDJNZR2,TS1MOVR2,#5CPLP1.0TS1:RETIEND评分办法:T1的方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。57、设单片机的晶体振荡频率为12MHz,P1.0接有一个共阴极驱动方式连接的发光二极管。现要求利用定时器T1编程使该发光二极管每10秒钟点亮一次,每次点亮时间为1秒。(要求:T1工作在方式1下,采用中断方式工作,在中断服务程序中控制发光二极管的亮与灭)解:共阴极驱动的发光二极管需要高电平点亮,故当P1.0为1时发光二极管点亮。由于一个周期为10秒,因此需要一个1秒钟的定时,同时需要一个闪烁标志位来表明LED的亮与灭。T1的定时时间选择50ms,这样中断20次即为1秒钟,其定时初值为:65536-50000*12/12=15536=3CB0HFLASHBIT00H;LED亮与灭的标志,“1”表示亮ORG0LJMPSTARTORG1BHLJMPTSORG30HSTART:MOVTMOD,#10H;设定T1为定时器,方式1MOVTH1,#3CHMOVTL1,#0B0HMOVR2,#20;中断20次为1秒MOVR3,#9;LED熄灭的时间为9秒第49页共49页 SETBET1;允许T1中断SETBEA;开中断SETBFLASHSETBP1.0;点亮LEDSETBTR1;启动计数SJMP$TS:MOVTH1,#3CHMOVTL1,#0B0HDJNZR2,TS2;没到1秒钟则返回MOVR2,#20JBFLASH,TS1;若LED亮则转移DJNZR3,TS2;没到9秒钟则返回MOVR3,#9SETBP1.0;点亮LEDSETBFLASHSJMPTS2TS1:CLRP1.0;1秒到,熄灭LEDCLRFLASHTS2:RETIEND评分办法:不要求写出程序的注释和使用伪指令。T1的方式控制字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。58、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)ORG0LJMPSTARTORG0BHLJMPTSSTART:MOVTMOD,#1;设T0为定时器,方式1MOVTH0,#3CH;100ms定时初值MOVTL0,#0B0HSETBET0SETBEAMOVR2,#10;中断10次为1秒SETBTR0SJMP$第49页共49页 TS:MOVTH0,#3CH;100ms定时初值MOVTL0,#0B0HDJNZR2,TS1;1秒没到则返回MOVR2,#10;1秒钟中断次数送R2CPLP1.7;改变LED的状态TS1:RETIEND评分办法:不要求写出程序的注释。T0方式字和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。59、已知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分)ORG0LJMPSTARTORG0BHLJMPTSORG30HSTART:MOVTMOD,#01H;设T0为方式1,定时器(写对得1分)MOVTH0,#3CH;送200ms定时初值MOVTL0,#0B0HSETBET0;允许T0中断SETBEA;开中断CLRP1.0;输出初始化SETBP1.1MOVR7,#5;中断5次为1秒钟SETBTR0;启动T0计数SJMP$;等待中断TS:MOVTH0,#3CH;送200ms定时初值MOVTL0,#0B0HDJNZR7,TS1;没到1秒钟则返回MOVR7,#5;中断5次为1秒钟CPLP1.0;输出取反CPLP1.1TS1:RETIEND第49页共49页 评分办法:不要求写出程序的注释和使用伪指令。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。60、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分)FLASHBIT00H;发光二极管点亮标志,“1”表示点亮ORG0LJMPSTARTORG1BHLJMPTSORG30HSTART:MOVTMOD,#10H;将T1设为方式1,定时器(写对得1分)MOVTH1,#3CH;送100ms定时初值MOVTL1,#0B0HSETBET1;允许T1中断SETBEA;开中断MOVR7,#10;中断10次为1秒钟MOVR5,#2;发光二极管点亮时间为2秒MOVR6,#3;发光二极管熄灭时间为3秒SETBP1.0;点亮发光二极管SETBFLASH;通知中断服务程序发光二极管处于点亮状态SETBTR1;启动T1计数SJMP$;等待中断TS:MOVTH1,#3CH;送100ms定时初值MOVTL1,#0B0HDJNZR7,TS2;1秒未到则返回MOVR7,#10;100ms中断计数值重新赋值JNBFLASH,TS1;如果发光二极管处于熄灭状态则转移DJNZR5,TS2;点亮的时间2秒未到则返回MOVR5,#2CLRP1.0;熄灭发光二极管CLRFLASHSJMPTS2TS1:DJNZR6,TS2;熄灭的时间没到3秒则返回MOVR6,#3SETBP1.0;点亮发光二极管SETBFLASHTS2:RETIEND第49页共49页 评分办法:不要求写出程序的注释。T1方式字和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。61、已知89C51单片机的晶体振荡频率为24MHz,请编程从P1.6和P1.7口输出互补的(即互为反相)、频率为500Hz的方波。(要求:T1工作在方式1下,采用中断方式工作,在中断服务程序中控制P1.6和P1.7的输出)解:要求输出频率为500Hz的方波,其周期为1/500=2ms,故只需每隔半个周期(1ms)将输出取反即可。设定T1定时为1ms,则T0的定时初值为:65536-1000*24/12=63536=0F830H(计算正确得1分)ORG0LJMPSTARTORG1BHLJMPTSORG30HSTART:MOVTMOD,#10H;设T1为方式1,定时器(写对得1分)MOVTH1,#0F8H;送200ms定时初值MOVTL1,#30HSETBET1;允许T1中断SETBEA;开中断CLRP1.6;输出初始化SETBP1.7SETBTR1;启动T1计数SJMP$;等待中断TS:MOVTH1,#0F8H;送1ms定时初值MOVTL1,#30HCPLP1.0;输出取反CPLP1.1TS1:RETIEND评分办法:不要求写出程序的注释和使用伪指令。T1的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。62、已知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=6ORG0LJMPSTART第49页共49页 ORG0BHLJMPTSORG30HSTART:MOVTMOD,#2;将T0设为方式2,定时器MOVTH0,#6;送定时初值MOVTL0,#6SETBET0;允许T0中断SETBEA;开中断MOVR2,#40;中断40次为10msSETBTR0;启动T0计数SJMP$;等待中断TS:DJNZR2,TS1MOVR2,#40;中断40次为10ms到CPLP1.0;输出取反TS1:RETI;中断返回END评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。63、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。ORG0LJMPSTARTORG1BHLJMPTSORG30HSTART:MOVTMOD,#20H;设T1为定时器,方式2MOVTH1,#6;送1ms定时初值MOVTL1,#6SETBET1;允许T1中断SETBEA;开中断MOVR2,#20;中断20次为20msSETBTR1;启动T1计数SJMP$;等待中断TS:DJNZR2,TS1;20ms未到则转移MOVR2,#20;中断20次为20msCPLP1.0;输出取反TS1:RETI;中断返回第49页共49页 END评分办法:不要求写出程序的注释。T1的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。64、已知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=6ORG0LJMPSTARTORG1BHLJMPTSORG30HSTART:MOVTMOD,#20H;设T1为方式2,定时器MOVTH1,#6;送0.1ms定时初值MOVTL1,#6SETBET1;允许T1中断SETBEA;开中断MOVR2,#50;中断50次为5msCLRP1.0SETBTR1;启动T1计数SJMP$;等待中断TS:DJNZR2,TS1;不到5ms则转移MOVR2,#50;中断50次为5msCPLP1.0;输出取反CPLP1.1TS1:RETI;中断返回END评分办法:不要求写出程序的注释。T1的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。65、已知89C51单片机的晶体振荡频率为24MHz,请编程从P1.0口输出频率为2Hz的方波。(要求:T0工作在方式1下,采用中断方式工作,在中断服务程序中控制P1.0的输出)解:2Hz的方波其周期为500ms,半周期是250ms。利用T0定时25ms,并对中断计10次即可。25ms的定时初值为:65536-25000*24/12=15536=3CB0HORG0LJMPSTARTORG0BH第49页共49页 LJMPTSORG30HSTRAT:MOVTMOD,#1;设T0为定时器,方式1MOVTH0,#3CHMOVTL0,#0B0H;送25ms定时初值MOVR0,#10;中断10次为250msSETBET0;允许T0中断SETBEA;开中断SETBTR0;启动T0计数SJMP$;等待中断TS:MOVTH0,#3CHMOVTL0,#0B0H;送25ms定时初值DJNZR0,TS1MOVR0,#10;中断计次单元重新赋值CPLP1.0;输出取反TS1:RETIEND评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。66、89C51单片机应用系统的晶体振荡器频率为24MHz,请编程实现从单片机的P1.3引脚输出100Hz方波。(要求:T1采用中断方式工作,工作在方式2下,在中断服务程序中控制P1.3的输出。)解:100Hz方波的周期是1/100=10ms,其半周期为5ms。将T1定时0.1ms,对定时中断计50次即可。T1的定时初值为:256-100*24/12=56=38HORG0LJMPSTARTORG1BHLJMPTSORG30HSTART:MOVTMOD,#20H;设T1为定时器,方式2MOVTH1,#56MOVTL1,#56;送0.1ms定时初值SETBET1;允许T1中断SETBEA;开中断MOVR0,#50;中断50次为5msSETBTR1;启动T1计数SJMP$;等待中断TS:DJNZR0,TS1;中断不够50次则跳转MOVR0,#50;中断50次为5msCPLP1.3;输出取反TS1:RETI;中断返回END第49页共49页 评分办法:不要求写出程序的注释。T1的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。67、已知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程序清单如下:ORG0LJMPSTART;跳转到START处ORG1BHLJMPTS;跳转到定时器1中断服务程序ORG40START:MOVTMOD,#10H;设T1为定时器,方式1MOVTH1,#0ECHMOVTL1,#78H;送5ms定时初值SETBET1;允许T1中断SETBEA;开中断MOVR0,#25;中断25(19H)次为125msCLRP1.6;P1.6输出低电平,P1.7复位后为高电平SETBTR1;启动T1计数SJMP$;等待中断TS:MOVTH1,#0ECHMOVTL1,#78H;送5ms定时初值DJNZR0,TS1;125ms没到则跳转MOVR0,#25;中断计次单元恢复初值CPLP1.6;P1.6取反输出CPLP1.7;P1.7取反输出TS1:RETI;中断返回END评分办法:不要求写出程序的注释。T1的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。68、已知89C52单片机的晶体振荡频率为24MHz,请编程从P1.5输出频率为10Hz、占空比为10%(即高电平持续时间为信号周期的10%,低电平持续时间为信号周期的90%)的矩形波。(要求:T1工作在方式1下,采用中断方式工作,在中断服务程序中控制P1.5的输出)解:设计思路为:输出信号周期=1/10=0.1秒=100ms,因此输出信号的高电平持续时间为10ms,低电平持续时间为90ms。设定T1的定时时间为10ms,对T1定时中断记9次即可得到90ms的定时。第49页共49页 T1的定时初值=65536-10*1000*24/12=45536=0B1E0H程序清单如下:ORG0LJMPSTART;跳转到主程序入口ORG1BH;T1中断服务程序入口地址LJMPTS;跳转到定时中断服务程序ORG30HSTART:MOVTMOD,#10H;设定T1为定时器,方式1MOVTH1,#0B1H;送10ms定时初值MOVTL1,#0E0HSETBET1;允许T1中断SETBEA;开中断MOVR2,#9;送低电平中断次数SETBF0;高电平标志置1,表示输出高电平SETBTR1;启动T1计数SJMP$;等待中断TS:MOVTH1,#0B1H;送10ms定时初值MOVTL1,#0E0HJNBF0,TS1;如果目前输出低电平则转移CLRF0;高电平标志清零,表示该输出低电平。CLRP1.5;输出低电平SJMPTS2TS1:DJNZR2,TS2;90ms没到则转移MOVR2,#9;中断次数送R2SETBF0;高电平标志置1,表示该输出高电平SETBP1.5;输出高电平TS2:RETI;中断返回END评分办法:不要求写出程序的注释。T1的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。69、已知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=6ORG0LJMPSTARTORG0BHLJMPTS第49页共49页 ORG30HSTART:CLRP1.2;P1.2清为低电平,P1.3上电后是高电平MOVTMOD,#02H;设T0为方式2,定时器MOVTH0,#6;送0.5ms定时初值MOVTL0,#6MOVR2,#50;中断50次为25msSETBET0;允许T0中断SETBEA;开中断SETBTR0;启动定时计数SJMP$;等待中断TS:DJNZR2,TS1;10ms没到则返回MOVR2,#50;中断50次为25msCPLP1.3;输出取反CPLP1.2TS1:RETIEND评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。70、已知8051单片机系统时钟频率fosc=12MHz,试编写程序,使P1.0输出如下的矩形脉冲(要求利用中断技术,使用定时器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。ORG0LJMPSTARTORG0BHLJMPTSORG30HSTART:MOVTMOD,#02H;设T0为定时器,方式2MOVTH0,#216;送40μs定时初值MOVTL0,#216MOVR2,#25;40μs中断25次为1msSETBF0;高电平标志位,“1”表示输出高电平。SETBET0;允许T0中断SETBEA;开中断SETBTR0;启动定时SJMP$;等待中断TS:JBF0,TS1;如果当前输出高电平则转移第49页共49页 DJNZR2,TS2;输出低电平时间未到则返回MOVR2,#25;40μs中断25次为1msSETBP1.0;输出高电平SETBF0;输出高电平标志置1TS2:RETITS1:CLRP1.0;输出低电平CLRF0;清输出高电平标志RETIEND评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。71、已知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的状态变化1000次即可。T0的定时初值为:65536-50000*12/12=15536=3CB0HORG0LJMPSTARTORG0BHLJMPTSORG30HSTART:MOVTMOD,#01H;T0设为方式1MOVTH0,#3CH;送50ms定时初值MOVTL0,#0B0HSETBET0SETBEAMOVR2,#2;中断2次为100msMOVR3,#250;P1.0发生1000(250*4)次状态变化为输出500个方波MOVR4,#4SETBTR0;启动定时SJMP$;等待中断TS:MOVTH0,#3CH;送50ms定时初值MOVTL0,#0B0HDJNZR2,TS1;100ms未到则返回MOVR2,#2;中断2次为100msCPLP1.0;输出取反DJNZR3,TS1;输出变化不够250次则返回MOVR3,#250;为下一次的250次循环赋初值第49页共49页 DJNZR4,TS1;输出变化不到1000次则返回CLRTR0(或CLREA);停止定时(或禁止中断)TS1:RETI;中断返回END评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。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=56ORG0LJMPSTARTORG1BHLJMPTSORG30HSTART:MOVTMOD,#20H;设T1为方式2,定时器MOVTH1,#56;100μsMOVTL1,#56SETBET1;允许T1中断SETBEA;开中断MOVR2,#10;中断10次为1msCLRP1.1;输出低电平SETBTR;启动计数SJMP$;等待中断TS:DJNZR2,TS1;1ms没到则返回MOVR2,#10;中断10次为1msCPLP1.1;输出取反TS1:RETI;中断返回END评分办法:不要求写出程序的注释。T1的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。第49页共49页'