《单片机原理编程题(共29页).doc》由会员分享,可在线阅读,更多相关《单片机原理编程题(共29页).doc(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上一 编程题 (每小题8分,共16分)1. 设在内RAM 40H开始的存储区有若干个字符和数字,已知最后一个为字符“$“(并且只有一个,试统计这些字符数字的个数,结果存入30H单元中。参考程序:ORG 0000HSTART:MOV R1,#40H;R1作为地址指针CLR A;A作为计数器LOOP:CJNE R1,#24H,NEXT;与“$”号比较,不等转移SJMP NEXT1;找到“$“结束循环NEXT:INC A;计数器加1INC R1;指针加1SJMP LOOP;循环NEXT1:INC A;再加入”$”这个字符MOV 30H,A;存结果END2. 试编一程序,分别统
2、计在内部RAM的30H50H单元的数据区中奇数和偶数的个数,并将奇数和偶数的个数分别存放在51H和52H单元中。参考程序:ORG 0000HMOV 51H ,#0HMOV 52# ,#0HMOV R1 ,#30HMOV R0 ,#20HMOV A,R1INC R1ANL A , #01HJZ LOOP1INC 51HSJMP LOOP2LOOP1:INC 52HLOOP2:DJNZ R0 , LOOP3RET3用8XX51的P1口接8个LED发光二极管,由INT0接一消抖按键开关,开始P1.0的LED亮,以后由INT0按键每中断一次,下一个LED亮,顺序下移,且每次只一个LED亮,周而复始。请
3、编制程序。参考程序:ORG 0000H AJMP MAINORG 0003HRL A ;中断服务MOV P1,ARETIMAIN:MOV A,#0FFHMOV P1,A ;第一灯亮SETB EASETB EX0 ;允许INT0外部中断SETB IT0 ;中断触发方式为下降沿触发SJMP $ ;等待中断4.设有100个有符号数,连续存放在以2000H为首地址的存储区中,试编程统计其中正数、负数、零的个数并分别存放在30H、31H、32H单元中。MOV 30H,#0MOV 31H,#0MOV 32H,#0MOV DPTR ,#2000HMOV R1,#100L4:MOVX A,DPTRINC DP
4、TRCJNE A,#0,L1INC 32HSJMP L2L2:JC L3INC 30HSJMP L2L3:INC 31HL2:DJNZ R1,L4SJMP $5.编程将内部数据存储器20H24H单元压缩的BCD码转换成ASC存放在于25H开始的单元。参考程序:注意压缩的BCD码为一个字节占两位BCD码。ORG 0000HMOV R7,#05H ;R7为转换字节数MOV R0,#20H ;R0为源操作数地址MOV R1,#25H ;R1为目的操作数地址NE:MOV A,R0ANL A,#0FH ;先取低位BCD码ADD A,#30H ;将BCD码转换成ASC码MOV R1,AINC R1MOV
5、A,R0ANL A,#0F0H ;取高位BCD码SWAP A ;半字节交换ADD A,#30H ;将高位BCD码转换成ASC码MOV R1,AINC R0 INC R1DJNZ R7,NESJMP $END编程题,另外加上第4章课件上的例子。三、程序解释(每小题5分,共10分)1ORG 0200HMOV DPTR,#1000H MOV R0,#20H LOOP:MOVX A,DPTRMOV R0,AINC DPTRINC R0CJNE R0,#71H,LOOP SJMP $程序功能:把片外数据存储器1000H1050H中的内容传送到片内数据存储器 20H70H中。2ORG 0200HMOV A
6、,R0ANL A,#0FHMOV DPTR,#TABMOVC A,A+DPTRMOV R0,ASJMP $TAB:DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H; 09的ASC码DB 41H,42H,43H,44H,45H,46H ;AF的ASC码程序功能:利用查表的方法实现RO中的十六进制数转换为ASC码对每小题程序中划线的指令含义(或指令作用)进行解释,并说明程序的作用。*1. 程序解释 ORG 100HMOV A,R0 ;R0的内容送A ANL A,#0FHMOV R1,A MOV A,R0SWAP A ;A的内容高低4位交换 ANL A,#0FHM
7、OV R2,A SJMP $ ;等待 END该程序的作用是:将原R0中数据按照高低4位分成两个字节,低位字节保存在R1中,高位字节保存到R2中。2. 程序解释 ORG 30HMOV R0,#data1 ; data1送R0 MOV R1,#data2MOVR2,#2CLR CLOOP: MOVA,R0SUBB A,R1 ;(A)-(C)-(R1)A MOV R0,AINC R0INC R1DJNZR2,LOOP ;(R2)-1不等于零,跳LOOP处SJMP $END该程序的作用是:将data1中的双字节数据减去data2中的双字节数据,结果保存到data1中3. 程序解释 ORG 30HVAR
8、DATA 30HFUNCDATA 31HMOV A,VAR ;30单元的内容送AJZ DONE ;A为零转移JNB ACC.7,POSI ;A的最高位为0(正数)转移MOV A,#0FFH ;提示:0FFH表示-1SJMP DONEPOSI:MOV A, #01HDONE:MOV FUNC,ASJMP $END该程序的作用是:判断30H单元中的内容,结果放在31H单元中。大于0放1,小于0放-1,等于零放0。 4. 程序解释 ORG 100HMOV A, R3 RL A ;A左循环一位(即乘2)MOV DPTR,#BRTAB ;绝对转移地址表起始地址送DPTR JMP A+DPTR ;(PC)
9、=(A)+(DPTR) BRTAB:AJMPROUT000AJMPROUT001AJMPROUT002AJMPROUT127END该程序的作用是:本程序完成128分支转移操作,根据R3中的数值转移到相应的128个分支程序中。5. 程序解释 ORG 0030H MOV R0, #22H ; 立即数22H送R0 MOV R0, #00H INC R0 ; R0中的内容加1 MOV R0, #01H INC R0MOV R0, #02H ; 02H送24H单元 SJMP $END该程序的作用是:向单片机内部RAM的22H,23H,24H单元分别送数据00,01,02。 6. 程序解释 ORG 003
10、0H MOV A, 20H MOV B, 21H DIV AB ; A除以B MOV 31H, A ; 商送30H单元 IMOV 31H,B ; 余数送31H单元SJMP$END该程序的作用是:将20H单元中有一个二进制数除以21H单元中二进制数,商保存到30H单元,余数保存到31H。7. 程序解释CHENGJIDATA 1000HGRADADATA20HGRADB DATA 21H MOVGRADA,#00HMOV GRADB,#00H MOVR2,#100 MOVDPTR,#CHENGJI ;1000H送DPTR LOOP:MOVXA,DPTRCJNEA,#60,LOOP1 LOOP1:
11、JNC NEXT1INC GRADB ;21H单元的内容加1 SJMP NEXTNEXT1: INC GRADANEXT: INC DPTRDJNZ R2,LOOP ;(R2)-1R2 不为零,转移 SJMP $END该程序的作用是 本程序完成对100个数(如100个学生成绩)的过滤统计,成绩在60以上的学生统计到GRADA,60的学生统计到GRADB。8. 程序解释LEN DATA 20HSUM DATA 21H BLOCK DATA 22HCLRA ;A清0 MOV R2,LEN MOV R1,#BLOCK LOOP:ADDA,R1 ;(A)+(R1)A INC R1CHECK:DJNZ
12、R2,LOOP ;LEN个单元未加完,继续 MOV SUM,A SJMP $ END该程序的作用是:完成BLOCK单元开始的LEN单元中数据个数的累加,累加结果保存到SUM单元中。 9. 程序解释XXDATA 40HYY DATA41HMOVA,XX JZ DONE MOVR0,#0FFH ;提示:0FFH表示-1 JNB ACC.7,NEG ;若A 0,则转向NEGMOVR0,#01H ; 01送R0 NEG:MOV A, R0DONE:MOV YY,A ;(A)送41H单元 SJMP$ END该程序的作用是:判断40H单元中的内容,结果放在41H单元中。大于0放1,小于0放-1,等于0放0
13、。 10. 程序解释ONEDATA 30HTWO DATA 31H;TWO地址定义为31HMAXDATA 32HCLRC;C清零MOV A,ONESUBB A,TWO;(A)-(31H)结果送AJNC XMAXYMAX:MOVA,TWOSJMPDONEXMAX:MOVA,ONEDONE:MOVMAX,A该程序的作用是:本程序完成ONE和TWO的两个单元中的数的比较,大数存入MAX单元中。 11. 程序解释BLOCK1 DATA 20HBLOCK2 DATA 40H MOV R0,#BLOCK1 MOV R1,#BLOCK2 MOV R2,#03 CLR CLOOP: MOV A,R0 ;被加数
14、送A ADDC A,R1 ;带进位加法 MOV R0,A ;和送(R0) INC R0 INC R1 DJNZ R2,LOOP1 SJMP $ END该程序的作用是:内部RAM中BLOCK1(20H)开始的三字节数与BLOCK2(40H)开始的两个三字节数相加,和数存放到BLOCK1开始的单元。 12. 程序解释SHIFT:MOV DPTR,#TABJMOV A,R2RL A ;A乘2ADD A,R2JMP A+DPTR;跳转到(A)+(DPTR)PCTABJ:LJMP PRG0;跳转到PRG0 LJMP PRG1LJMP PRGN该程序的作用是:根据内部RAM中R2数据转向不同的子程序,R2
15、=0转PRG0,R2=1转PRG1, R2=N转PRGN 13. 程序解释START:CLR AMOV R2,#10 MOV R1,#21H ;21H送R1 NEXT: ADD A,R1 ;(A)+(R1)A INC R1 DJNZ R2,NEXT ;未加完,跳转 MOV22H,A SJMP $ END该程序的作用是:完成21H单元开始的10个数据块的累加,结果保存到22H单元。14. 程序解释LEN DATA 20HMAX DATA 21H ADDR DATA 30H MOV MAX,#00H MOV R0,#ADDR LOOP: MOV A,R0 CJNE A,MAX,NEXT1 ;(A)
16、与(MAX)比较,不等去NEXTNEXT1: JC NEXT ;C=1 去NEXT MOV MAX,ANEXT: INC R0 ;R0内容加1 DJNZ LEN,LOOP SJMP $ END该程序的作用是:内部RAM中ADDR(30H)开始的x个数据的比较,将最大的数字送MAX单元。x由LEN(20H)单元给出。 15. 程序解释 MOV A,R0ANL A,#0FH ;0FH与A相与,结果送A MOV DPTR,#ASCTABMOVC A,A+DPTR ;查表 MOV R0,A ; 查表结果存入R0 SJMP $ASCTAB:DB 0, 1, 2, 3, 4 DB5, 6, 7, 8, 9
17、 DB A, B, C, D, E , F END该程序的作用是:将R0中低4位的0F的十六进制数据转换成ASCTAB中的编码存放到R0中。16. 程序解释 ORG 100HMERG:MOVX A,R0 ; 读片外RAM第一字节ANL A,#0FHSWAP A ;高低4位相互交换 MOV B,A INC R0MOVX A,R0 ANL A,#0FHORL A,B ;A或B, 结果送A DEC R0 MOVX R0,A SJMP $ END该程序的作用是:将R0指向的两个字节的低4位和并为一个字节,保存到原R0指向的存储单元。 17. 程序解释START:MOV DPTR,#DTATABMOVA
18、,R4 ;(R4)A ADD A,DPL ;(DPL)+(A)A MOVDPL,ACLR A ;清AADDCA,DPHMOVDPH,A CLR A MOVCA,A+DPTR MOVR5,A RETDTATAB: DB ;元素表格,高字节在前 DB END该程序的作用是:根据R4中的内容(元素序号)在DTATAB表格中查表,将查表得到的数据存入R5中。18. 程序解释START:MOV A, R0ACALL SQR ;调用子程SQR MOV R2,AMOV A, R1 ACALL SQRADD A,R2 ;(R2)+(A)A MOV R2,A SJMP $SQR: ADD A,#01HMOVC
19、A,A+PC ;查平方表 RETSQRTAB:DB 0,1,4,9,16 ;平方表 DB 25,36,49,64,81 END该程序的作用是:将R0和R1中的两个个位数进行平方元算,然后相加,和存入R2中。19. 程序解释MOV R2,#0AHMOV R0,#50HCLR ALOOP: MOV R0,A ;(A)(R0) INC R0DJNZ R2,LOOP ;(R2)-1不等于0,跳转 RET ;子程序返回 END 该程序的作用是: 将50H59H单元置0 20. 程序解释CONT:MOV R0, #10 ;10送R0 MOV 31H,#00HMOV R1,#01HCLOP:MOV A,R1
20、CLR CRLC A ;乘2 ADD A,31H ;(A)+(31H)结果送A MOV 31H,A INC R1 DJNZ R0,CLOPRETEND该程序的作用是: 将110十个数乘2后再累加,结果送31H单元。 21. 程序解释DLAY:MOV R7,#02H ;02H送R7 DL:MOVR6,#0FFHDL1:DJNZ R6,DL1 ;(R6)-1不为零转移。DJNZ R7,DL RETEND ;程序结束伪指令 该程序的作用是:利用R6,R7实现双循环延时子程序22. 程序解释MATH DATA 1000H PASS DATA 20HNOPASS DATA 21H MOV PASS,#0
21、0HMOV NOPASS,#00H MOV R2,#0C8HMOV DPTR,#MATHLOOP:MOVX A, DPTR ;片外单元(DPTR)ACJNE A,#60,LOOP1 ;(A)不等于60转移 LOOP1: JNC NEXT1NEXT: INC NOPASS SJMP NEXT2NEXT1: INC PASS ;PASS单元内容加1 NEXT2: INC DPTR DJNZ R2,LOOP RET END该程序的作用是:完成1000H开始的200(C8H)个数的过滤统计,在60及以上的统计到PASS,60的到NOPASS。 23. 程序解释CLEAN:MOV DPTR,#1000H
22、 ; 设置数据区首地址 MOVR2,#51HCLR ACLOOP:MOVX DPTR, A ; 0 (DPTR)INC DPTR DJNZR2,CLOOP ; R2-1不为零转移 RET END该程序的作用是:将外部RAM1000H1050H单元的内容清零。24. 程序解释DMOV:MOV DPTR,#2000HMOV R2,#00HDLOOP:MOVX A,DPTR ;设置源数据区首地址MOV DPH,#30H ;置目的数据区高8位地址 MOVX DPTR,A MOV DPH,#20HINC DPTR ;指向下一个数据单元 DJNZ R2,DLOOP END该程序的作用是:将2000H20F
23、FH的数据块传送到3000H30FFH单元 25. 程序解释LOK1:MOV21H,0MOVR2,#08H;置统计次数MOVA,20HLOOP:RLC A;A的内容带进位作循环JNCLP1INC 21HLP1:DJNZR2,LOOP;次数未完继续RET该程序的作用是:求20H单元数据中”1”的个数,并将统计结果存入21H。 26. 程序解释SUM DATA31HBLOCK DATA33H CLR ACLRCMOV SUM,AMOVSUM+1,AMOVR2,#10MOVR1,#BLOCK ;33H送R1LOOP:MOV A,SUMADD A,R1 ;(A)+(R1)AMOV SUM,AMOV A
24、,SUM+1ADDCA,0 ;加进位位到高字节MOV SUM+1,AINC R1DJNZ R2,LOOPSJMP $END该程序的作用是:完成BLOCK开始的10个字节数据的累加,结果(双字节)保存到(SUM+1)(SUM)。27. 程序解释ORG 0000HSJMP MAIN;跳转到MAINORG 0003H. ORG 0030HMain:;主程序SUBINT0: RETI;INT0中断返回SUB_T0: SUB_INT1: SUB_T1: SUB_UART: 该程序的作用是:8031/8051系统程序框架,包括主程序及全部中断服务程序框架。28. 程序解释TB:MOVA,R2ADDA,R2
25、MOVR3,AADDA,#6MOVCA,A+PC;查第一字节XCHA,R3;交换A,R3内容,保存在R3ADDA,#3MOVCA,A+PCMOVR4,ARETTAB:DW1520,3721,DW该程序的作用是:根据R2内容为索引,在TAB检索数据,检索结果存放到R3R4中。(TAB中内容为双字节数据) 29. 程序解释DATLEN DATA 21HSEACH:MOV R0,#30H ;30H送R0 MOV 20H,#0FFHSLOP: MOV A,R0CJNEA,20H,NEXT ;A与20H单元内容比较 NEXT: JNCSLP1 ;(A)大,跳转 MOV 20H,ASLP1: INC R0
26、DJNZ DATLEN,SLOP RET END该程序的作用是:将30H开始的DATLEN个数据中最小的数搜出,保存到20H单元。30. 程序解释 ORG 100HDATAX DATA 10HDATAY DATA 11HCLR C ;清C MOV A,DATAXRLC A ;A左循环 JNC POSICLR A SJMP DONEPOSI: MOVA,#01HDONE:MOV DATAY,A ;(A)送DATAY SJMP $ END该程序的作用是: 判断10H单元的内容,结果送11单元,大于等于零时送1,小于零时送零。 31. 程序解释ORG100HMOVA,R0CJNEA,#3AH,NEX
27、T1;(A)与3AH比较JNCERRCJNE A,#30HJCERR;有借位,跳转CLRCSUBBA,#30H;转换ASCII码为十进制数字SJMPDONEERR:MOVA,#0FFHDONE:MOVR0,ASJMP$END该程序的作用是:完成将R0中十进制数字09的ASCII码值转换为十进制值,结果存放到R0。32. 程序解释CONP:MOVDPTR,#8000H ;置外RAM数据区首地址MOVR0,#20HCLOP: MOVA,R0 JB ACC.0,LP1 ;判奇偶,奇数,转判下一个MOVXDPTR,AINC DPTRLP1: INC R0CJNE R0,#30H,CLOP ;判循环,未
28、完继续 RET该程序的作用是: 完成对202FH单元中的数据判断,如果数据为偶数,将被写入外部RAM中8000H开始的存储单元。五、综合设计题()1、设计一串行通信接收程序,将接收的16个数据存入片内50H5FH中,串行口为方式1,波特率为1200bps,SMOD=0,fosc6MHz。参考答案T1工作方式2:,x243f3hMOVTMOD,#BMOVSCON,#BMOVPCON,#00HMOVTH1,#0F3HMOVTL1,#0F3HCLRESMOVR7,#16MOVR0,#50HSETBTR1WAIT:JNBRI,WAITCLRRIMOVR0,SBUFINCR0DJNZR7,WAIT2.试
29、编程要求用T1定时器控制P1.7引脚输出周期为40ms、占空比为50的矩形脉冲。要求主程序入口地址0050H及中断服务子程序入口地址2000H。fosc=6MHz(15)方式1:(216x)220000,xdbf0hORG000HLJMPMAINORG001BHLJMPT1_INTORG0050HMAIN:MOVTMOD,#BMOVTH1,#0D8HMOVTL1,#0F0HSETBEASETBET1SETBTR1SJMP$ORG2000HT1_INT:CPLP1.7MOVTH1,#0D8HMOVTL1,#0F0HRETI3、试编制程序,使T0每计满500个外部输入脉冲后,由T1定时,在P1.0
30、输出一个脉宽10ms的正脉冲(假设在10ms内外部输入脉冲少于500个),fosc12MHz。(15)计算过程如下:(216-x1)*1us=10000us x1=b8f0h216-x0=500us x0=fe0chorg000hljmpmainorg00bhljmpt0_intorg01bhljmpt1_intorg100hmain:movsp,#60hmovtmod,#bmovie,#bmovth0,0fehmovtl0,0chclrp1.0setbtr0sjmp$t0_int:movth0,0fehmovtl0,0chmovth1,#0b8hmovtl1,#0f0hsetbp1.0setbtr1retit1_int:clrp1.0clrtr1reti4.如下图示,甲乙两机进行通信,要求甲机能读取8个按键的状态(0或1)并将读到的状态发送给乙机,乙机接收到后将数据通过8个发光二极管显示,要求编写甲乙两机的通信程序。(20)T1工作在方式2:波特率1200T1初值:甲机:MAIN:MOVTMOD,#BMOVSCON,#BMOVPCON,#00HMOVTH1,#0F3HMOVTL1,#0F3HCLRESSETBTR1MOVP1,#0FFHLOOP:MOVA,P1