微机课程设计报告-交通灯

微机课程设计报告-交通灯本文简介:《微机实验及课程设计》课程设计报告姓名:学号:专业:自动化学院实验室:计算机硬件实验室组别:无同组人员:无设计时间:2013年5月17日——2013年6月8日评定成绩:审阅教师:目录一.课程设计目的与要求……………………………………………3二.方案论证于原理设计……………………………………………3三
微机课程设计报告-交通灯本文内容:
《微机实验及课程设计》
课程设计报告
姓
名:
学
号:
专
业:
自动化学院
实
验
室:
计算机硬件实验室
组
别:
无
同组人员:
无
设计时间:
2013
年
5
月
17
日
——
2013
年
6
月
8日
评定成绩:
审阅教师:
目
录
一.
课程设计目的与要求……………………………………………3
二.
方案论证于原理设计……………………………………………3
三.
原理阐述及设计…………………………………………………4
四.
发难实现与测试…………………………………………………6
五.
分析与总结………………………………………………………7
六.
附录……………………………………………………………….8
一.
课程设计目的与要求
设计目的:
微机课程综合设计用于检验和提高学生在原理与接口综合应用方面分析问题与解决问题的能力,同时也给学生提供更多、更好的训练机会,课程给出了10
道微机硬件应用综合测试题。为完成每道测试题,至少需要选用TPC
微机实验装置中三部分以上的硬件电路(还需将它们有机组合起来)并编制相应的应用。
通过试验还能够让学生更好的了解所学知识在实际控制中的运用,增加对本专业的认识和学习兴趣。
设计要求:
1)基本要求
(难度系数1.0)
L7、L6、L5
作为南北路口的交通灯,L2、L1、L0
作为东西路口的交通灯。编程使六个灯按交通灯变
化规律亮灭。要求进行周期性重复控制:
(1)
南北路口的绿灯、东西路口的红灯同时亮20
秒;
(2)
南北路口的黄灯闪烁3
秒,同时东西路口的红灯闪3
秒;
微机实验及课程设计教程
(3)
南北路口的红灯、东西路口的绿灯同时亮90
秒;
(4)
南北路口的红灯、同时东西路口的黄灯亮闪烁3
秒;
(5)
在8
段LED
上同步显示倒计时。
2)设计提示
(1)
要求精确计时,采用实验系统8253
定时器中断或主机8253
定时器;
(2)
利用软件定时器。
3)进一步设计要求
(1)
8×8
点阵显示当前车流运行方向,上下对应南北,左右对应东西。绿色箭头对应,红色箭头对应
黄灯状态;
(2)
允许南北向路口设置人工按钮,请求行人提前过街,如东西绿灯已亮40
秒则按钮后10
秒南北绿
灯亮,否则按钮后40
秒南北绿灯亮;
(3)
考虑其他复杂情况。
二.方案论证与原理设计
1)在考虑程序的整体要求和框架后,决定把程序总共分为四个模块,分别为交通灯显示模块,数码管显示的模块,中断程序模块,中断初始化模块。
交通灯显示模块是整个程序的主模块,其主要功能就是判断交通状态的运行方向和显示模式,还有显示的时间长短,并且还有人工紧急按钮的功能。显示模块则由交通灯状态来判断并在数码管上显示倒计时。中断则主要用作计时。中断初始化程序用来初始化9054和一些基本的置取中断向量的功能。
2)各模块的实现
交通灯模块通过一个全局变量irq_times来计时,通过中断服务子程序来改变它,在该模块中通过判断该变量的值去选择程序流程,并结合开关量来判断人工按钮有无按下。并在不同
流程去显示交通灯和流向问题。并且调用数码管显示程序。
数码管显示模块,通过irq_times来判断并显示。
中断服务模块每调用一次说明已经过去一秒钟,则irq_times变化一次
1.可编程定时/计数器8253
定时/计数器8253主要是用于定时1s,触发中断把全局变量减一。电路连线是CLOCK0接1MHZ,分频后频率为1KHz,OUT0接中断CLKCK1,分频后为1HZ,OUT1接IRQ,每一秒触发一次中断,GATE0,GATE1接5v。计数器的初值应都是1000;
2.8255并行接口单元
8255主要是用于数码管和发光二极管的数据输出。所以用8255A口高三位和低三位接6个发光二极管,B口接数码管的数据端,C口低两位接数码管位控制,最高位接开关K1
3.点阵使用
由于提高要求需要显示上下箭头,所以使用8*8点阵显示箭头。由地址译码电路的地址控制点阵。
4
微机控制器
程序在纯Dos下运行
三.详细(机理)设计
1)
软件流程图(总流程图)
本设计的软件设计的思路:通过软件编程使8253输出定时信号申请中断,在中断服务程序中改变全局计数变量。在主程序体中通过判断全局变量的值来控制程序流向。
中断初始化
8255,8253初始化
Irq_times赋值36
Irq_times>26?
Irq_times>23
状态1
Irq_times>3
状态2
PC7=1?
Irq_times>13?
Irq_times=3
Irq_times=8
Irq_times>3
Irq_times>0
状态4
状态3
有无按键
退出
图表
1交通灯系统总流程图
2)
中断模块
进入中断后,关闭中断,然后压栈,显示提示信息,最后处理数据
算法实现:利用irq_times全局变量减一来实现倒计时。
3)
LED显示程序:本设计只用到了2个LED,只要将时间转换为相应的段码。先输出位码,再输出段码,循环输出就可以动态显示。将LED作偏移码,利用XLAT,很简单就可以实现译码。
VCC
4)
硬件连接图
IRQ
/CS
CLK0
GATE0
OUT0
CLK1
GATE1
OUT1
8253
/CS
PA0-7
PB0-7
PC7
PC0-1
8255
1MHz
288H
280H
LED灯
数码管
数码管位选
四.
方案实现与测试(或调试)
首先根据设计思路,选择采用8253和8255芯片,使用较为复杂的中断。然后调试硬件,确定位选、芯片等工作正常。这可以通过手动输入控制字,进行简单输入输出实现。然后确定8253、8255芯片的地址,开始软件编程。
软件编程首先完成整体的逻辑框架,然后具体编写子程序。刚开始时采用软件延时,优先调试8255。采用8255的A、B口的0方式,A、B口的变化将反映在八段码和LED灯上。子程序的编写即将设计好的算法转换为程序流,用程序流的方向实现选择,用调用子程序实现具体操作。
然后加入8253的硬件中断加以调整全局计数,将OUT1连至IRQ,通过查询PC7口的状态进行判断人工按钮有无按下。由于前面8255已经调好,所以8253的调试比较顺利。
最终将全部硬件连线接好,进行整机联调。当中发现许多问题,有编译问题,但在调整后都编译通过了,对软件进行单步,这时由于有现象,进行软件调试的时候也更有针对性。通过设置断点,逐步跟踪寄存器值,调试时发现在中断程序返回时始终是不对的,这导致一运行程序就会跑飞。无论如何都排查不了这个问题,一般这种问题都是由于堆栈不平衡引起的,但检查程序并未发现有堆栈错误。最终在一个偶然的瞬间我把主程序中的几句用来显示提示信息的语句删除后发现程序这次可以正确运行了,最后发现在中断外面运用INT21功能号为9的中断显示字符串会导致中断返回不了的问题。在最后调好这问题后运行程序达到了理想的目的与与要求,实现的拓展功能。
实物连接图:
五.分析与总结
1)题目要求要用到8255经确定时,所以考虑到用中断来实现这个功能要求。
3)由于想到各种显示输出需要很多锁存,而8255却可以很好地解决这个问题,于是就用8255实现,而且8255C口的高四位与低四位输入输出不一样,这位人工按钮提供方便。
2)
编程中遇到的很多是逻辑问题.另一个遇到的问题就是跳转语句超出范围的错误,这个错误的解决是通利用两个跳转实现(一个条件一个无条件)。
3)
我的主程序是用来控制程序流向的,但其实也包括了程序显示的一部分任务,其中不同的流向中就用不同的显示方案,这样也简化了显示子程序的任务。使得程序编写比较方便和控制。
4)
对终端的初始化是主要参考实验书上的中断试验程序。
5)中断调试时由于要进入纯DOS所以比较麻烦,所以调试也比较耗时间,最主要的问题是该种中断问题很少遇到,要不是最后自己出于简化程序来找错误的思想,可能就根本发现不了在中断的外边用显示功能回事中断的返回出问题,导致程序跑飞掉。
6)交通灯的这个题目状态还好不多,但由于中断的引入使得程序变得复杂,但其实也就是初始化和退出程序比较复杂,而对于主程序来说没有多大影响,还有就是对调试用较高的要求。这个题目做下来还是有不少收获的,至少经验上要多了一些。
参考书目:
[1]
杨素行等,《微型计算机系统原理及应用》,北京,清华大学出版社,2009年
[2]
东南大学微机系统与接口课程组,《微机实验及课程设计教程试用版3.0》,南京,东南大学出版社,2010年
附录.代码程序
ioport
equ
0ec00h-0280h
ioport_82530
equ
ioport+0280h
;8253io地址
ioport_82531
equ
ioport+0281h
ioport_82533
equ
ioport+0283h
io82550
equ
ioport+0290h
io82551
equ
ioport+0291h;8255io地址
io82552
equ
ioport+0292h
io82553
equ
ioport+0293h
ioportCequ
ioport+0298h
ioportRrequ
ioport+02a0h;点阵控制地址
ioportRy
equ
ioport+02a8h
int_vect
EQU
72H
;中断0-7
的向量为:08h-0fh,中断8-15
的向量为:70h-77h
irq_mask_2_7
equ
11111011b
;中断掩码,中断0-7
时从低至高相应位为零,中断8-15
时第2
位为零
irq_mask_9_15
equ
11111011b;中断0-7
时全一,中断8-15
时从低至高相应位零
ioport_cent
equ
0e800h
;tpc
卡中9054
芯片的io
地址
data
segment
csreg
dw
?
ipreg
dw
?
;旧中断向量保存空间
irq_times
dw
?
;中断计数
buffer0
db
00h,01h,02h,03h,04h,05h,06h,07h
buffer1
db
10h,38h,10h,10h,10h,20h,7eh,20h
gewei
dw
0
shiwei
dw
0
Led
db
3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;码
msg1
db
0dh,0ah,display,0dh,0ah,$
msg3
db
0dh,0ah,interrupt
!!!!!!,0dh,0ah,$
data
ends
stacks
segment
stack
db
256
dup
(?)
stacks
ends
code
segment
assume
cs:code,ds:data,ss:stacks,es:data
main
proc
far
;Enable
Local
Interrupt
Input
start:cli
mov
ax,data
mov
ds,ax
mov
es,ax
mov
ax,stacks
mov
ss,ax
mov
dx,ioport_cent+68h
;设置
tpc
卡中9054
芯片io
口,使能中断
in
ax,dx
or
ax,0900h
out
dx,ax
mov
al,int_vect
;保存原中断向量
mov
ah,35h
int
21h
mov
ax,es
mov
csreg,ax
mov
ipreg,bx
mov
ax,cs
;设置新中断向量
mov
ds,ax
mov
dx,offset
int_proc
mov
al,int_vect
mov
ah,25h
int
21h
in
al,21h
;设置中断掩码
and
al,irq_mask_2_7
out
21h,al
in
al,0a1h
and
al,irq_mask_9_15
out
0a1h,al
mov
ax,data
mov
ds,ax
;以上为中断初始化部分
;8253初始化部分
mov
dx,ioport_82533
mov
al,36h
out
dx,al
mov
dx,ioport_82530
mov
ax,1000
out
dx,al
mov
al,ah
out
dx,al
mov
dx,ioport_82533
mov
al,76h
out
dx,al
mov
dx,ioport_82531
mov
ax,1000
out
dx,al
mov
al,ah
out
dx,al
;8255初始化
mov
dx,io82553
mov
al,88h
out
dx,al
sti;开中断
beg:
mov
irq_times,36
go1:cmp
irq_times,26
jl
go2
mov
ax,irq_times
sub
ax,26
call
disp
mov
al,24h;南北绿灯和东西红灯亮10秒
mov
dx,io82550
out
dx,al
mov
cx,0008h
mov
ah,01h
mov
si,offset
buffer0
d1:mov
al,[si]
mov
bx,offset
buffer1;箭头显示横向红,列项绿
xlat
mov
dx,ioportC
out
dx,al
mov
al,ah
cmp
20h,ah
jb
next0
mov
dx,ioportRy
out
dx,al
next1:mov
dx,ioportRr
shl,ah
inc
si
push
cx
mov
cx,0fffh
loop1:loop
1oop1
pop
cx
loop
d1
jmp
lll
go2:cmp
irq_times,23
jl
go3
mov
ax,irq_times
sub
ax,23
call
leddisp
mov
al,0
mov
dx,io82550
out
dx,al
mov
dx,ioportC
out
dx,al
cmp
irq_times,24
je
turn
jmp
go2
turn:
mov
al,44h;南北黄灯和东西红灯闪3秒
mov
dx,io82550
out
dx,al
mov
cx,0008h
mov
ah,01h
mov
si,offset
buffer0
d2:mov
al,[si]
mov
bx,offset
buffer1;箭头闪烁显示横向红,列项绿
xlat
mov
dx,ioportC
out
dx,al
mov
al,ah
cmp
20h,ah
jb
next0
mov
dx,ioportRy
out
dx,al
next2:mov
dx,ioportRr
shl,ah
inc
si
push
cx
mov
cx,0fffh
loop2:loop
1oop2
pop
cx
loop
d2
jmp
lll
beg_mid:jmp
beg
go3:cmp
irq_times,3
jl
go4
mov
ax,irq_times
sub
ax,3
call
leddisp
;南北红灯东西绿灯亮20秒
mov
al,81h
mov
dx,io82550
out
dx,al
mov
cx,0008h
mov
ah,01h
mov
si,offset
buffer0
d3:mov
al,[si]
mov
bx,offset
buffer1;箭头显示横向绿,列项红
xlat
mov
dx,ioportC
out
dx,al
mov
al,ah
cmp
20h,ah
jb
next0
mov
dx,ioportRr
out
dx,al
next3:mov
dx,ioportRy
shl,ah
inc
si
push
cx
mov
cx,0fffh
loop3:loop
1oop3
pop
cx
loop
d3
mov
dx,io82553;中间人工按键时可以调整
in
al,dx
and
al,80h
cmp
al,80h
je
;按下时跳到qq
jmp
lll
qq:
cmp
irq_times,13
jl
qq1
mov
irq_times,8
;根据题目要求东西已亮十秒则三秒后南北绿亮;则8秒后亮
jmp
goon
qq1:
mov
irq_times,3
jmp
goon
goon:
cmp
irq_times,3
jl
go4
mov
ax,irq_times
sub
ax,3
call
leddisp
mov
al,81h
mov
dx,io82550
out
dx,al
mov
cx,0008h
mov
ah,01h
mov
si,offset
buffer0
dgoon:mov
al,[si]
mov
bx,offset
buffer1;箭头显示横向绿,列项红
xlat
mov
dx,ioportC
out
dx,al
mov
al,ah
cmp
20h,ah
jb
next0
mov
dx,ioportRr
out
dx,al
nextgoon:mov
dx,ioportRy
shl,ah
inc
si
push
cx
mov
cx,0fffh
loopgoon:loop
1oopgon
pop
cx
loop
dgoon
mov
ah,1
int
16h
jnz
exit
;南北红灯和东西绿灯亮20
jmp
goon
go4:cmp
irq_times,0
jl
beg_mid
mov
ax,irq_times
call
leddisp
mov
al,0
mov
dx,io82550
;南北红灯和东西黄灯闪3
out
dx,al
mov
dx,ioportC
out
dx,al
cmp
irq_times,1
je
turn1
jmp
go4
turn1:
mov
al,82h
mov
dx,io82550
out
dx,al
mov
cx,0008h
mov
ah,01h
mov
si,offset
buffer0
d4:mov
al,[si]
mov
bx,offset
buffer1;箭头显示横向绿,列项红
xlat
mov
dx,ioportC
out
dx,al
mov
al,ah
cmp
20h,ah
jb
next0
mov
dx,ioportRr
out
dx,al
next4:mov
dx,ioportRy
shl,ah
inc
si
push
cx
mov
cx,0fffh
loop4:loop
1oop4
pop
cx
loop
d4
jmp
lll
lll:
mov
ah,1
int
16h
jnz
exit
;按任意键退出
jmp
go1
exit:
cli
mov
bl,irq_mask_2_7
;恢复中断掩码
not
bl
in
al,21h
or
al,bl
out
21h,al
mov
bl,irq_mask_9_15
not
bl
in
al,0a1h
or
al,bl
out
0a1h,al
mov
dx,ipreg
;恢复原中断向量
mov
ax,csreg
mov
ds,ax
mov
ah,25h
mov
al,int_vect
int
21h
mov
dx,ioport_cent+68h
;设置
tpc
卡中9054
芯片io
口,关闭中断
in
ax,dx
and
ax,0f7ffh
out
dx,ax
mov
ax,4c00h
int
21h
main
endp
int_proc
proc
far
;中断处理程序
cli
push
ds
push
ax
push
dx
mov
ax,data
mov
ds,ax
mov
dx,offset
msg2
mov
ah,09h
int
21h
dec
irq_times;倒计时减少irq_times
mov
al,20h
;Send
EOI
out
0a0h,al
out
20h,al
pop
dx
pop
ax
pop
ds
sti
iret
int_proc
endp
disp
proc
near
;disp
push
dx
push
cx
push
ax
mov
ax,data
mov
ds,ax
;
mov
dx,offset
msg1
;
mov
ah,09h
;
int
21h
;设di为显示缓冲区
mov
bl,10
pop
ax
div
bl
mov
dx,ax
and
ax,00ffh
mov
shiwei,ax
mov
cl,08h
shr
dx,cl
and
dx,00ffh
mov
gewei,dx
mov
si,offset
Led
;置led数码表偏移地址为SI
add
si,gewei
;求出对应的led数码
mov
al,byte
ptr
[si]
mov
dx,io82551
;自8255b的口输出
B
port
out
dx,al
mov
al,01h
;
使相应的数码管亮
C
port
mov
dx,io82552
out
dx,al
mov
bx,0
delay:dec
bx
jnz
delay
mov
al,0
mov
dx,io82552
out
dx,al
delay2:
dec
bx
jnz
delay2
mov
si,offset
led
;置led数码表偏移地址为SI
add
si,shiwei
;求出对应的led数码
mov
al,byte
ptr
[si]
mov
dx,io82551
;8255B的口输出
out
dx,al
mov
al,2
;使相应的数码管亮c口
mov
dx,io82552
out
dx,al
mov
bx,1
delay1:
dec
bx
jnz
delay1
mov
al,0
mov
dx,io82552
out
dx,al
pop
cx
pop
dx
ret
disp
endp
code
ends
end
start
18
/
18
