单片机考试常见试题程序分析题.pdf
单单片片机机考考试试常常见见试试题题程程序序分分析析题题-CAL-FENGHAI.Network Information Technology Company.2020YEAR程序分析及编程1.设(A)=04H,(CY)=1, 写出下列各条指令的结果。RL A; (A)= 08HRR A; (A)= 02HRLC A; (A)= 09HRRC A;(A)= 82H2 设(A)=7AH,(R0)=30H,(30H)=A5H,(CY)=1,则执行下列指令后则:DPH=( ),DPL=( ),SP=( ):答:DPH=3CH , DPL=5FH , SP=4FH7.假定,SP=60H,A=30H,B=70H,执行下POPPOPPOPDPHDPLSP12.阅读下列程序段并回答问题 。(1).该程序执行何种操作 (2).已知初值(60H)=23H,(61H)=61H,运行程序后62H 内容 CLR C MOV A,#9AH SUBB A,60H ADD A,61H写出下列各条指令的结果。 MOV A ,R0(A)=30H (R0)=30H XCH A, R0(A)=30H (R0)=30H XCHD A,R0 (A)=A5H (R0)=30H(30H)=30H ADD A,#30H (A)=D5H (CY)=1 ADDC A,30H(A)=06H (CY)=1 SUBB A,#30H (A)=D5H (CY)=14.已知程序执行前有 A=02H,SP=52H,(51H)=FFH,(52H)=FFH。下述程序执行后:请问:A=( ),SP=( ),(51H)=( ),(52H)=( ),PC=( )。POPDPHPOPDPLMOVDPTR,#4000HRLAMOVB,AMOVCA,A+DPTRPUSHAMOVA,BINCAMOVCA,A+DPTRPUSHARETORG4000HDB10H,80H,30H,50H,30H,50H答:(A)=50H ,(SP)=50H ,(51H)=30H , (52H)=50H ,(PC)=5030H5.假定 A=83H,(R0)=17H,(17H)=34H,执行以下指令后,A 的内容为( )。:ANLA,#17HORL17H,AXRLA,R0CPLA 答:0CBH6.如果 DPTR=507BH,SP=32H,(30H)=50H,(31H)=5FH,(32H)=3CH,列指令后,SP 的内容为( ),61H 单元的内容为( ),62H 单元的内容为( )。PUSHAPUSHB 答:62H ,30H , 70H8.计算下面子程序中指令的偏移量和程序执行的时间(晶振频率为 12MHz)。MOVR3,#15H;1 个机器周期DL1:MOV R4,#255 ;1 个机器周期DL2:MOV P1,R3;2 个机器周期DJNZR4,DL2;2 个机器周期DJNZR3,DL1;2 个机器周期RET;2 个机器周期答:15348us析:(22)25512)151215348us9. 假定 A=83H,(R0)=17H,(17H)=34H,执行以下指令后,A 的内容为( )。ANLA,#17HORL17H,AXRLA,R0CPLA答:0CBH10. 如果(DPTR)=507BH,(SP)=32H,(30H)=50H,(31H)=5FH,(32H)=3CH,则执行下列指令后:DPH 内容为(),DPL内容为(),SP 内容为()。POPDPH;POPDPL;POPSP;答:(DPH)= 3CH,(DPL)=5FH,(SP)=50H11.假设外部数据存储器 2000H 单元的内容为 80H,执行下列指令后,累加器 A 中的内容为()。MOVP2,#20HMOVR0,#00HMOVXA,R0答:累加器 A 中的内容为(80H)2 DA A MOV 62H,A 答: 1)、该程序是单字节 BCD 码运算,是将(61H)(60H)62H 2)、(62H)=38H13.试编写 1 个程序,将内部 RAM 中 45H单元的高 4 位清 0,低 4 位置 1。答:MOVA, 45HANLA, #0FHORLA, #0FHMOV45H, A14.试编写程序,查找在内部 RAM 的 30H50H 单元中是否有 0AAH 这一数据。若有,则将 51H 单元置为“01H”;若未找到,则将 51H 单元置为“00H”。答:START: MOVR0,#30HMOVR2,#20HLOOP:MOVA,R0CJNEA,#0AAH,NEXTMOV51H,#01HLJMPEXITNEXT:INCR0DJNZR2,LOOPMOV51H,#00HEXIT:RET15. 编写程序,要求使用 T0,采用方式 2定时,在 P1.0 输出周期为 400s,占空比为 10:1 的矩形脉冲。解:根据题意,从 P1.0 输出的矩形脉冲的高低电平的时间为 10:1,则高低电平的时间分别为 363.63s 和 36.37s。如果系统采用 6MHz 晶振的话,Tcy 2s,因此高低电平输出取整,则约为 364s 和36s。编写程序如下:ORG0000HLJMPMAINORG000BHLJMPIT0PMAIN:MOVTMOD,#02H;定时器/计数器 T0 为定时方式 2MOVTL0,#4AH;定时 364s初值赋值SETBTR0;启动 T0,开始计数SETBET0;允许 T0 中断SETBEA;CPU 开中断SETBP1.0WAIT:AJMPWAITIT0P:CLREACLRP1.0;关中断MOVR0,#9DLY:DJNZR0,DLY;延时 26sMOVTL0,#4AH;定时 364s初值赋值SETBP1.0SETBEARETI16. 设在外部 RAM 中有三个连续单元2001H,2002H,2003H,其中 2001H 和2002H 单元中分别存放两个 8 位无符号二进制数,比较这两个数的大小,然后将大数送到 2003H 单元。COMPARE:MOV DPTR, #2001HMOVX A , DPTRMOV R0,AINC DPTRMOVX A,DPTRSUBB A ,R0JNC LOOPMOV A, R0INC DPTRMOVX DPTR ,ARETLOOP:INC DPTRMOVX DPTR ,ARET 17.将内部 RAM 40H 开始的 10 个单元,搬移到 50H 开始的 10 个单元中。MOV R0,#40HMOV R1,#50HMOV R2, #10LOOP1:MOV A, R0MOV R1,AINC R0INC R1DJNZ R2 ,LOOP1RET18. 设单片机晶振频率为 6MHz,使用定时器 0,以工作方式 2,在 P1.5 引脚输出一个周期为 200us 连续方波?解: MOV TMOD,#02H MOV TH0, #0CEHMOV TL0 ,#0CEHSETB TR0LOOP: JBC TF0,LOOP1 AJMP LOOPLOOP1: CPL P1.019. 编写一段程序,功能要求为:当 P1.0引脚的电平正跳变时,对 P1.1 的输入脉冲进行计数;当 P1.2 引脚的电平负跳变时,停止计数,并将计数值写入 R0、R1(高位存 R1,低位存 R0)。答:将 P1.1 的输入脉冲接入 INT0,即使用 T0 计数器完成对 P1.1 口的脉冲计数。编写程序如下:ORG0000HLJMPMAINORG000BHLJMPIT0PMAIN:JNBP1.0,MAINMOVTMOD,#05H;定时器/计数器 T0 为计数方式 1SETBTR0;启动 T0,开始计数SETBET0;允许 T0 中断SETBEA;CPU 开中断WAIT:JBP1.2,WAITCLREACLRTR0MOVR1,TH0MOVR0,TL0AJMP$3IT0P:INCR2RETI20.试编写一个程序(例如将 05H 和 06H拼为 56H),设原始数据放在片外数据区2001H 单元和 2002H 单元中,按顺序拼装后的单字节数放入 2002H。答:编程思路:首先读取 2001H 的值,保存在寄存器 A 中,将寄存器 A 的高四位和低四位互换,再屏蔽掉低四位然后将寄存器 A 的值保存到 30H 中,然后再读取2002H 的值,保存在寄存器 A 中,屏蔽掉高四位,然后将寄存器 A 的值与 30H 进行或运算,将运算后的结果保存在 2002H中。ORG 0000HMAIN:MOV DPTR,#2001H ;设置数据指针的初值MOVXA,DPTR;读取 2001H的值SWAPAANLA,#0F0H;屏蔽掉低四位MOV30H,A;保存 AINCDPTR;指针指向下一个MOVXA,DPTR;读取 2002H的值ANLA,#0FH ;屏蔽掉高四位ORLA,30H;进行拼装MOVXDPTR,A;保存到2002HEND21.编写程序,将外部数据存储器中的4000H40FFH 单元全部清零。解:本题主要考察了对外部数据块的写操作;编程时只要注意循环次数和 MOVX 指令的使用就可以了。ORG0000HMAIN: MOV A,#0;送预置数给 AMOVR0,#0FFH;设置循环次数MOVDPTR,#4000H;设置数据指针的初值LOOP: MOVX DPTR,A;当前单元清零INCDPTR;指向下一个单元DJNZ R0,LOOP;是否结束END22.编写程序,采用 8255A 的 C 口按位置位/复位控制字,将 PC7 置 0,PC4 置 1,(已知 8255A 各端口的地址为 7FFCH-7FFFH)。解:本题主要考察对 8255A 的 C 口的操作。其方式控制字的高位为 0 时,低四位对 C 口进行置位。由题目我们得到了方式控制字的地址为 7FFFH。ORG0000HMAIN:MOV DPTR,#7FFFH;控制字寄存器地址送 DPTRMOVA,#0EH;将 PC7 置 0MOVXDPTR,AMOVA,#09H;将 PC4 置 1MOVXDPTR,AEND23.试编写逻辑运算程序,功能为:F=X(Y+Z);F=XYZ其中 F X Y Z 均为位变量,依次存在以30H 为首址的位寻址区中。解(1): F BIT 30H X BIT 31H Y BIT 32H Z BIT 33HLOG1:MOV C,Y ;YC ORL C,Z ;(Y+Z)C ANL C,X ;X(Y+Z)C MOV F,C ;X(Y+Z)F RET ;解(2):LOG2:MOV C,Y ;YC ANL C,Z ;YZC ANL C,/X ;XYZC CPL C ;XYZC MOV F,C ;XYZF RET ;24.试编写程序,统计内 RAM 30H50H 单元中 FFH 的个数,并将统计结果存 51H。解:编程如下:LOKF:MOV 51H,#0 ;计数器清零 MOV R0,#30H ;置数据区首址LOP: MOV A,R0 ;读数据 CPL A ;取反 JNZ LP1 ;判 FFH,非FFH,转 INC 51H ;FFH,计数LP1: INC RO ;指向下一数据CJNE R0,#51H,LOP;判循环RET25试编写程序,找出外 RAM2000H200FH 数据区中的最小值,并放入R2 中。解:编程如下:SECH:MOV DPTR,#2000H ;置外 RAM 数据区首址MOV R2,#OFH ;置外 RAM 数据区长度(N-1) MOVX A,DPTR ;读第一个数据 MOV B,A;假设第一个数据为最小值SLOP:INC DPTR ;指向下一个数据 MOVX A,DPTR ;读下一个数据CJNE A,B,SLP1;新数据与最小值比较SLP1:JNC SLP2 ;新数据最小值,判断循环MOV B,A ;新数据最小值,新数据BSLP2:DJNZ R2,SLOP;判循环结束否? MOV R2,B;最小值R2 RET26已知 ROM 中存有 0100 的平方表,首地址为 TABDS,试根据累加器 A(100)中的数值查找对应的平方值,存入内RAM31H30H(双字节)。解:编程如下:DSQR:MOVDPTR,#TABDS;置 ROM 平方表首地址ADD A,Acc;A2AMOVC A, A+DPTR ;读平方值高 8 位MOV 31H,A;平方值高 8 位31HINC A;指向平方值低 8 位MOVC A,A+DPTR;读平方值低 8 位MOV 30H,A;平方值低 8 位30HRETTABDS:DW 0,0,0,1,0,4,0,9,0,16,0,25,27H,10H;0100 平方表(双字节)427.试编程实现 3 字节无符号数加法:R7R6R5+R4R3R2R0(3 个连续单元)。解:编程如下:ADD3: MOV A,R5 ADD A,R2;低位加 MOV R0,A;存低位和 INC R0;修改存储单元 MOV A,R6; ADDC A,R3;中位加 MOV R0,A ;存中位和 INC R0;修改存储单元 MOV A,R7; ADDC A,R7;高位加 MOV R0,A;存高位和 RET28.试编写程序,将外部 RAM2000H20FH数据块,传送到 3000H30FFH 区域。解:编程如下:DMOV:MOV DPTR,#2000H;置源数据区首址MOV R2,#00H ;置数据长度(256 个)DLOP:MOVX A,DPTR;读数据MOV DPH,#30H;置目的数据区高 8 位地址MOVX DPTR,A;存数据MOV DPH,#20H;置源数据区高 8 位地址INC DPTR;修改源数据区地址DJNZ R2,DLOP ;判循环结束否?RET29.从内 RAM20H 单元开始存有一组带符号数(补码),其个数已存放在 1FH 单元。要求统计其中大于 0,等于 0 和小于 0 的数的个数,并把统计结果分别存入 ONE,TWO,THREE3 个单元。解:编程如下: ONE EQU 30H TWO EQU 31H THREE EQU 32HSTOR:MOV R0,#20H ;置数据区首址SLOP: MOV A,R0;读数据 JZ LP1;数据=0,转 JB Acc.7,LP2;数据0,转 INC ONE;数据0,ONE 单元加 1LP0: INC RO;指向下一数据 DJNZ 1FH,SLOP;判统计结束否?未结束循环 RET ;统计结束,TWO 单元加 1LP1: INC TWO ;数据=0,TWO 单元加1 SJMP LPO;返回循环体LP2: INC THREE;数据0,THREE 单元加 1 SJMP LPO;返回循环体30.设在内部数据存储器中存放有 20 个字节数据,其起始地址为 M。试编写程序,找出数 0AH 的存放地址,并送入 N 单元。若 OAH 不存在,则将 N 单元清零。解:程序如下: M EQU 30H N EQU 2FHSECH:MOV R0,#M MOV R1,#20LOOP:CJNE R0,#0AH,LP1 MOV N,R0 RETLP1: INC R0 DJNZ R1,LOOP MOV N,#0 RET31.试编写程序,求出内 RAM20H 单元中“1”的个数,并将结果存入 21H 单元。解:编程如下:LOK1:MOV 21H,#O MOV R2,#08H MOV A,20HLOP: RLC A JNC LP1 JNC 21HLP1:DJNE R2,LOP RET32.试编写统计数据区长度的程序,设数据区从内 RAM30H 开始,该数据区以 0 结束,统计结果送入 2FH 中。解:编程如下:ADUP:MOV 2FH,#0 MOV R0,#30HALOP:MOV A,R0 JNZ LP1 RETLP1: INC 2FH INC R0 SJMP ALOP33.从内 RAM30H 单元开始存放着一组无符号数,其个数存在 21H 单元中。试编写程序,找出其中最小的数,并将其存入 20H单元中。解:编程如下:SECH: MOV RO,#3OH MOV 20H,#FFHSLOP: MOV A,R0 CJNE A,20H,NEXTNEXT: JNC SLP1 MOV 20H,ASLP1: INC R0 DJNZ 21H,SLOP RET34.用程序实现 c=a2+b2。设 a2b2 存于内RAM,AA,BB 单元;c 为双字节,存于内RAMCC,DD 单元。解:该题可用于程序来实现。通过两次调用查平方表子程序来得到 a 和 b,并在主程序中完成相加。编程如下: AA EQU 40H BB EQU 41H CC EQU 42H DD EQU 43HFUNC:MOV A,AA LCALL DSQR MOV DD,A MOV CC,31H MOV A,BB LCALL DSQR ADD A,DD MOV DD,A ADDC A,CC MOV CC,A RET35利用定时、计数器 T1 测量某正脉冲宽度,并存入内 RAM31H30H。设fosc=12MHz,脉冲从 P3.3 引脚输入,宽度小于 65536us。解:编程如下:PLUS: MOV TMOD,#90H MOV TH1,#0 MOV TL1,#0 JB P3.3,$ SETB TR1 JNB P3.3,$ JB P3.3,$ CLR TR1 MOV 31H,THO MOV 30H,TLO5 RET36. 设在内部 RAM 中 50H 开始有连续的 10个单元,求这 10 个单元之和,结果放在60H,61H,低位放在 60H,高位在 61H.解:程序编写如下:ORG 0000HACALL ADDTENWAIT: AJMP WAITADDTEN:MOV R0 ,50HMOV R1,#10MOV A,#00HMOV 60H, AMOV 61H, ALOOP1:ADD A, R0INC R0MOV 60H,AJC LOOP2DJNZ R1,LOOP1RETLOOP2:MOV A,61H;ADD A,#01HDJNZ R1 ,LOOP1RETEND1、请用数据传送指令来实现下列要求的数据传送。(14 分)(1)把 R0 的内容送到 R1MOVA,R0MOV R1,A(2)内部 RAM20H 单元的内容传送到 A 中。MOV A,20H(3)外部 RAM2000H 单元的内容送到 R0。MOV DPTR,#2000H(1 分)MOVX A,DPTR(1 分)MOV R0,A(2 分)2、设(A)=38H,(20H)=49H,PSW=00H,((4)外部 ROM1000H 单元的内容送内部 RAM20H 单元。MOV DPTR,#1000HMOV A,#00H(2 分)MOVC A,A+DPTRMOV 20H,A(2 分)1.请将片外 RAM 20H25H 单元清零 MOVR0,#20HMOV R7,#06HCLR ALOOP:MOVXR0,A INC R0 DJNZ R7,LOOP2请将 ROM 3000H 单元内容送 R7MOV DPTR, #3000HCLR AMOVC A,A+DPTRMOV R7,A1、设(A)=38H,R0=28H,(28H)=18H,执行下列程序后,(A)= 0E7HE7HORL A,#27HANL A,28HXCHD A,R0CPL AB)=02H,填写以下中间结果。SETB CADDC A, 20H (A)= 82H82H(CY)= 0 0 (AC)=1 1RLC A (A)=04H04H(CY)=1 1 (P)= 1 1MUL AB (A)= 08H08H (B)=00H00H (OV)= 0 0SETB EASETB EA6