微机原理接口课程实习.docx
《微机原理接口课程实习.docx》由会员分享,可在线阅读,更多相关《微机原理接口课程实习.docx(12页珍藏版)》请在冰豆网上搜索。
微机原理接口课程实习
微机原理及接口技术课程实习
姓名(学号):
所在小组成员:
班级:
实习课程名:
交通灯控制器设计
所在学院:
信息学院
任课教师:
提交时间:
2014/12/25
⏹交通灯控制器设计
摘要:
十字道口的自动红绿灯是交通法规的无声命令,是司机和行人的行为准则。
它具有固定的“红灯—绿灯”转换间隔,并自动切换。
它们一般由“通行与禁止时间控制显示、红黄绿三色信号灯和方向指示灯”三部分组成。
在正常的情况下,在交通灯的通行与禁止时间控制显示中,如东西、南北两方向各30秒,最后还有3到5秒的闪烁缓冲时间,也就是说两个路口轮流放行,且以2位8段数码管显示剩余时间,但是到了夜间,两个路口均为黄灯闪烁时,可放行。
⏹所利用设备及过程:
为交通信号灯的实时控制和管理。
利用并行接口8255A、中断接口8259A和定时器8253A,以及键盘和数码显示电路,设计一套十字路口的交通灯管理系统,通行时间(或禁止时间)30秒,准备时间3秒,在准备时间里黄灯闪烁3次,闪烁频率为0.5秒,周而复始。
用LED数码管倒计时显示时间。
⏹总体设计
芯片选择
1.用实验系统8255A实现对信号灯的控制;2位数码显示用8255A实现控制。
2.用实验系统8235的计数器2定时向实验系统主片8259A的IRQ7请求中断,以实现要求的30秒、3秒钟定时。
实验系统8235的计数器2的CLK2接OPCLK,频率为1.19318MHZ;GATE2已接+5V;定时采用软硬件相结合的方式实现。
3.用实验系统的发光二极管模拟红绿灯。
注:
8259A的端口地址为:
20H、21H8255A的端口地址为:
端口A-60H、端口B-61H、端口C-62H、控制端口-63H8253的端口地址为:
计数器0-40H、计数器1-41H、计数器2-42H、控制寄存0-43H。
设计思想
设计数器2的计数初值为59520,由于CLK2接脉冲信号,频率为1.193MHZ,所以每50ms中断一次。
利用CX对不同的状态时间计数,用来实现计数器2对1秒,3秒钟定时。
中断子程序分为数码显示刷新部分和红绿黄灯,各种状态切换部分。
每20次中断即刷新LED显示。
交通灯由8255的C端口输出的数字量控制。
⏹线路图设计
⏹
⏹流程图设计
⏹详细设计
设计源程序
1.数据段定义
T1DB00H
T2DB03H
LEDTALDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
用T1作为个位取数的指针
用T2作为十位取数的指针
2.芯片及其端口的初始化
INAL,21H;
ANDAL,08H
OUT21H,AL
MOVAL,80H;初始化8255,A,B,C三口均工作在方式0
OUT63H,AL
MOVAL,0B6H;初始化8253,计数器#2工作在方式3,产生方波信号
OUT43H,AL
MOVAX,59500;
OUT42H,AL;C口传出数据,先传低4位,然后传高4位
MOVAL,AH
OUT42H,AL
3.写IRQ6和IRQ7
PUSHDS
MOVAX,0000H
MOVDS,AX
MOVAX,OFFSETIRQ7
ADDAX,2000H
MOVSI,003CH
MOV[SI],AX
MOVAX,0000H
MOVSI,003EH
MOV[SI],AX
POPDS
CLI
PUSHAX
PUSHDS
MOVAX,0000H
MOVDS,AX
MOVAX,OFFSETIRQ6
ADDAX,2000H
MOVSI,0038H
MOV[SI],AX
MOVAX,0000H
MOVSI,003AH
MOV[SI],AX
POPDS
POPAX
4.显示红绿灯主程序的设计
分别设了用于显示南北道和东西道的不同段,DEC_60表示在南北方向通向,DEC_45表示在东西方向同行,由于篇幅问题,代码查看下面源程序附件。
⏹调试与运行
程序是一开始几个人一起商量后实现的,无论是在语法上和逻辑上都没有大的问题。
接着用G=0000:
2000运行程序,查看验证结果是否和预想的一样。
⏹结果
经装载入程序后,数码管开始显示30,代表交通灯的二极管,显示东西红灯,南北绿灯亮,每一秒数码管减一,减到3时,南北绿灯闪烁直到零换道显示,东西绿灯亮,南北红灯亮,直到数码管计数到3,绿灯闪烁,如此不断循环。
当按下KK+的时候,无论数码管计数到何数值都重新从30秒开始计数。
⏹总结与体会
初学《微机原理》时,感觉摸不着头绪。
面对着众多的术语、概念及原理性的问题不知道该如何下手。
在了解课程的特点后,我发现,应该以微机的整机概念为突破口,在如何建立整体概念上下功夫。
由于自己没有学号汇编语言,所以在代码理解上非常吃力,有时一些稍复杂的代码都要想很久,这是没有打好基础的缘故。
另外,由于我们是参考了别人的程序设计,所以也没有遇到什么很大的问题。
从这次课程设计中,个人也觉得团队的重要性,分工合作不仅能促进办事效率,往往能事半功倍,一起交流还能获得一些未有的知识与见解。
⏹参考文献
[1]林志贵.微型计算机原理与接口技术.北京:
机械工业出版社,2010
⏹附件
源程序:
STACKSEGMENTSTACK
DB64DUP(0)
STACKENDS
DATASEGMENT
T1DB00H
T2DB03H
LEDTALDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,73H;发光二极管序列化
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
CLI
MOVAX,DATA
MOVDS,AX
MOVBX,OFFSETLEDTAL
PUSHDS
MOVAX,0000H
MOVDS,AX
MOVAX,OFFSETIRQ7
ADDAX,2000H
MOVSI,003CH
MOV[SI],AX
MOVAX,0000H
MOVSI,003EH
MOV[SI],AX
POPDS
CLI
PUSHAX
PUSHDS
MOVAX,0000H
MOVDS,AX
MOVAX,OFFSETIRQ6
ADDAX,2000H
MOVSI,0038H
MOV[SI],AX
MOVAX,0000H
MOVSI,003AH
MOV[SI],AX
POPDS
POPAX
CLI
PUSHAX
PUSHDS
MOVAX,0000H
MOVDS,AX
MOVAX,OFFSETIRQ2
ADDAX,2000H
MOVSI,0034H
MOV[SI],AX
MOVAX,0000H
MOVSI,0036H
MOV[SI],AX
POPDS
POPAX
INAL,21H;开IRQ7,IRQ6,IRQ2中断源
ANDAL,3BH
OUT21H,AL
MOVAL,80H;初始化8255,A,B,C三口均工作在方式0
OUT63H,AL
MOVAL,0B6H;初始化8253,计数器2工作在方式3,产生方波信号
OUT43H,AL
MOVAX,59500;传入50毫秒的初值
OUT42H,AL;C口传出数据,先传低4位,然后传高4位
MOVAL,AH
OUT42H,AL
MLOAD:
MOVT1,00H;初始值显示30秒,并开始倒计时,个位是0
MOVT2,03H;设置十位是3
COUNT_1:
MOVCX,14H;作为1秒的中断次数计数器,南北道倒计时程序
DEC_60:
STI;开中断
CALLDISP1
CMPT2,00H;判断十位是否减到0,如果不是则保持南北道绿灯亮
JNZK1
CMPT1,03H;判断个位是否为3秒,如果是则用全部的灯闪烁表示黄灯
JGK1
MOVAL,33H;此处灯显示状态不变
OUT62H,AL
CMPCX,0AH;比较是否是10,进行闪烁。
JGK2
MOVAL,3FH;绿灯二极管灭
OUT62H,AL
JMPK2
K1:
MOVAL,33H;显示南北干道绿灯亮通行
OUT62H,AL
K2:
CMPCX,00H;判断是否到了一秒,然后倒计时减1
JNZDEC_60
CMPT1,03H;如果够1秒,且个位大于3秒
JGLIGHT_60
CMPT2,00H;小于3秒判断十位是否为零?
唔为零,则跳到判断各位是否为零
JNZN1
TESTT1,0FFH;判断是否个位、十位均减到0
JNZLIGHT_60;不是则继续倒计时
JMPSLOAD;是则(标志位ZF=0)跳转到东西干道程序
N1:
TESTT1,0FFH;此处的功能是判断个位是否为0,且十位不为0
JNZLIGHT_60
MOVT1,09H;个位为0则使个位为9
DECT2;十位减1
JMPCOUNT_1
LIGHT_60:
DECT1;个位减一秒
JMPCOUNT_1
SLOAD:
MOVT1,00H
MOVT2,03H
COUNT_2:
MOVCX,14H;东西干道倒计时程序
DEC_45:
STI;开中断
CALLDISP1
CMPT2,00H;判断十位是否减到0,如果不是东西道绿灯亮
JNZK3
CMPT1,03H;判断各位是否为3秒,如果是则用全部的灯闪烁表示黄灯
JGK3
MOVAL,0CCH;此处灯显示状态不变
OUT62H,AL
CMPCX,0AH
JGK4
MOVAL,0CFH;绿灯二极管灭
OUT62H,AL
JMPK4
K3:
MOVAL,0CCH;显示东西干道绿灯亮通行
OUT62H,AL
K4:
CMPCX,00H;判断是否到了一秒,然后倒计时减1
JNZDEC_45
CMPT1,03H
JNBELIGHT_45
TESTT2,0FFH
JNZN2
TESTT1,0FFH;判断是否个位、十位均减到0
JNZLIGHT_45;不是则继续倒计时
JMPMLOAD;是则(标志位ZF=0)跳转到南北道程序,依次循环
N2:
TESTT1,0FFH;此处的功能是判断个位是否为0,且十位不为0
JNZLIGHT_45
MOVT1,09H;是则使个位为9
DECT2;十位减1
JMPCOUNT_2
LIGHT_45:
DECT1
JMPCOUNT_2
IRQ7:
DECCX;确定是否为1秒的中断服务程序
MOVAL,20H
OUT20H,AL
IRET
IRQ6:
;kk1控制
MOVT1,00H
MOVT2,03H
MOVAL,20H;从三十秒重新开始计数
OUT20H,AL
JMPCOUNT_1
IRET
IRQ2:
MOVT1,00H
MOVT2,00H
MOVAL,21H
OUT20H,AL
MOVAL,0F0H
OUT62H,AL
CALLDELAY
MOVAL,0FFH
OUT62H,AL
JMPIRQ2
IRET
DISP1PROCNEAR;显示子程序_1,用来显示8段数码管中0-9数字。
MOVDL,0FEH
MOVSI,OFFSETT1;显示内容首地址送SI
L1:
MOVAL,DL;点亮最左边的显示器,位码送AL
TESTAL,04H;判断是否点亮了从右往左的第二个LED
JZEND1;已经点亮了
OUT60H,AL;位码送A口
ROLAL,01H;改变位码
MOVDL,AL;位码送DL保存
MOVAL,[SI];去要显示的字符
XLAT;把显示字符换成相应的8断段码
OUT61H,AL;显示字符的8段码送端口B
CALLDELAY;延时,1位显示器点亮的时间
INCSI;地址加1
JMPL1
END1:
RET
DISP1ENDP
DELAYPROCNEAR;软件延时子程序_1:
延时5毫秒
PUSHDX
PUSHAX
MOVDX,20
LOOP1:
MOVAX,10
L4:
DECAX
JNZL4
DECDX
JNZLOOP1
POPAX
POPDX
RET
DELAYENDP
CODEENDS
ENDSTART