单片机程序Word格式文档下载.docx
《单片机程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机程序Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
存高字节BCD
RET
4将存于外部RAM8000H开始的50H数据传送0010H的区域,请编程实现。
MOVDPTR,#8000H
MOVR0,#10H
MOVR2,#50H
LOOP:
MOVXA,@DPTR;
取数
MOVX@R0,A;
存数
1NCDPTR
DJNZR2,LOOP
5请将片外RAM20H-25H单元清零。
MOVR0,#20H
MOVR7,#06H
CLRA
MOVX@R0,A
INCR0
DJNZR7,LOOP
6请将ROM3000H单元内容送R7
MOVDPTR,#3000H
MOVCA,@A+DPTR
MOVR7,A
7编程题
CYADPTR片外01H片外00H片外8000H
001H8000H0lH00H86H
MOVDPTR,#8000H;
加数单元地址送DPTR
MOVXA,@DPTR;
取加数之一
ADDA,20H;
两数相加
MOVR0,#00H;
和值的低位送片外00H单元
MOVX@R0,A
CLRA;
计算和值的高位
ADDCA,#00H
MOVX@R0,A;
高位送片外01H单元
RET
8有一长度为10字节的字符串存放在8031单片机内部RAM中,其首地址为40H。
要求将该字符串中每一个字符加偶校验位。
(以调用子程序的方法来实现。
)
源程序如下:
ORG1000H
MOVR0,#40H
MOVR7,#10
NEXT:
MOVA,@R0
ACALLSEPA
MOV@R0,A
INCR0
DJNZR7,NEXT
SJMP$
SEPA:
ADDA,#00H
JNBPSW.0,SRET
ORLA,#80H
SRET:
9从内部RAM30H单元开始,有10个单字节数据。
试编一个程序,把其中的正数、负数分别送40H和50H开始的内部RAM单元。
(10分)
MOVR0,#30H
MOVR1,#40H
MOVA,#50H
LOOP:
MOV20H,@R0
JB20H.7,FSHU
ZSHU:
MOV@R1,20H
INCR1
SJMPNEXT
FSHU:
XCHA,R1
MOV@R1,A
INCA
DJNZR7,LOOP
END
10将内部RAM20H为首的16个单元的8位无符号数排序写出程序,并作适当注释
SORT:
MOVR0,#20H
MOVR7,#07H
CLRTR0;
交换标志位复位
MOV2BH,A
MOV2AH,@R0
CLRC
SUBBA,@R0;
比较前后两个数
JCNEXT;
MOV@R0,2BH
DECR0
MOV@R0,2AH
SETBTR0;
置交换标志位有效
DJNZR7,LOOP
JBTR0,SORT;
若交换标志位有效,继续进行
HERE:
END
11将字节地址30H~3FH单元的内容逐一取出减1,然后再放回原处,如果取出的内容为00H,则不要减1,仍将0放回原处。
MOVR7,#10H
MOVR1,#30H
CJNE@R1,#00H,NEXT
MOV@R1,#00H
SJMPNEXT1
NEXT:
DEC@R1
NEXT1:
INCR1
DJNZR7,LOOP
12数据块传送,将RAM从30H开始的连续32个单元的内容传递给片内RAM从60H开始的连续32个单元。
MOVR7,#20H
MOVR0,#30H
MOVR1,#60H
MOVA,@R0
MOVR1,A
DJNZR7,LOOP
13将4个单字节数放片内30H~~33H,它们求和结果放在片内40H,41H单元。
MOVR7,#04H
MOVR0,30H
CLRA
MOV41H,A
ADDA,@R0
JNCNEXT
INC41H
DJNZ:
R7,LOOP
MOV40H,A
SJMP$
END
14RAM中40H单元内存有一个十六进制数,把这个数转换为BCD码的十进制数,BCD码的十位和个位放在累加器A中,百位放在R2中。
ORG2200H
MOVA,40H
MOVB,#64H
DIVAB
MOVR2,A
MOVA,#0AH
XCHA,B
ORLA,B
15编程序将片内40H-46H单元内容的高4位清零,保持低4位不变。
MOVR7,#07H
MOVA,@R0
ANLA,#0FH
MOV@R0,A
DJNZR7,LOOP
16编写一程序实现将1000H单元开始的100个单元的数据转移到2000H开始的单元中。
(8分)
ORG0000H
MOVDPTR,#1000H;
给源数据块地址指针DPTR赋初值
MOVP2,#20H;
给目的数据块地址指针P2和R0赋初值
MOVR0,#00H
MOVXA,@DPTR
MOVX@R0,A
INCDPTR
CJNER0,#64H,LOOP
17设R0=20H,R1=25H,(20H)=80H,(21H)=90H,(22H)=A0H,(25H)=A0H,(26H)=6FH,(27H),下列程序执行后,结果如何?
(20H)=20H(21H)=00H(22H)=17H(23H)=01HCY=1A=17HR0=23HR1=28H
CLRC
MOVR2,#3
ADDCA,@R1
MOV@R0,A
DJNZR2,LOOP
MOV@R0,#01H
NEXT:
DECR0
18编写航标灯控制程序。
要求航标灯在白天熄灭,在夜晚断续点亮,时间间隔2秒,即亮2秒,息2秒,周期循环进行。
(20分)
主程序
ORG2000H
MAIN:
MOVSP,#30H
GAT0:
CLRP1.7
MOVTMOD,#09H;
T0定时,模式1,GATE=1
MOVTL0,#058H;
T0计算初值
MOVTH0,#9EH
MOVR7,#28H;
软件计数初值
HERE1:
JNBP3.2,HERE1;
夜晚到了吗?
P3.2=0(白天)转HER1即停在此语句等待,夜晚到了P3.2=1往下执行。
到了,启动T0
SETBET0;
允许T0中断
SETBEA;
CPU开中断
HERE2:
JBP3.2,HERE2;
白天到了吗?
P3.2=1(黑夜)转HERE2,即停在此语句等待,白天到了P3.2=0往下执行。
到了,关T0
CLRET0;
禁止T0中断
CLREA;
关中断
CLRP1.7;
关信号灯
SJMPGAT0
中断服务程序
ORG000BH
SJMPT0INT
ORG0020H
T0INT:
重赋T0初值
MOVTH0,#9EH
DJNZR7,EXIT;
软件计数为零吗?
计数已到,重赋初值
CPLP1.7;
输出取反,控制灯亮或灭
EXIT:
RETI;
中断返回
7、简单编程题:
1)编程查找内部RAM的30H一50H单元中是否有0FFH这一数。
若查找到,则将52H单元置为01H,若未找到,则将51H单元置为00H。
FIND:
MOVR0,#30H
NET2:
MOVA,@R0
CJNEA,#0FFH,NET
MOV52H,#01H
NET:
CJNER0,#51H,NET2
MOV51H,#00H
2)两个字符串分别存放在首地址为42H和52H的内部RAM中,字符串长度放在41H单元,请编程比较两个字符串。
若相等,则把数字00H送40H单元,否则把0FFH送40H单元。
COMP:
MOVR7,41H
MOVR0,#42H
MOVR1,#52H
LOOP:
MOV30H,A
MOVA,@R1
CJNEA,30H,NET
MOV40H,#00H
MOV40H,#0FFH
3)在外部RAM首地址为TABLE的数据表中有10个字节数据,请编程将每个字节的最高位无条件地置1。
ZHIGA:
MOVDPTR,#TABLE
MOVR7,#10
MOVXA,@DPTR
ORLA,#80H
MOVX@DPTR,A
4)在内部RAM的41H单元开始存有一组单字节无符号数,数据长度为10,要求找出最小数存入40H单元。
FIND:
MOV40H,41H;
40H中存放最小的数
CJNEA,40H,NET
JNCNET2
MOV40H,A;
当A小于40H单元的数时,小的数存入40H中
INCR0
CJNER0,#4BH,LOOP
5)请编写能完成16位二进制数67D3H减去23F9H运算的程序,计算结果的高8位和低8位分别放在内部数据存储器的30H和31H单元。
CAL:
MOVA,#0D3H
CLRC
SUBBA,#0F9H
MOV31H,A
MOVA,#67H
SUBBA,#23H
MOV30H,A
1、设计4*4的行列式键盘,并包含两位数码管,这16个键的键值为0~15,当某个键按下时,将这个键的键值通过两位数码管显示出来。
ORG0030H
MOV30H,#0
LCALLSCAN
LCALLDISPLAY
SJMPLOOP
DISPLAY:
MOVA,30H
MOVB,#10
DIVAB
MOV40H,A
MOV41H,B
SETBP3.1
CLRP3.0
MOVA,40H
MOVP2,A
LCALLD20MS
SETBP3.0
CLRP3.1
MOVA,41H
RET
SCAN:
MOVP1,#0FH;
;
行线送“0”
MOVA,P1;
;
读取列线值
ANLA,#0FH
MOVR4,A;
列号信息
CJNEA,#0FH,NEXT1;
若列线均为“1”则无键按下
SJMPNEXT3
ACALLD20MS;
有键按下,去除抖动
MOVP1,#0F0H;
列线送0
MOVA,P1;
ANLA,#0F0H
MOVR5,A;
行号信息
CJNEA,#0F0H,KCODE;
若有键按下则键处理
NEXT3:
CLRF0;
无键按下,F0为0
KCODE:
SETBF0;
有键按下,F0为1
MOVA,R4;
计算列值
CJNEA,#0EH,NEXT4
MOVR4,#0
SJMPNEXT5
NEXT4:
CJNEA,#0DH,NEXT6
MOVR4,#1
NEXT6:
CJNEA,#0BH,NEXT7
MOVR4,#2
NEXT7:
MOVR4,#3
NEXT5:
MOVA,R5;
计算行值
CJNEA,#0E0H,NEXT8
MOVR5,#0
SJMPNEXT11
NEXT8:
CJNEA,#0D0H,NEXT10
MOVR5,#1
NEXT10:
CJNEA,#0B0H,NEXT9
MOVR5,#2
SJMPNEXT11
NEXT9:
MOVR5,#3
NEXT11:
MOVA,R5
MOVB,#4
MULAB
ADDA,R4
MOV30H,A;
键值放在30H单元
D20MS:
MOVR6,#50
DL2:
MOVR7,#100
DJNZR7,$
DJNZR6,DL2
TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
2、设计包含两个按键S1、S2和一位数码管的系统。
当S1按下时数码管显示的数增一,当增到9后,按下S1按键数值回到0;
当S2按下时数码管显示的数减一,当减到0后,按下S2按键数值回到9。
ORG0000H
ORG0030H
MOVR5,#0
LCALLKEY
MOVA,R5
KEY:
JBP1.0,KEY2
LCALLDELAY
JBP1.0,KEY2
JNBP1.0,$
INCR5
CJNER5,#10,NET
KEY2:
JBP1.1,NET
LCALLDELAY
JBP1.1,NET
JNBP1.1,$
DECR5
CJNER5,#0FFH,NET
MOVR5,#9
DELAY:
MOVR6,#50
MOVR7,#100
DJNZR7,$
DJNZR6,DL2
3、设计60秒倒计时电路,完成程序设计,要求用定时器定时产生1秒的时间。
ORG000BH
LJMPT0INT
MOVR5,#59;
存放秒数
MOVR4,#20
MOVTMOD,#01H
MOVTH0,#3CH;
定时50ms
MOVTL0,#0B0H
SETBEA
SETBET0
SETBTR0
LCALLDISPLAY
T0INT:
MOVTH0,#3CH;
DJNZR4,EXT
CJNER5,#0FFH,EXT
EXT:
CLRP3.0
LCALLDELAY
4、用定时器定时产生周期为1MS,占空比为60%的矩形波。
MOVR4,#10
MOVTMOD,#02H
MOVTH0,#156;
定时100US
MOVTL0,#156
SETBTR0
DJNZR4,NEXT
SETBP3.7
RETI
CJNER4,#4,EXT
CLRP3.7
END
5、完成八盏发光二极管流水点亮的电路及程序设计,每个发光二极管点亮0.5秒。
MOVR4,#0FEH
MOVP1,R4
MOVA,R4
RLA
MOVR4,A
SJMPLOOP
MOVR5,#50
DL1:
DJNZR5,DL1
6、用动态显示法完成8位数码管的显示,显示内容为“20100618”。
MOV30H,#2
MOV31H,#0
MOV32H,#1
MOV33H,#0
MOV34H,#0
MOV35H,#6
MOV36H,#1
MOV37H,#8
MOVR0,#30H
MOVR2,#0FEH
LOP1:
MOVP3,R2
MOVA,@R0
MOVA,R2
MOVR2,A
CJNER0,#38H,LOP1
MOVR6,#50
MOVR7,#50
DJNZR7,$
DJNZR6,DL2