51单片机编程题基础复习题.docx
《51单片机编程题基础复习题.docx》由会员分享,可在线阅读,更多相关《51单片机编程题基础复习题.docx(12页珍藏版)》请在冰豆网上搜索。
51单片机编程题基础复习题
1、设计4*4的行列式键盘,并包含两位数码管,这16个键的键值为0~15,当某个键按下时,将这个键的键值通过两位数码管显示出来。
ORG0000H
LJMPMAIN
ORG0030H
MAIN:
MOVDPTR,#TAB
MOV30H,#0
LOOP:
LCALLSCAN
LCALLDISPLAY
SJMPLOOP
DISPLAY:
MOVA,30H
MOVB,#10
DIVAB
MOV40H,A
MOV41H,B
SETBP3.1
CLRP3.0
MOVA,40H
MOVCA,@A+DPTR
MOVP2,A
LCALLD20MS
SETBP3.0
CLRP3.1
MOVA,41H
MOVCA,@A+DPTR
MOVP2,A
LCALLD20MS
RET
SCAN:
MOVP1,#0FH;;行线送“0”
MOVA,P1;;读取列线值
ANLA,#0FH
MOVR4,A;列号信息
CJNEA,#0FH,NEXT1;;若列线均为“1”则无键按下
SJMPNEXT3
NEXT1:
ACALLD20MS;;有键按下,去除抖动
MOVP1,#0F0H;;列线送0
MOVA,P1;;读取列线值
ANLA,#0F0H
MOVR5,A;行号信息
CJNEA,#0F0H,KCODE;;若有键按下则键处理
NEXT3:
CLRF0;无键按下,F0为0
RET
KCODE:
SETBF0;;有键按下,F0为1
MOVA,R4;;计算列值
CJNEA,#0EH,NEXT4
MOVR4,#0
SJMPNEXT5
NEXT4:
CJNEA,#0DH,NEXT6
MOVR4,#1
SJMPNEXT5
NEXT6:
CJNEA,#0BH,NEXT7
MOVR4,#2
SJMPNEXT5
NEXT7:
MOVR4,#3
NEXT5:
MOVA,R5;;计算行值
CJNEA,#0E0H,NEXT8
MOVR5,#0
SJMPNEXT11
NEXT8:
CJNEA,#0D0H,NEXT10
MOVR5,#1
SJMPNEXT11
NEXT10:
CJNEA,#0B0H,NEXT9
MOVR5,#2
SJMPNEXT11
NEXT9:
MOVR5,#3
NEXT11:
MOVA,R5
MOVB,#4
MULAB
ADDA,R4
MOV30H,A;键值放在30H单元
RET
D20MS:
MOVR6,#50
DL2:
MOVR7,#100
DJNZR7,$
DJNZR6,DL2
RET
TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,
77H,7CH,39H,5EH,79H,71H
END
2、设计包含两个按键S1、S2和一位数码管的系统。
当S1按下时数码管显示的数增一,当增到9后,按下S1按键数值回到0;当S2按下时数码管显示的数减一,当减到0后,按下S2按键数值回到9。
ORG0000H
LJMPMAIN
ORG0030H
MAIN:
MOVDPTR,#TAB
MOVR5,#0
LOOP:
LCALLKEY
MOVA,R5
MOVCA,@A+DPTR
MOVP2,A
SJMPLOOP
KEY:
JBP1.0,KEY2
LCALLDELAY
JBP1.0,KEY2
JNBP1.0,$
INCR5
CJNER5,#10,NET
MOVR5,#0
NET:
RET
KEY2:
JBP1.1,NET
LCALLDELAY
JBP1.1,NET
JNBP1.1,$
DECR5
CJNER5,#0FFH,NET
MOVR5,#9
RET
DELAY:
MOVR6,#50
DL2:
MOVR7,#100
DJNZR7,$
DJNZR6,DL2
RET
TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,
6FH,77H,7CH,39H,5EH,79H,71H
END
3、设计60秒倒计时电路,完成程序设计,要求用定时器定时产生1秒的时间。
ORG0000H
LJMPMAIN
ORG000BH
LJMPT0INT
ORG0030H
MAIN:
MOVDPTR,#TAB
MOVR5,#59;存放秒数
MOVR4,#20
MOVTMOD,#01H
MOVTH0,#3CH;定时50ms
MOVTL0,#0B0H
SETBEA
SETBET0
SETBTR0
LOOP:
LCALLDISPLAY
SJMPLOOP
T0INT:
MOVTH0,#3CH;定时50ms
MOVTL0,#0B0H
DJNZR4,EXT
MOVR4,#20
DECR5
CJNER5,#0FFH,EXT
MOVR5,#59;存放秒数
EXT:
RETI
DISPLAY:
MOVA,R5
MOVB,#10
DIVAB
MOV40H,A
MOV41H,B
SETBP3.1
CLRP3.0
MOVA,40H
MOVCA,@A+DPTR
MOVP2,A
LCALLDELAY
SETBP3.0
CLRP3.1
MOVA,41H
MOVCA,@A+DPTR
MOVP2,A
LCALLDELAY
RET
DELAY:
MOVR6,#50
DL2:
MOVR7,#100
DJNZR7,$
DJNZR6,DL2
RET
TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,
6FH,77H,7CH,39H,5EH,79H,71H
END
4、用定时器定时产生周期为1MS,占空比为60%的矩形波。
ORG0000H
LJMPMAIN
ORG000BH
LJMPT0INT
ORG0030H
MAIN:
MOVR4,#10
MOVTMOD,#02H
MOVTH0,#156;定时100US
MOVTL0,#156
SETBEA
SETBET0
SETBTR0
SJMP$
T0INT:
DJNZR4,NEXT
MOVR4,#10
SETBP3.7
RETI
NEXT:
CJNER4,#4,EXT
CLRP3.7
EXT:
RETI
END
5、完成八盏发光二极管流水点亮的电路及程序设计,每个发光二极管点亮0.5秒。
ORG0000H
LJMPMAIN
ORG0030H
MAIN:
MOVR4,#0FEH
LOOP:
MOVP1,R4
LCALLDELAY
MOVA,R4
RLA
MOVR4,A
SJMPLOOP
DELAY:
MOVR5,#50
DL1:
MOVR6,#50
DL2:
MOVR7,#100
DJNZR7,$
DJNZR6,DL2
DJNZR5,DL1
RET
END
6、用动态显示法完成8位数码管的显示,显示内容为“20100618”。
ORG0000H
LJMPMAIN
ORG0030H
MAIN:
MOVDPTR,#TAB
MOV30H,#2
MOV31H,#0
MOV32H,#1
MOV33H,#0
MOV34H,#0
MOV35H,#6
MOV36H,#1
MOV37H,#8
LOOP:
LCALLDISPLAY
SJMPLOOP
DISPLAY:
MOVR0,#30H
MOVR2,#0FEH
LOP1:
MOVP3,R2
MOVA,@R0
MOVCA,@A+DPTR
MOVP2,A
LCALLDELAY
INCR0
MOVA,R2
RLA
MOVR2,A
CJNER0,#38H,LOP1
RET
DELAY:
MOVR6,#50
DL2:
MOVR7,#50
DJNZR7,$
DJNZR6,DL2
RET
TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,
6FH,77H,7CH,39H,5EH,79H,71H
END
7、简单编程题:
1)编程查找内部RAM的30H一50H单元中是否有0FFH这一数。
若查找到,则将52H单元置为01H,若未找到,则将51H单元置为00H。
FIND:
MOVR0,#30H
NET2:
MOVA,@R0
CJNEA,#0FFH,NET
MOV52H,#01H
RET
NET:
INCR0
CJNER0,#51H,NET2
MOV51H,#00H
RET
2)两个字符串分别存放在首地址为42H和52H的内部RAM中,字符串长度放在41H单元,请编程比较两个字符串。
若相等,则把数字00H送40H单元,否则把0FFH送40H单元。
COMP:
MOVR7,41H
MOVR0,#42H
MOVR1,#52H
LOOP:
MOVA,@R0
MOV30H,A
MOVA,@R1
CJNEA,30H,NET
INCR0
INCR1
DJNZR7,LOOP
MOV40H,#00H
RET
NET:
MOV40H,#0FFH
RET
3)在外部RAM首地址为TABLE的数据表中有10个字节数据,请编程将每个字节的最高位无条件地置1。
ZHIGA:
MOVDPTR,#TABLE
MOVR7,#10
LOOP:
MOVXA,@DPTR
ORLA,#80H
MOVX@DPTR,A
INCDPTR
DJNZR7,LOOP
RET
4)在内部RAM的41H单元开始存有一组单字节无符号数,数据长度为10,要求找出最小数存入40H单元。
FIND:
MOVR0,#42H
MOV40H,41H;40H中存放最小的数
LOOP:
MOVA,@R0
CJNEA,40H,NET
NET:
JNCNET2
MOV40H,A;当A小于40H单元的数时,小的数存入40H中
NET2:
INCR0
CJNER0,#4BH,LOOP
RET
5)请编写能完成16位二进制数67D3H减去23F9H运算的程序,计算结果的高8位和低8位分别放在内部数据存储器的30H和31H单元。
CAL:
MOVA,#0D3H
CLRC
SUBBA,#0F9H
MOV31H,A
MOVA,#67H
SUBBA,#23H
MOV30H,A
RET
6)存放在外部数据存储器2000H单元的自变量X为一无符号数,函数Y存放在内部数据存储器30H单元中,请编写满足如下关系的程序:
CAL:
MOVDPTR,#2000H
MOVXA,@DPTR
CJNEA,#40,NET
NET:
JNCNET2
MOVB,#5
MULAB
NET2:
MOV30H,A
RET