哈工大单片机原理及应用实验报告Word格式文档下载.docx
《哈工大单片机原理及应用实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《哈工大单片机原理及应用实验报告Word格式文档下载.docx(27页珍藏版)》请在冰点文库上搜索。
成功模拟交通灯管制系统,红绿灯方向指示正常,黄灯闪烁正常
1.6实验结果讨论分析
实验中发现交通灯在黄灯和红绿灯切换的时候有抖动和延时,初步估计是单片机定时系统不稳定以及程序的延时冗余没有添加所导致。
1.7实验程序代码
变量说明:
R1、R2、R3用来做延时控制变量。
EW段表示东西导通南北截止;
SNBY是SNSTANDBY的缩写,表示南北准备;
SN段表示南北导通东西截止。
延时控制由若干延时控制单元组合而成(参考了一下老师的程序)。
片选地址和显示单元调用了老师的部分程序。
PORTEQU0CFA0H;
片选地址CS0
CSEGAT0000H
LJMPBEGIN
CSEGAT4100H
BEGIN:
MOVA,#03H;
1、2亮,其余灭
ACALLSHOW;
调用273显示单元
ACALLT03;
延时3秒
EW:
MOVA,#12H;
东西导通;
南北截止
ACALLSHOW
ACALLT10;
延时10秒
MOVA,#02H;
东西截止;
SNBY:
MOVA,#04H;
东西黄灯闪烁;
ACALLSHOW
ACALLT02;
东西黄灯5次闪烁程序
MOVA,#00H
ACALLT02
MOVA,#04H
ACALLT02
MOVA,#00H;
东西黄灯闪烁程序结束
ACALLT02;
延时0.2秒
东西路口黄灯灭;
南北路口红灯亮
东西南北都截止
延时0.2秒
MOVA,#21H;
南北导通
MOVA,#01H;
SN:
MOVA,#08H;
东西截止,南北准备
南北黄灯闪烁程序
MOVA,#08H
南北黄灯闪烁截止
东西南北都截止
JMPEW;
转EW循环
T10:
MOVR1,#100;
延时10秒
JMPTU1
T03:
MOVR1,#30;
T02:
MOVR1,#02;
TU1:
MOVR2,#200
TU2:
MOVR3,#126
TU3:
DJNZR3,TU3
DJNZR2,TU2
DJNZR1,TU1
RET
SHOW:
MOVDPTR,#PORT;
273显示单元
MOVX@DPTR,A
RET
END
2实验二简单I/O口扩展实验
(二)
2.1实验要求
利用74LS244作为输入口,读取开状态,并将此状态通过发光二极管显示出来。
2.2实验目的
1、学习在单片机系统中扩展简单的I/O口的方法。
2、学习数据输入,输出程序的编制方法。
2.3实验原理
MCS-51外部扩展空间很大,但数据总线口和控制信号线的负载能力是很有限的。
若需要扩展的芯片较多,则MCS-51总线口的负载过重,74LS244是一个扩展输入口,同时也是一个单向驱动器,以减轻总线口的负担。
程序中加了一段延时程序,以减少总线口读写的频繁程度,延时时间约为0.01秒,不会影响显示的稳定。
2.4实验内容(包括实验电路和程序流程图)
2.5实验结果
利用74LS244,成功将开关的状态反应在发光二极管上。
2.6实验结果讨论分析
在发光二极管显示的过程中,有抖动产生,通过消抖开关或者程序延时可以消除抖动。
2.7实验程序代码
INPORTEQU0CFA8H;
74LS244端口地址
OUTPORTEQU0CFB0H;
74LS273端口地址
MOVDPTR,#INPORT
DO:
MOVXA,@DPTR;
读开关
MOVDPTR,#OUTPORT
MOVX@DPTR,A;
显示状态
MOVR1,#10H;
延时
T0:
MOVR0,#0FFH
T1:
DJNZR0,T1
DJNZR1,T0
LJMPBEGIN
3实验三中断实验
——有急救车的交通灯控制实验
3.1实验要求
在实验三的内容基础上增加允许急救车优先通过的要求。
当有急救车到达的时候,两个方向上的红灯亮,以便让急救车通过,假定急救车通过路口的时间为10秒,急救车通过后,交通灯恢复中断前的状态。
本实验以单脉冲为中断申请,表示有急救车通过。
3.2实验目的
1、学习外部中断技术的基本使用方法。
2、学习中断处理程序的编程方法。
3.3实验原理
交通灯的燃灭规律见实验三。
本实验中断处理程序的应用,最主要的地方是如何保护进入中断前的状态,使得中断程序执行完毕后能回到交通灯中断前的状态。
要保护的地方,除了累加器ACC,标志寄存器PSW外,还要注意:
一是主程序中的延时程序和中断处理程序中的延迟程序不能混用,本实验给出的程序中,主程序延迟用的是R3、R4、R5。
中断延迟用的是R1、R2和新的R3。
第二,主程序中每执行一步经74LS273的端口输出数据的操作时,应先将所输出的数据保存到一个单元中。
因为进入中断程序后也要执行往74LS273端口输出数据的操作,中断返回时如果没有恢复中断前74LS273端口锁存器的数据,则显示往往出错,回不到中断前的状态。
还要注意一点,主程序中往端口输出数据操作要先保存再输出,例如有如下操作:
MOVA,#0F0H(0)
MOVXR1,A
(1)
MOVSAVE,A
(2)
程序如果正好执行到
(1)时发生中断,则转入中断程序,假设中断程序返回主程序前需要执行一句MOVA,SAVE指令,由于主程序中没有执行
(2),故SAVE中的内容实际上是前一次放入的而不是(0)语句中给出的0F0H,显示出错,将
(1)、
(2)两句顺序颠倒一下则没有问题。
发生中断时两方向的红灯一起亮10秒,然后返回中断前的状态。
3.4实验内容(包括实验电路和程序流程图)
3.5实验结果
成功在交通灯的正常循环中加入了中断操作,有急救车通过的时候两个红灯均点亮,通过后从寄存器中取出中断前的结果,继续循环。
3.6实验结果讨论分析
实验成功模拟了中断操作,需要注意的是中断钱需要对堆栈进行操作,同时如果不设置恢复程序中断前的数据会较容易丢失。
3.7实验程序代码
R0用来控制黄灯闪烁次数;
R1~R7用来做延时控制变量。
延时控制由若干延时控制单元组合而成(这里参考了一下老师的做法)。
片选地址、显示单元调用和读入参考了老师的做法。
端口地址
SAVEEQU55H;
save保存从端口cfa0输出的数据
CSEGAT4003H;
LJMPINT
SETBIT0
SETBEX0
SETBEA
置首显示码
MOVSAVE,A;
保存
ACALLSHOW;
显示输出
MOVSAVE,A
ACALLSHOW
东西截止
MOVR0,#05H;
东西黄灯闪烁5次
MOVA,#06H
ACALLT02
MOVA,#02H
DJNZR0,SNBY
东西截止,南北导通
南北黄灯闪烁5次
MOVA,#09H
MOVA,#01H
DJNZR0,SN
LJMPEW;
MOVR3,#100;
LJMPTU1
MOVR3,#30;
MOVR3,#02;
MOVR4,#200
MOVR5,#126
DJNZR5,TU3
DJNZR4,TU2
DJNZR3,TU1
INT:
CLREA
PUSHACC;
中断处理
PUSHPSW
MOVA,R3
PUSHACC
MOVA,R0
TT10:
TT01:
MOVR0,#200
TT02:
TT03:
DJNZR3,TT03
DJNZR2,TT02
DJNZR1,TT01
MOVA,SAVE;
取SAVE中保存数据输出到cfa0端口
POPACC;
出栈
MOVR0,A
MOVR3,A
POPPSW
POPACC
SETBEA;
允许外部中断
RETI
MOVX@DPTR,A
4实验四定时器实验
----循环彩灯实验
4.1实验要求
由8031内部定时器1按方式1工作,即作为16位定时器使用,每0.1秒钟T1溢出中断一次。
P1口的P1.0~P1.7分别接发光二极管的L1~L8。
要求编写程序模拟一循环彩灯。
彩灯变化花样可自行设计。
例程给出的变化花样为:
①L1、L2、……L8依次点亮;
②L1、L2、……L8依次熄灭;
③L1、L2、……L8全亮、全灭。
各时序时间间隔为0.5秒。
让发光二极管按以上规律循环显示下去。
4.2实验目的
1、学习8031内部计数器的使用和编程方法。
2、进一步掌握中断处理程序的编写方法。
4.3实验原理
1、定时常数的确定
定时器/计数器的输入脉冲周期与机器周期一样,为振荡频率的1/12。
本实验中时钟频率为6.144MHz,现要采用中断方法来实现0.5秒延时,要在定时器1中设置一个时间常数,使其每隔0.1秒产生一次中断,CPU响应中断后将R0中计数值减一,令R0=05H,即可实现0.1秒延时。
∽
时间常数可按下述方法确定:
机器周期=12/晶振频率=12÷
6.144×
106=1.9531×
10-6s
设计数初值为X,则(2e+16-X)×
1.9531×
10-6=0.1,可求得X=14336
化为十六进制则X=3800H,故初始值为TH1=38H,TL1=00H
2、初始化程序
包括定时器初始化和中断系统初始化,主要是对IP、IE、TCON、TMOD的相应位进行正确的设置,并将时间常数送入定时器中。
由于只有定时器中断,IP便不必设置。
3、设计中断服务程序和主程序
中断服务程序除了完成计数减一工作外,还要将时间常数重新送入定时器中,为下一次中断做准备。
主程序则用来控制发光二极管按要求顺序燃灭。
4.4实验内容(包括实验电路和程序流程图)
4.5实验结果
彩灯按照tab表里的规则依次点亮。
4.6实验结果讨论分析
彩灯点亮实验中,需要注意衔接的处理,以使其美观。
同时彩灯的样式受tab表大小的限制,样式容易单一。
4.7实验程序代码
R0用来储存计数值;
R1为查表控制变量。
OUTPORTEQU0CFB0H
CSEGAT401BH;
定时器/计数器1中断程序入口地址
LJMPINT
首显示码
MOVR1,#03H;
03为基址寄存器到表首的距离
MOVR0,#5H;
05是计数值
MOVTMOD,#10H;
计数器置为方式1
MOVTL1,#00H;
装入时间常数
MOVTH1,#038H
ORLIE,#88H;
CPU中断开放标志位和定时器
SETBTR1;
开始计数
DO1:
CJNER0,#00,SHOW
重置计数值
INCR1;
表地址偏移量加1
CJNER1,#27H,DO2
如到表尾,则重置偏移量初值
DO2:
MOVA,R1;
从表中取显示码入累加器
MOVCA,@A+PC
JMPSHOW
DB01H,03H,07H,0FH,1FH,3FH,7FH,0FFH,0FEH,0FCH
DB0F8H,0F0H,0E0H,0C0H,80H,00H,0FFH,00H,0FEH
DB0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH,0BFH,0DFH
DB0EFH,0F7H,0FBH,0FDH,0FEH,00H,0FFH,00H
MOVDPTR,#OUTPORT
MOVP1,A;
将取得的显示码从P1口输出显示
JMPDO1
CLRTR1;
停止计数
DECR0
重置时间常数初值
MOVTH1,#038HEND
教师评语:
实验分数:
指导教师签字: