单片机实训报告Word文档格式.docx
《单片机实训报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机实训报告Word文档格式.docx(36页珍藏版)》请在冰豆网上搜索。
结束
1.3、程序
ORG0100H
MOVDPTR,#7000H
MOVXA,@DPTR;
7000H中的内容送入A
ANLA,#0FH;
屏蔽高四位
SWAPA;
高低四位互换
MOVR0,A;
A中内容送入R0
INCDPTR;
修改地址指针
7001H中的内容送入A
ADDA,R0;
A和R0中内容相加
MOVX@DPTR,A;
A中内容送入7002H
SJMP$
END;
2、拆字程序
2.1、实训内容
把片外7000H单元中的内容拆开,高四位送入7000H中,低四位送入7001H中。
2.2、程序框图
把A中内容高低位互换后屏蔽高四位送入7001H中
A中的内容屏蔽高四位后送入7002H中
2.3、程序
ORG0000H
A中内容送入7001H
INCDPTR
3、数据传送程序
3.1、实训内容
(1)把片内RAM起始地址为30H的数据块中的内容分别送到片外RAM起始地址为7000H的数据块中,直到遇到内容为0DH时停止传送。
(2)把片内RAM起始地址为30H的数据块中的内容分别与片外RAM起始地址为7000H的数据块中的内容相交换,直到遇到内容为0DH时停止互换。
3.2、程序
(1)传送程序
ORG1000H
MOVR0,#30H;
起始地址送入R0
MOVDPTR,#7000H;
起始地址送入DPTR
LOOP1:
MOVA,@R0;
R0所指地址中的内容送入A
CJNEA,#0DH,LOOP;
A中内容与0D比较,不等转移,相等结束
SJMP$
LOOP:
MOVX@DPTR,A;
A中内容送入DPTR所指地址中
INCR0;
INCDPTR
SJMPLOOP1;
循环取数
END;
(2)互换程序
①程序一
MOVR0,#30H;
CJNE@R0,#0DH,LOOP;
内容与0D比较,不等转移,相等结束
片外RAM取出的数送入A
MOV20H,@R0;
片内RAM中取出的数送入20H暂存
MOV@R0,A;
A中内容送入R0所指地址单元中
MOVA,20H;
20H中的内容送入A
MOVX@DPTR,A;
A中内容送入DPTR所指地址单元中
INCR0;
END;
②程序二
MOV20H,@R0;
片内RAM中取出的数送入20H
MOVR1,20H;
20H中的数送入R1
MOVXA,@DPTR;
CJNER1,#0DH,LOOP;
R1中内容与0D比较,不等转移,相等结束
LOOP:
MOV@R0,A;
A中内容送入R0所指地址
MOVA,R1;
R1中内容送入A
A中内容送入DPTR所指地址
分析比较:
程序一是先比较和0D相等与否,然后判断是否互换;
而程序二是先把数取出分别寄存到不同的单元中,然后在和0D比较。
虽然两个程序都能实现互换要求,但从程序优化角度来看,程序一比较好。
4、数据排序程序
4.1、实训内容
编写并调试一个排序程序,用冒泡法将内部RAM中30H--39H中无符号数的正整数,按照从小到大的次序重新排列。
4.2、程序框图
R7-1=0?
交换标志位7FH置“1”
20H和21H中的内容交换
A≥(21H)?
R0所指地址中内容送21H
修改数据块指针
R0所指地址中内容送20H和A
R030H,R7块长-1
交换标志位7FH清零
N
Y
7FH=1?
Y
N
4.3、程序
MAIN:
MOVR0,#30H;
起始地址送数据块指针R0
MOVR7,#09H;
块长-1送R7
CLR7FH;
交换标志位清零
LOOP2:
R0所指地址中内容送20H
20H中内容送A
MOV21H,@R0;
CJNEA,21H,LOOP;
(20H)和(21H)比较
JCLOOP1;
若(20H)<
(21H),则LOOP1
若(20H)≥(21H),则两者交换
DECR0
MOV@R0,21H
SETB7FH;
交换标志位置“1”
DJNZR7,LOOP2;
若一次冒泡未完,则LOOP2
JB7FH,MAIN;
若交换标志位为1,则MAIN
SJMP$;
END
5、多分支程序
5.1、实训内容
编写一个程序,实现散转片内ROM20H中的内容(00H或01H或02H)。
5.2、分析
ROM
TAB
ROUT0
TAB+2ROUT1
TAB+4ROUT2
5.3、程序
20H送入A
RLA;
A中内容乘2
MOVDPTR,#TAB;
表头送DPTR
JMP@A+DPTR;
散转指令查表
TAB:
AJMPROUT0
AJMPROUT1
AJMPROUT2
ROUT0:
MOVA,#00H
ROUT1:
MOVA,#01H
ROUT2:
MOVA,#02H
6、多字节加法程序
6.1、实训内容
编写一个程序实现两个16进制数的加法,假设加数和被加数都是三字节,被加数在起始地址为内部RAM30H的数据块中,加数在起始地址为内部RAM40H的数据块中,且被加数的高位在30H,加数的高位在40H。
相加后的结果放入起始地址为30H的数据块中。
6.2、程序
MOVR0,#32H;
被加数低位送R0
MOVR1,#42H;
加数低位送R1
MOVR7,#03H;
字节数送R7
CLRC;
进位清零
被加数送A
ADDCA,@R1;
带进位相加
结果送到R0所指地址中
DECR0;
DECR1
DJNZR7,LOOP;
循环
MOV7FH,C;
进位送7FH中
若要进行十进制加法,需要用到十进制调整指令:
DAA。
程序如下:
MOVR0,#32H
MOVR1,#42H
MOVR7,#03H
CLRC
MOVA,@R0
ADDCA,@R1
DAA
MOV@R0,A
DJNZR7,LOOP
MOV7FH,C
7、十六进制数转为ASCII码
7.1、实训内容
16进制数0-9对应的ASCII码为30H-39H,A-F对应的ASCII码为41H-46H。
起始地址为30H的数据块中有三个16进制数,编写一个程序把它们转换成对应的ASCII码,结果放入起始地址为40H的数据块中。
7.2、程序
MOVR0,#30H;
转换前起始地址送R0
MOVR1,#40H;
转换后起始地址送R1
转换个数送R7
转换值送A
ANLA,#0FH;
CJNEA,#10,LOOP;
A和10比较
JNCLOOP2;
若A≥10,则LOOP2
ADDA,#30H;
若A<
10,则AA+30H
MOV@R1,A;
结果送到R1所指地址中
AJMPLOOP3;
转LOOP3
ADDA,#37H;
AA+37H
MOV@R1,A
AJMPLOOP3
LOOP3:
INCR0;
INCR1
DJNZR7,LOOP1;
8、P1口、P3口的应用
8.1、实训内容
从P3.3引脚每输入一个脉冲,P1口按16进制加一的方式点亮发光二极管。
P3.3用插针连至SP,P1.0--P1.7用插针连至L8--L1。
8.2、程序框图
P3.3=0?
P3.3=1?
A+1A
P1A
8.3、程序
MOVA,#00H;
00H送入A
MOVP1,A;
A中内容送P1
JBP3.3,$;
P3.3=1,则等待,否则继续
JNBP3.3,$;
P3.3=0,则等待,否则继续
INCA;
AA+1
AJMPLOOP;
9、工业顺序控制
9.1、实训内容
P1.0-P1.6控制注塑机的七道工序,现模拟控制七只发光二极管的点亮,高电平有效,设定每道工序时间转换为延时,P3.4为开工启动开关,低电平启动。
P3.2为外故障输入模拟开关,P3.2为0时不断报警。
P1.7为报警声音输出,设定6道工序只有一位输出,第七道工序三位有输出。
(1)P3.4连K1,P3.2连K2,P1.0-P1.6分别连到L1-L7,P1.7连SIN(电子音响输入端)。
(2)K1开关拔在上面,K2开关拔在上面。
(3)用连续方式从起始地址0580H开始运行程序,此时应等待开工状态。
(4)K1拔至下面(低电平),各道工序应正常运行。
(5)K2拔至下面(低电平),应有声音报警(人为设置故障)。
(6)K2拔至上面(高电平),即故障排除,程序应从刚才开始报警的那道工序继续执行。
9.2、程序框图
中断、P1口、P3口初始化
P1口全低
等开工
工序1延时
工序2延时
┋
工序7延时
主程序框图
关输出
返回
恢复现场
故障清除了吗?
报警
保护现场
中断服务子程序框图
9.3、程序
ORG0000H
LJMPHA2S
ORG0013H
LJMPHA2S3
ORG0580H
HA2S:
MOVP1,#00H;
关各道工序
ORLP3,#00H
HA2S1:
JNBP3.4,HA2S1;
开始工作否
ORLIE,#84H;
初始化中断寄存器
ORLIP,#04H
MOVPSW,#00H
MOVSP,#53H
HA2S2:
MOVP1,#01H;
第一道工序
ACALLHA2S7
MOVP1,#02H;
第二道工序
MOVP1,#04H;
第三道工序
MOVP1,#08H;
第四道工序
MOVP1,#10H;
第五道工序
MOVP1,#20H;
第六道工序
MOVP1,#40H;
第七道工序
SJMPHA2S2;
HA2S3:
MOVB,R2;
外部中断服务程序
HA2S4:
MOV20H,#0A0H
HA2S5:
SETBP1.7;
声音报警
ACALLHA2S6
CLRP1.7
DJNZ20H,HA2S5
JNBP3.3,HA2S4;
判断故障排除否
MOVR2,B
RETI;
排除后中断返回
HA2S6:
MOVR2,#06H;
延时子程序1
ACALLDELAY
RET
HA2S7:
MOVR2,#30H;
延时子程序2
DELAY:
PUSH02H;
延时子程序
DELAY1:
PUSH02H
DELAY2:
DELAY3:
DJNZR2,DELAY3
POP02H
DJNZR2,DELAY2
DJNZR2,DELAY1
DJNZR2,DELAY
10、交通灯控制
10.1、实训内容
(1)8255A工作方式控制字
D7
D6
D5
D4
D3
D2
D1
D0
设置A口C口高B组B口C口低
方式A组方式四位方式四位
(2)发光二极管分配
L1:
南绿灯L4:
东绿灯L7:
北绿灯L10:
西绿灯
L2:
南黄灯L5:
东黄灯L8:
北黄灯L11:
西黄灯
L3:
南红灯L6:
东红灯L9:
北红灯L12:
西绿灯
(3)发光二极管对应的16进制数
L1-L8分别连PC0-PC7,L9-L12分别连PB0-PB3。
灯亮为“1”,灯不亮为“0”。
则交通灯的六种状态对应的16进制数为:
南北绿灯和东西红灯亮时:
B口08H,C口61H。
东西绿灯和南北红灯亮时:
B口03H,C口0CH。
南北绿灯亮和黄灯闪时:
(黄灯亮)B口04H,C口51H。
(黄灯灭)B口00H,C口41H。
东西绿灯亮和黄灯闪时:
(黄灯亮)B口02H,C口8AH。
(黄灯灭)B口02H,C口08H。
10.2、程序
ORG0630H
HA4S:
MOVSP,#60H
MOVDPTR,#0FF2BH
MOVA,#80H
MOVX@DPTR,A
MOVDPTR,#0FF29H
MOVA,#49H
MOVR2,#25H
LCALLDELAY
HA4S3:
MOVA,#08H
INCDPTR
MOVA,#61H
MOVR2,#55H
MOVR7,#05H
HA4S1:
MOVA,#04H
MOVA,#51H
MOVR2,#20H
MOVA,#00H
MOVA,#41H
DJNZR7,HA4S1
MOVA,#03H
MOVA,#0CH
HA4S2:
MOVA,#02H
MOVA,#8AH
DJNZR7,HA4S2
LJMPHA4S3
PUSH02H
DJNZR2,DELAY3
11、定时器中断实验
11.1、实训内容
使用P1口的P1.0--P1.7分别接L8--L1发光二极管,P3.3接T0。
采用51系列单片机内部定时器T0作为16位定时器使用。
要求编程实现L1--L8(L8为低位)发光二极管按照16进制加一的方式点亮。
计算初值
机器周期
则初值
11.2、程序
ORG000BH
LJMPTIP
ORG0100H
MOVR7,#14H;
50ms×
20=1s
MOVP1,A
MOVTMOD,#01H;
令T0为定时器方式1
MOVTH0,#3CH;
装入定时初值
MOVTL0,#0BH
SETBEA;
开中断
SETBET0;
T0中断允许
SETBTR0;
启动T0计数
TIP:
DJNZR7,TIP1;
若未到1s,则跳转到TIP1
若已到1s,则AA+1
MOVR7,#14H;
恢复初值
TIP1:
MOVTH0,#3CH;
重装定时器初值
MOVTL0,#0B0H
RETI
12、串并转换
12.1、实训内容
利用8031串行口和串行输入并行输出移位寄存器74LS164,扩展一个8位输出通道,用于驱动一个数码显示器,在数码显示器上循环显示从8031串行口输出的0--9这10个数字。
(1)将S/P区DATA插孔接BUS3区P3.0(RXD)插孔。
(2)将S/P区CLK插孔接BUS3区P3.1(TXD)插孔。
(3)将S/P区CLR插孔接MP区/SP插孔,上电时对164复位。
(4)在DVCC系统处于仿真1态即“P.”状态下,将地址000B内容改为E1B1,作为定时器0的入口地址。
(5)将状态切换为“P...”状态,从地址0790H开始连续执行程序。
(6)在扩展的一位数码管上循环显示0--9这10个数字。
12.2、程序框图
置初始常数
等待
设置T1参数
置串口模式
中断返回
调整表格指针
送串口显示
判断是否到1秒
置T0定时常数
INT_T0入口
读表格
12.3、程序
TIMEREQU01H
LJMPSTART
AJMPINT_T0
ORG0790H
START:
MOVSP,#53H
MOVTMOD,#01H
MOVTL0,#00H
MOVTH0,#4BH
MOVR0,#0H
MOVTIMER,#20
MOVSCON,#00H
CLRTI
CLRRI
SETBTR0
SETBET0
SETBEA
SJMP$
INT_T0:
PUSHACC
PUSHPSW
CLREA
CLRTR0
MOVTL0,#0H
DJNZTIMER,EXIT
MOVDPTR,#TAB
MOVA,R0
MOVCA,@A+DPT