微机原理与接口技术交通灯设计Word格式.docx
《微机原理与接口技术交通灯设计Word格式.docx》由会员分享,可在线阅读,更多相关《微机原理与接口技术交通灯设计Word格式.docx(12页珍藏版)》请在冰点文库上搜索。
(1)分析问题——各端口应用——代码实现
(2)具体应用(8255的B口做灯信号的输出,A口做位选码的输出,C口做LED的输出。
)
(3)实验内容
1、系统中,8259采用初始化命令字ICW1、ICW2、ICW4和操作命令字OCW1,允许内部中断IRQ0和外部中断IRQ1
2、系统中,8255选用(10000000)方式选择字,A组工作0方式,A端口输出,PC3-PC7输出,B组0方式,B端口输出,PC3-PC0输出
3、系统中,8253选用(00110101)选择零号端口读写两个字节,工作方式2(频率发生器)二十进制
2、程序流程
3、电路原理图
4、设计代码
STACKSEGMENTSTACK
DW64DUP(?
STACKENDS
DATASEGMENT
TIMERDB00H,30H;
IRQ0中断次数,通行剩余时间(A道30秒,B道30秒)初始设为B道通行
TABDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;
七段码,用于显示时间,顺序不可调换
DISOFFDB00H,00H,00H,00H;
LED显示器缓冲区,数字(剩余时间)的个位和十位
RODDB00H;
当前道路通行状态(00:
为A通行道;
01为B通行)
LIGHTDB0D7H;
信号灯的输出信号(11010111)
KK1DB00H;
暂停开关KK1计数
LIGHTZTDB00H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,0000H;
数据段清零
MOVDS,AX
;
填写中断向量表
MOVAX,OFFSETIRQ0;
提取IRQ0的中断处理程序的偏移地址
ADDAX,2000H;
加载时IP=2000H(绝对地址)
MOVSI,0020H;
中断号0的矢量地址为(20H-23H)
MOV[SI],AX;
填写中断处理程序的偏移地址写进中断向量表
MOVAX,0000H
MOVSI,0022H
填写中断处理程序的段地址写进中断向量表
MOVAX,OFFSETIRQ1
ADDAX,2000H
MOVSI,0024H;
中断号1的矢量地址为(24H-27H)
MOV[SI],AX
MOVSI,0026H
加载数据段
MOVAX,DATA
MOVDS,AX
8259初始化
MOVAL,13H;
8259初始化ICW1(00010011)单片方式需写ICW4
OUT20H,AL;
端地址A0=0
MOVAL,08H;
ICW2(00001000)中断向量号的高五位(000001)
OUT21H,AL
MOVAl,01H;
ICW4(00000001)一般全嵌套,非缓冲,非自动中断结束,十六位机系统
OUT21H,AL;
特征位:
D7-D5=000
MOVAL,0FCH;
OCWl允许IRQ0、IRQ1中断
8255初始化
MOVAL,80H;
(10000000)方式选择字,A组工作0方式,A端口输出,PC3-PC7输出,B组0方式,B端口输出,PC3-PC0输出
OUT63H,AL
初始化8253
MOVAL,35H;
(00110101)选择零号端口读写两个字节,工作方式2(频率发生器)二十进制
OUT43H,AL
MOVAX,380;
定时(频率乘以时间)
OUT40H,AL;
低字节
MOVAL,AH
高字节
STI;
开中断(允许CPU接收中断)
M:
CALLDISP2
CMPKK1,1
JZZT;
调用时间显示函数
CMPTIMER+1,04H;
判断是否到了最后4秒,到了则跳转
JZR1
CMPTIMER+1,00H;
判断通行时间是否结束,到了则跳转
JZR2
JMPDISP1;
如时间大于五秒,则直接按当前方式显示信号灯
R1:
CMPROD,00H;
如到了最后五秒,则判断是A道通行否?
ROD=00H为A道
JZR12;
如是A道通行,则改变状态
R11:
MOVLIGHT,7BH;
(01111110)改变为A道红,B道黄
信号输出
R12:
MOVLIGHT,0B7H;
(10110111)改变为A道黄,B道红
JMPDISP1
R2:
改变通行状态
JZR22
R21:
MOVLIGHT,0D7H;
如果当前B道通行结束,则切换为A道
MOVROD,00H
MOVTIMER+1,30H;
A道通行时间30秒
JMPDISP1
R22:
MOVROD,01H;
如果当前A道通行结束,则切换为B道ROD=01H为B道
MOVLIGHT,7DH
MOVTIMER+1,30H
JMPDISP1;
B道通行时间30秒
ZT:
JMPM
DISP1:
;
灯信号输出函数
MOVAL,LIGHT;
将灯信号输出到8255的B口
OUT61H,AL
STI
IRQ0:
PUSHAX;
现场保护
PUSHCX
PUSHF
MOVAL,TIMER;
取80次中断请求为一秒
INCAL
MOVTIMER,AL
CMPAL40H;
1秒判断?
JNEM1;
不到则跳转
MOVAL,00H;
毫秒数清零
MOVAL,TIMER+1;
剩余时间减1
SUBAL,01H
DAS;
调整为压缩BCD码
MOVTIMER+1,AL
M1:
MOVAL,20H;
中断复位
OUT20H,AL
POPF
POPCX
POPAX
STI
IRET
IRQ1:
;
暂停(恢复)
PUSHAX
PUSHF
MOVAL,KK1
CMPAL,00H;
判断当前的状态:
00为通行,01为暂停
JNEM2
INCAL;
改变当前状态
MOVKK1,AL
MOVAL,0FDH;
(11111101)关IRQ0中断,开IRQ1中断
OUT21H,AL
MOVAL,LIGHT
MOVLIGHTZT,AL;
///////////////////////////////////////////////////////////
MOVAL,77H;
(01110111)大、小道均为红灯
OUT61H,AL
JMPM3
M2:
;
恢复
MOVAL,00H
MOVKK1,AL
MOVAX,LIGHTZT;
//////////////////////////////////////////////////////////////////
MOVAL,0FCH;
(11111100)开IRQ0、IRQ1中断
M3:
MOVAL,20H
DISP2:
时间显示函数
AL=30HAX=?
30H
ANDAL,0FH;
AX=0000H
MOVDISOFF+3,AL;
DISOFF+3=00HDISOFFDB03H,00H,03H,00H
MOVDISOFF+1,AL;
DISOFF+1=00H
AL=30H
MOVCL,04H;
CL=04H
SHRAL,CL;
AL=03H
MOVDISOFF+2,AL;
DISOFF+2=03H
MOVDISOFF,AL;
DISOFF=03H
MOVSI,OFFSETDISOFF;
缓冲区的偏移地址
MOVDL,0F7H;
(11110111)将位选码初值送DL
MOVAL,DL;
AL=0F7H
AGAIN:
OUT60H,AL;
从A口输出位选码
MOVAL,[SI]
MOVBX,OFFSETTAB;
七段码的偏移地址AX=0003HBX=TAB
ANDAX,00FFH
XLAT;
MOVAL,BX+[AX];
将显示七段码送AL
OUT62H,AL;
将AL转换成七段码从B口输出
CALLDALLY;
调用延时1ms子程序
INCSI;
SI=SI+1
MOVAL,DL
TESTAL,01H;
4位显示完否?
JZM4
RORAL,01H;
DL循环右移一位
MOVDL,AL
JMPAGAIN
M4:
RET
DALLY:
循环256次
MOVCX,0010H;
延时子程序
T1:
MOVAX,0010H
T2:
DECAX
JNZT2
LOOPT1
CODEENDS
ENDSTART
六、心得体会
这周关于交通灯的设计是对我来说就是一次挑战,虽然说代码并非是我自己写的,可以说我是参考别人的,但是理解所有的设计代码我确实也花了不少时间,我除了要熟悉8259、8255、8253这些芯片,还得将它们合理的利用起来,由于之前对汇编知识的掌握相当差,理解起来是相当的困难,但是庆幸的事,我向同学和老师咨询中吸收了不少知识。
虽然说之前在课上学了这些理论知识,但如果没在实践中利用,你根本就不会发现自己到底是不是真的掌握了,这次我算是明白了,很多一部分的知识还是需要我自己在课下去补充。
在学习中,我们总是存在着局限性,在实践中,我们也存在着被动性,这些都是需要我们改正的地方。
实践是建在理论知识的基础上,所以当你要做一个实验时,没有一定的理论知识是不够的,和合理的将二者结合。
每次实践也是一次经验的积累,人只有在积累经验中方能成长。