微机原理与接口技术交通灯设计.docx
《微机原理与接口技术交通灯设计.docx》由会员分享,可在线阅读,更多相关《微机原理与接口技术交通灯设计.docx(12页珍藏版)》请在冰豆网上搜索。
微机原理与接口技术交通灯设计
《微机原理与接口技术》课程设计
姓名:
*******
班级学号:
*******
任课老师:
*******
一、实验课题
《交通信号灯控制系统》
二、实验目的
在熟悉8086/8088指令系统的基础上,掌握8086/8088汇编语言程序设计方法;掌握8259可编程中断控制器,8255可编程并行接口、8253可编程定时/计数器的应用
三、实验要求
1、模拟交通信号灯(分A、B两组)的红、黄、绿灯(实验箱中的发光二极管)交替变换的过程。
2、在实验箱的LED显示器上显示当前剩余时间(每秒更新一次,倒计时)。
A组、B组之间时间关系如下:
A组
B组
绿灯
26秒
红灯
30秒
黄灯
4秒
红灯
30秒
绿灯
26秒
黄灯
4秒
四、实验设备
PC机一台、实验箱一个(8086、8259、8255、8253芯片及相关电路、发光二极管六只)及导线若干。
五、设计
1、设计思路
(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
MOV[SI],AX;填写中断处理程序的段地址写进中断向量表
MOVAX,OFFSETIRQ1
ADDAX,2000H
MOVSI,0024H;中断号1的矢量地址为(24H-27H)
MOV[SI],AX
MOVAX,0000H
MOVSI,0026H
MOV[SI],AX
;加载数据段
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中断
OUT21H,AL
;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
OUT40H,AL;高字节
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道黄
JMPDISP1;信号输出
R12:
MOVLIGHT,0B7H;(10110111)改变为A道黄,B道红
JMPDISP1
R2:
CMPROD,00H;改变通行状态
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
JMPM
IRQ0:
PUSHAX;现场保护
PUSHCX
PUSHF
MOVAL,TIMER;取80次中断请求为一秒
INCAL
MOVTIMER,AL
CMPAL40H;1秒判断?
JNEM1;不到则跳转
MOVAL,00H;毫秒数清零
MOVTIMER,AL
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;//////////////////////////////////////////////////////////////////
OUT61H,AL
MOVAL,0FCH;(11111100)开IRQ0、IRQ1中断
OUT21H,AL
STI
M3:
MOVAL,20H
OUT20H,AL
POPF
POPAX
STI
IRET
DISP2:
;时间显示函数
MOVAL,TIMER+1;AL=30HAX=?
30H
ANDAL,0FH;AX=0000H
MOVDISOFF+3,AL;DISOFF+3=00HDISOFFDB03H,00H,03H,00H
MOVDISOFF+1,AL;DISOFF+1=00H
MOVAL,TIMER+1;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
RET
CODEENDS
ENDSTART
六、心得体会
这周关于交通灯的设计是对我来说就是一次挑战,虽然说代码并非是我自己写的,可以说我是参考别人的,但是理解所有的设计代码我确实也花了不少时间,我除了要熟悉8259、8255、8253这些芯片,还得将它们合理的利用起来,由于之前对汇编知识的掌握相当差,理解起来是相当的困难,但是庆幸的事,我向同学和老师咨询中吸收了不少知识。
虽然说之前在课上学了这些理论知识,但如果没在实践中利用,你根本就不会发现自己到底是不是真的掌握了,这次我算是明白了,很多一部分的知识还是需要我自己在课下去补充。
在学习中,我们总是存在着局限性,在实践中,我们也存在着被动性,这些都是需要我们改正的地方。
实践是建在理论知识的基础上,所以当你要做一个实验时,没有一定的理论知识是不够的,和合理的将二者结合。
每次实践也是一次经验的积累,人只有在积累经验中方能成长。