单片机原理编程题.docx
《单片机原理编程题.docx》由会员分享,可在线阅读,更多相关《单片机原理编程题.docx(48页珍藏版)》请在冰豆网上搜索。
单片机原理编程题
一.编程题(每小题8分,共16分)
1.设在内RAM40H开始的存储区有若干个字符和数字,已知最后一个为字符“$“(并且只有一个,试统计这些字符数字的个数,结果存入30H单元中。
参考程序:
ORG0000H
START:
MOVR1,#40H;R1作为地址指针
CLRA;A作为计数器
LOOP:
CJNE@R1,#24H,NEXT;与“$”号比较,不等转移
SJMPNEXT1;找到“$“结束循环
NEXT:
INCA;计数器加1
、
INCR1;指针加1
SJMPLOOP;循环
NEXT1:
INCA;再加入”$”这个字符
MOV30H,A;存结果
END
2.试编一程序,分别统计在内部RAM的30H~50H单元的数据区中奇数和偶数的个数,并将奇数和偶数的个数分别存放在51H和52H单元中。
参考程序:
ORG0000H
MOV51H,#0H
MOV52#,#0H
!
MOVR1,#30H
MOVR0,#20H
MOVA,@R1
INCR1
ANLA,#01H
JZLOOP1
INC51H
SJMPLOOP2
LOOP1:
INC52H
LOOP2:
DJNZR0,LOOP3
|
RET
3.用8XX51的P1口接8个LED发光二极管,由INT0接一消抖按键开关,开始的LED亮,以后由INT0按键每中断一次,下一个LED亮,顺序下移,且每次只一个LED亮,周而复始。
请编制程序。
参考程序:
ORG0000H
AJMPMAIN
ORG0003H
RLA;中断服务
MOVP1,A
RETI
MAIN:
MOVA,#0FFH
。
MOVP1,A;第一灯亮
SETBEA
SETBEX0;允许INT0外部中断
SETBIT0;中断触发方式为下降沿触发
SJMP$;等待中断
4.设有100个有符号数,连续存放在以2000H为首地址的存储区中,试编程统计其中正数、负数、零的个数并分别存放在30H、31H、32H单元中。
MOV30H,#0
MOV31H,#0
MOV32H,#0
:
MOVDPTR,#2000H
MOVR1,#100
L4:
MOVXA,@DPTR
INCDPTR
CJNEA,#0,L1
INC32H
SJMPL2
L2:
JCL3
INC30H
SJMPL2
¥
L3:
INC31H
L2:
DJNZR1,L4
SJMP$
5.编程将内部数据存储器20H~24H单元压缩的BCD码转换成ASCⅡ存放在于25H开始的单元。
参考程序:
注意压缩的BCD码为一个字节占两位BCD码。
ORG0000H
MOVR7,#05H;R7为转换字节数
MOVR0,#20H;R0为源操作数地址
MOVR1,#25H;R1为目的操作数地址
NE:
MOVA,@R0
%
ANLA,#0FH;先取低位BCD码
ADDA,#30H;将BCD码转换成ASCⅡ码
MOV@R1,A
INCR1
MOVA,@R0
ANLA,#0F0H;取高位BCD码
SWAPA;半字节交换
ADDA,#30H;将高位BCD码转换成ASCⅡ码
MOV@R1,A
INCR0
~
INCR1
DJNZR7,NE
SJMP$
END
编程题,另外加上第4章课件上的例子。
三、程序解释(每小题5分,共10分)
1.
ORG0200H
MOVDPTR,#1000H
/
MOVR0,#20H
LOOP:
MOVXA,@DPTR
MOV@R0,A
INCDPTR
INCR0
CJNER0,#71H,LOOP
SJMP$
程序功能:
把片外数据存储器1000H~1050H中的内容传送到片内数据存储器20H~70H中。
#
2.ORG0200H
MOVA,R0
ANLA,#0FH
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVR0,A
SJMP$
TAB:
DB30H,31H,32H,33H,34H,35H,36H,37H,38H,39H;0~9的ASCⅡ码
DB41H,42H,43H,44H,45H,46H;A~F的ASCⅡ码
。
程序功能:
利用查表的方法实现RO中的十六进制数转换为ASCⅡ码
对每小题程序中划线的指令含义(或指令作用)进行解释,并说明程序的作用。
*********************************
1.程序解释
ORG100H
MOVA,R0;R0的内容送A
ANLA,#0FH
MOVR1,A
MOVA,R0
SWAPA;A的内容高低4位交换
#
ANLA,#0FH
MOVR2,A
SJMP$;等待
END
该程序的作用是:
将原R0中数据按照高低4位分成两个字节,低位字节保存在R1中,高位字节保存到R2中。
2.程序解释
ORG30H
MOVR0,#data1;data1送R0
MOVR1,#data2
MOVR2,#2
。
CLRC
LOOP:
MOVA,@R0
SUBBA,@R1;(A)-(C)-((R1))→A
MOV@R0,A
INCR0
INCR1
DJNZR2,LOOP;(R2)-1不等于零,跳LOOP处
SJMP$
END
该程序的作用是:
将data1中的双字节数据减去data2中的双字节数据,结果
{
保存到data1中
3.程序解释
ORG30H
VARDATA30H
FUNCDATA31H
MOVA,VAR;30单元的内容送A
JZDONE;A为零转移
JNB,POSI;A的最高位为0(正数)转移
MOVA,#0FFH;提示:
0FFH表示-1
SJMPDONE
-
POSI:
MOVA,#01H
DONE:
MOVFUNC,A
SJMP$
END
该程序的作用是:
判断30H单元中的内容,结果放在31H单元中。
大于0放1,
小于0放-1,等于零放0。
4.程序解释
ORG100H
MOVA,R3
RLA;A左循环一位(即乘2)
\
MOVDPTR,#BRTAB;绝对转移地址表起始地址送DPTR
JMP@A+DPTR;(PC)=(A)+(DPTR)
……
BRTAB:
AJMPROUT000
AJMPROUT001
AJMPROUT002
……
AJMPROUT127
END
该程序的作用是:
本程序完成128分支转移操作,根据R3中的数值转移到
。
相应的128个分支程序中。
5.程序解释
ORG0030H
MOVR0,#22H;立即数22H送R0
MOV@R0,#00H
INCR0;R0中的内容加1
MOV@R0,#01H
INCR0
MOV@R0,#02H;02H送24H单元
SJMP$
>
END
该程序的作用是:
向单片机内部RAM的22H,23H,24H单元分别送
数据00,01,02。
6.程序解释
ORG0030H
MOVA,20H
MOVB,21H
DIVAB;A除以B
MOV31H,A;商送30H单元
IMOV31H,B;余数送31H单元
/
SJMP$
END
该程序的作用是:
将20H单元中有一个二进制数除以21H单元中二进制数,商保存到30H单元,余数保存到31H。
7.程序解释
CHENGJIDATA1000H
GRADADATA20H
GRADBDATA21H
MOVGRADA,#00H
MOVGRADB,#00H
MOVR2,#100
;
MOVDPTR,#CHENGJI;1000H送DPTR
LOOP:
MOVXA,@DPTR
CJNEA,#60,LOOP1
LOOP1:
JNCNEXT1
INCGRADB;21H单元的内容加1
SJMPNEXT
NEXT1:
INCGRADA
NEXT:
INCDPTR
DJNZR2,LOOP;(R2)-1→R2不为零,转移
SJMP$
)
END
该程序的作用是本程序完成对100个数(如100个学生成绩)的过滤统计,成绩在60以上的学生统计到GRADA,<60的学生统计到GRADB。
8.程序解释
LENDATA20H
SUMDATA21H
BLOCKDATA22H
CLRA;A清0
MOVR2,LEN
MOVR1,#BLOCK
LOOP:
ADDA,@R1;(A)+((R1))→A
|
INCR1
CHECK:
DJNZR2,LOOP;LEN个单元未加完,继续
MOVSUM,A
SJMP$
END
该程序的作用是:
完成BLOCK单元开始的LEN单元中数据个数的累加,累加结果保存到SUM单元中。
9.程序解释
XXDATA40H
YYDATA41H
MOVA,XX
[
JZDONE
MOVR0,#0FFH;提示:
0FFH表示-1
JNB,NEG;若A<0,则转向NEG
MOVR0,#01H;01送R0
NEG:
MOVA,R0
DONE:
MOVYY,A;(A)送41H单元
SJMP$
END
该程序的作用是:
判断40H单元中的内容,结果放在41H单元中。
大于0放1,
小于0放-1,等于0放0。
…
10.程序解释
ONEDATA30H
TWODATA31H;TWO地址定义为31H
MAXDATA32H
CLRC;C清零
MOVA,ONE
SUBBA,TWO;(A)-(31H)结果送A
JNCXMAX
YMAX:
MOVA,TWO
SJMPDONE
!
XMAX:
MOVA,ONE
DONE:
MOVMAX,A
该程序的作用是:
本程序完成ONE和TWO的两个单元中的数的比较,大数存入
MAX单元中。
11.程序解释
BLOCK1DATA20H
BLOCK2DATA40H
MOVR0,#BLOCK1
MOVR1,#BLOCK2
:
MOVR2,#03
CLRC
LOOP:
MOVA,@R0;被加数送A
ADDCA,@R1;带进位加法
MOV@R0,A;和送(R0)
INCR0
INCR1
DJNZR2,LOOP1
SJMP$
END
-
该程序的作用是:
内部RAM中BLOCK1(20H)开始的三字节数与BLOCK2(40H)开始的两个三字节数相加,和数存放到BLOCK1开始的单元。
12.程序解释
SHIFT:
MOVDPTR,#TABJ
MOVA,R2
RLA;A乘2
ADDA,R2
JMP@A+DPTR;跳转到(A)+(DPTR)→PC
TABJ:
LJMPPRG0;跳转到PRG0
LJMPPRG1
……
<
LJMPPRGN
该程序的作用是:
根据内部RAM中R2数据转向不同的子程序,R2=0转PRG0,R2=1转PRG1,…R2=N转PRGN
13.程序解释
START:
CLRA
MOVR2,#10
MOVR1,#21H;21H送R1
NEXT:
ADDA,@R1;(A)+((R1))→A
INCR1
DJNZR2,NEXT;未加完,跳转
MOV22H,A
《
SJMP$
END
该程序的作用是:
完成21H单元开始的10个数据块的累加,结果保存到22H单元。
14.程序解释
LENDATA20H
MAXDATA21H
ADDRDATA30H
MOVMAX,#00H
MOVR0,#ADDR
LOOP:
MOVA,@R0
)
CJNEA,MAX,NEXT1;(A)与(MAX)比较,不等去NEXT
NEXT1:
JCNEXT;C=1去NEXT
MOVMAX,A
NEXT:
INCR0;R0内容加1
DJNZLEN,LOOP
SJMP$
END
该程序的作用是:
内部RAM中ADDR(30H)开始的x个数据的比较,将最大的数字送MAX单元。
x由LEN(20H)单元给出。
15.程序解释
MOVA,R0
`
ANLA,#0FH;0FH与A相与,结果送A
MOVDPTR,#ASCTAB
MOVCA,@A+DPTR;查表
MOVR0,A;查表结果存入R0
SJMP$
ASCTAB:
DB‘0’,‘1’,‘2’,‘3’,‘4’
DB‘5’,‘6’,‘7’,‘8’,‘9’
DB‘A’,‘B’,‘C’,‘D’,‘E’,‘F’
END
该程序的作用是:
将R0中低4位的0~F的十六进制数据转换成ASCTAB中的编码存放到R0中。
!
16.程序解释
ORG100H
MERG:
MOVXA,@R0;读片外RAM第一字节
ANLA,#0FH
SWAPA;高低4位相互交换
MOVB,A
INCR0
MOVXA,@R0
ANLA,#0FH
ORLA,B;A或B,结果送A
;
DECR0
MOVX@R0,A
SJMP$
END
该程序的作用是:
将R0指向的两个字节的低4位和并为一个字节,保存到原R0指向的存储单元。
17.程序解释
START:
MOVDPTR,#DTATAB
MOVA,R4;(R4)→A
ADDA,DPL;(DPL)+(A)→A
MOVDPL,A
{
CLRA;清A
ADDCA,DPH
MOVDPH,A
CLRA
MOVCA,@A+DPTR
MOVR5,A
RET
DTATAB:
DB……;元素表格,高字节在前
DB……
END
《
该程序的作用是:
根据R4中的内容(元素序号)在DTATAB表格中查表,将查表得到的数据存入R5中。
18.程序解释
START:
MOVA,R0
ACALLSQR;调用子程SQR
MOVR2,A
MOVA,R1
ACALLSQR
ADDA,R2;(R2)+(A)→A
MOVR2,A
SJMP$
:
SQR:
ADDA,#01H
MOVCA,@A+PC;查平方表
RET
SQRTAB:
DB0,1,4,9,16;平方表
DB25,36,49,64,81
END
该程序的作用是:
将R0和R1中的两个个位数进行平方元算,然后相加,和存入R2中。
19.程序解释
MOVR2,#0AH
$
MOVR0,#50H
CLRA
LOOP:
MOV@R0,A;(A)→(R0)
INCR0
DJNZR2,LOOP;(R2)-1不等于0,跳转
RET;子程序返回
END
该程序的作用是:
将50H~59H单元置0
20.程序解释
CONT:
MOVR0,#10;10送R0
)
MOV31H,#00H
MOVR1,#01H
CLOP:
MOVA,R1
CLRC
RLCA;乘2
ADDA,31H;(A)+(31H)结果送A
MOV31H,A
INCR1
DJNZR0,CLOP
RET
】
END
该程序的作用是:
将1~10十个数乘2后再累加,结果送31H单元。
21.程序解释
DLAY:
MOVR7,#02H;02H送R7
DL:
MOVR6,#0FFH
DL1:
DJNZR6,DL1;(R6)-1不为零转移。
DJNZR7,DL
RET
END;程序结束伪指令
<
该程序的作用是:
利用R6,R7实现双循环延时子程序
22.程序解释
MATHDATA1000H
PASSDATA20H
NOPASSDATA21H
MOVPASS,#00H
MOVNOPASS,#00H
MOVR2,#0C8H
MOVDPTR,#MATH
LOOP:
MOVXA,@DPTR;片外单元((DPTR))→A
】
CJNEA,#60,LOOP1;(A)不等于60转移
LOOP1:
JNCNEXT1
NEXT:
INCNOPASS
SJMPNEXT2
NEXT1:
INCPASS;PASS单元内容加1
NEXT2:
INCDPTR
DJNZR2,LOOP
RET
END
该程序的作用是:
完成1000H开始的200(C8H)个数的过滤统计,在60及以上的统计到PASS,<60的到NOPASS。
?
23.程序解释
CLEAN:
MOVDPTR,#1000H;设置数据区首地址
MOVR2,#51H
CLRA
CLOOP:
MOVX@DPTR,A;0→(DPTR)
INCDPTR
DJNZR2,CLOOP;R2-1不为零转移
RET
END
该程序的作用是:
将外部RAM1000H~1050H单元的内容清零。
《
24.程序解释
DMOV:
MOVDPTR,#2000H
MOVR2,#00H
DLOOP:
MOVXA,@DPTR;设置源数据区首地址
MOVDPH,#30H;置目的数据区高8位地址
MOVX@DPTR,A
MOVDPH,#20H
INCDPTR;指向下一个数据单元
DJNZR2,DLOOP
\
END
该程序的作用是:
将2000H~20FFH的数据块传送到3000H~30FFH单元
25.程序解释
LOK1:
MOV21H,0
MOVR2,#08H;置统计次数
MOVA,20H
LOOP:
RLCA;A的内容带进位作循环
JNCLP1
INC21H
:
LP1:
DJNZR2,LOOP;次数未完继续
RET
该程序的作用是:
求20H单元数据中”1”的个数,并将统计结果存入21H。
26.程序解释
SUMDATA31H
BLOCKDATA33H
CLRA
CLRC
MOVSUM,A
~
MOVSUM+1,A
MOVR2,#10
MOVR1,#BLOCK;33H送R1
LOOP:
MOVA,SUM
ADDA,@R1;(A)+((R1))→A
MOVSUM,A
MOVA,SUM+1
ADDCA,0;加进位位到高字节
MOVSUM+1,A
INCR1
\
DJNZR2,LOOP
SJMP$
END
该程序的作用是:
完成BLOCK开始的10个字节数据的累加,结果(双字节)保存到(SUM+1)(SUM)。
27.程序解释
ORG0000H
SJMPMAIN;跳转到MAIN
ORG0003H
………..
】
ORG0030H
Main:
……;主程序
SUBINT0:
……
RETI;INT0中断返回
SUB_T0:
……
SUB_INT1:
……
SUB_T1:
……
SUB_UART:
……
该程序的作用是:
8031/8051系统程序框架,包括主程序及全部中断服务程序框架。
28.程序解释
!
TB:
MOVA,R2
ADDA,R2
MOVR3,A
ADDA,#6
MOVCA,@A+PC;查第一字节
XCHA,R3;交换A,R3内容,保存在R3
ADDA,#3
MOVCA,@A+PC
MOVR4,A
RET
~
TAB:
DW1520,3721,……
DW……
该程序的作用是:
根据R2内容为索引,在TAB检索数据,检索结果存放到R3R4中。
(TAB中内容为双字节数据)
29.程序解释
DATLENDATA21H
SEACH:
MOVR0,#30H;30H送R0
MOV20H,#0FFH
SLOP:
MOVA,@R0
CJNEA,20H,NEXT;A与20H单元内容比较
NEXT:
JNCSLP1;(A)大,跳转
[
MOV20H,A
SLP1:
INCR0
DJNZDATLEN,SLOP
RET
END
该程序的作用是:
将30H开始的DATLEN个数据中最小的数搜出,保存到20H单元。
30.程序解释
ORG100H
DATAXDATA10H
DATAYDATA11H
。
CLRC;清C
MOVA,DATAX
RLCA;A左循环
JNCPOSI
CLRA
SJMPDONE
POSI:
MOVA,#01H
DONE:
MOVDATAY,A;(A)送DATAY
SJMP$
END
—
该程序的作用是:
判断10H单元的内容,结果送11单元,大于等于零时送1,小于零时送零。
31.程序解释
ORG100H
MOVA,R0
CJNEA,#3AH,NEXT1;(A)与3AH比较
JNCERR
CJNEA,#30H
JCERR;有借位,跳转
CLRC
SUBBA,#30H;转换ASCII码为十进制数字
*
SJMPDONE
ERR:
MOVA,#0FFH
DONE:
MOVR0