课程设计实验报告 交通灯控制功能设计.docx
《课程设计实验报告 交通灯控制功能设计.docx》由会员分享,可在线阅读,更多相关《课程设计实验报告 交通灯控制功能设计.docx(57页珍藏版)》请在冰豆网上搜索。
课程设计实验报告交通灯控制功能设计
《微机原理与接口技术》
课程设计实验报告
题目:
交通灯控制功能设计
指导老师:
专业:
信息科学与工程学院
班级:
自动化0807班
日期:
2011-1-5
微机课程设计——交通灯控制系统
一、设计思想和实施方案论述,硬件原理图及分析
1.1、课程设计名称
1.2、课程设计要求
1.3、课程设计目的
二、设计思想和实施方案论述,硬件原理图及分析
2.1、设计思想和实施方案
2.2、硬件原理图
三、典型模块以及典型编程技巧分析
3.1、8086典型模块分析
3.2、编程技巧分析
四、设计中遇到的问题及解决方法
五、程序清单和程序注释,相关流程图
5.1程序清单和注释
5.2、实验室及流程图
六、收获与体会
七、参考文献
2
微机课程设计——交通灯控制系统
一、设计课程名称及要求
1.1、课程设计名称:
交通灯控制功能设计。
1.2、课程设计要求:
(1)、分别用C语言和汇编语言编程完成硬件接口功能设计;
(2)、硬件电路基于80x86微机接口;
(3)、程序功能要求:
小键盘给定、数码管(屏幕)显示;
(4)、同时具备急救车应急响应功能和时间倒计时显示功能。
、课程设计目的:
1.3《微机应用系统设计与综合实验(实践)》课程设计是自动化专业本科生必修的一门技术基础课。
通过本课程设计,让学生对微机系统有一个较全面的理解,对典型数字接口电路的应用技术有一个较深入的掌握,并对应用系统进行硬件原理和软件编程进行分析、设计和调试,达到基本掌握简单微型计算机应用系统软硬件的设计方法,提高项目开发能力的目的。
要求同学独立完成课题,写出课程设计说明书,画出电路原理图,说明工作原理,画出电路印制板图,编写设计程序及程序流程图。
二、设计思想和实施方案论述,硬件原理图及分析
2.1、设计思想和实施方案:
本设计使用了两种方案,一种是采用8086和8255A可编程并行接口实现了交通灯的设计,分别对主干道和支干道显示红灯和绿灯并且计时,采用8254定时器/计数器产生1HZ的脉冲,来控制8259产生中断,从而实现整个电路的设计。
交通灯采用红绿两种发光二极管,主干道亮45s,支干道亮30s,计数的最后5s中绿灯闪烁,用数码管倒计时显示时间,在发生紧急情况时,可以认为用开关控制主干道和支干道红灯均亮,禁止任何车通行。
另一种方案是采用单片机来实现的,达到的效果和上述方案相同。
单片机采用定时器T0和T1来触发中断,根据中断优先级的不同,从而可以处理不同的情况,交通灯也是采用红绿两种发光二极管,主干道亮45s,支干道亮30s,计数的最后5s中绿灯闪烁,用数码管倒计时显示时间,在发生紧急情况时,可以认为用开关控制主干道和支干道红灯均亮,禁止任何车通行,在故障清除后,断开开关可以使红绿灯和数码管回到原来的状态继续正常工作。
2.2、硬件原理图:
(a)图是基于8086的设计,(b)图是基于单片机的设计。
在(a)图中,可编程并行接口芯片8255A用作输出口,控制红绿灯的亮暗和数码管的计时,定时器/计数器8254采用级联的方式产生1HZ的脉冲,并将此方波接到中断器8259的IR1上,即每秒钟让中断控制器产生依次中断,从而可以执行中断子程序。
在(b)图中,P0口用于接数码管,P1口用于控制红绿灯的亮暗,P2口用于选通数码管,P32为定时器T0的控制端,当P32口为高电平时,定时器T0才会工作,并且T0的中断优先级高于T1,所以可以用于控制紧急情况。
P37口接扬声器,3
微机课程设计——交通灯控制系统
在计数器T0工作时扬声器就会响。
4
微机课程设计——交通灯控制系统
5
微机课程设计——交通灯控制系统
三、典型模块以及典型编程技巧分析
3.1、8086典型模块分析:
基于8086的设计主要由3个模块构成,其中8255是作为与外部显示电路的接口单元,8254和8259协同工作产生中断作为控制电路。
可编程并行接口芯片8255A通过方式控制字设置成方式0工作模式,A、B、C口均为输出,可编程计数器/定时器8254通过控制字寄存器设置OU0和OU1均为方式3工作模式,通过级联产生1HZ的方波,中断控制器通过初始化命令字设置成边缘触发,8254的OU1口接到8259的IR1端,每秒钟就可以产生一次中断,每次执行中断子程序时使计数减1,从而可以实现倒计时功能,当计数到0时,重新给计数初值赋给,改变灯的状态。
外部开关接8259的IR0端,它的中断优先级别高,设置成边缘触发,当按下开关,产生一个高电平的脉冲,就可以停止原来的状态来执行更高级别的中断子程序,这就可以处理紧急情况,让主干道和支干道都变成红灯。
单片机典型模块分析:
基于单片机的设计主要是以51单片机为核心,通过变成开放T0和T1的中断,但T0要在INT0为高电平时计数器T0才会工作。
计数器T1每50ms产生一次中断,每产生20次中断就令数码管的计数减1,当计数减到0时,重新设置数码管的计数初值,这样就可以依次循环工作了。
当P32接高电平时,计数器T0开始工作,此时红灯都亮,扬声器发音,中断结束后还原原来的状态。
3.2、编程技巧分析:
基于8086的设计编程语言是汇编语言,这里的几个编程模块就是方波产生模块,数码管显示模块和中断子程序模块。
方波是通过8254级联产生的,设置8254的计时器0和计数器1工作在方式3,设置适当计数初值n即可,这个模块的程序如下所示:
LOOP2:
MOVDX,MY8254_MODE
MOVAL,0
OUTDX,AL;计数器0,读写16位低高字节,工作方式3,BCD计数
MOVAL,00H
MOVDX,MY8254_0
OUTDX,AL
MOVAL,50
OUTDX,AL
MOVDX,MY8254_MODE
MOVAL,77H
OUTDX,AL;计数器1,读写16位低高字节,工作方式3,BCD计数
MOVAL,8
MOVDX,MY8254_1
OUTDX,AL
6
微机课程设计——交通灯控制系统
MOVAL,2
OUTDX,AL;1.041667MHZ/2000/1000=1HZ,即计数器输出1HZ的方波
数码管的显示是通过调用显示函数实现的,通过设置8255的工作模式,选择数码管的高位工作,然后将计数的高位送到数码管,再选择数码管的低位工作,然后将计数的低位送到数码管,在1s钟内多次扫描就可以消除闪烁,从而达到理想的计数效果,它的程序如下所示:
dispPROCNEAR
C1:
MOVDX,MY8255_C
MOVAL,0FEH;选通高位数码管
OUTDX,AL
SUBAH,AH
MOVAL,COUNT
MOVBL,0AH
DIVBL;商寄存在AL中,余数在AH中
MOVBX,OFFSETTAB
XLAT;通过查表找到对应的7段显示字符
MOVDX,MY8255_B
OUTDX,AL
CALLDELAY1ms
MOVAL,0
OUTDX,AL
MOVAL,0FDH;选通低位数码管
MOVDX,MY8255_C
OUTDX,AL
MOVAL,AH
MOVBX,OFFSETTAB
XLAT;通过查表找到对应的7段显示字符
MOVDX,MY8255_B
OUTDX,AL
CALLDELAY1ms
MOVAL,0
OUTDX,AL
MOVAH,1
INT16H;有键按下则跳出
JNZQUIT
dispENDP
7
微机课程设计——交通灯控制系统
中断子程序模块是通过扩充中断源实现的,主要是通过设置8259的工作模式,开放TR1和TR0的中断,按上开关K后,TR0就发生中断,在TR0中断没有触发的情况下,从OU1口输出一个上升沿脉冲,TR1就中断一次,程序如下所示:
QUERY:
MOVDX,MY8259_OCW3;向8259的OCW3发送查询命令
MOVAL,0CH
OUTDX,AL
INAL,DX;读出查询字
TESTAL,80H;判断中断是否已响应
JZQUERY;没有响应则继续查询
ANDAL,03H
CMPAL,00H
JEIR0ISR;若为IR0请求,跳到IR0处理程序
JNEIR1ISR;若为IR1请求,跳到IR1处理程序
JMPEOI
基于单片机的编程语言是C语言,它主要有数码管显示程序和中断服务子程序。
数码管的显示和上面汇编语言的原理一样,它的程序如下:
voiddisplay(unsignedchart)//显示数码管函数
{
P2=0xf5;选通两个高位数码管
P0=tab[t/10];取t的十位送到P0口显示
delay();
P2=0xF0;开通所有的数码管,避免闪烁
P2=0xfa;选通低位两个数码管
P0=tab[t_x0010_];取t的个位送到P0口显示
delay();
P2=0xF0;
}
中断服务子程序有计数器T0和计数器T1的子程序。
T1的优先级低,它主要用于控制正常工作状态的红绿灯和数码管计数,而T0的优先级高,可以处理紧急情况,并且在处理紧急情况以后能返回原正常运行状态,这在汇编里面用的是栈保护,而在C语言中可以设置一个变量也存储原来的数据,可以达到同样保护数据的效果,这一点的实现代码如下:
voidTime0(void)interrupt1using0
{
t=0;
count1=count;//寄存中断前count的值,以便中断结束后恢复
8
微机课程设计——交通灯控制系统
while(t!
=125)
{
t++;
sound=~sound;
P10=0;//紧急情况绿灯全熄
P12=0;
P11=1;//紧急情况红灯全亮
P13=1;
P2=0xF0;//点亮两个数码管
count=88;
display(count);
TH0=(65535-921)/256;
TL0=(65535-921)%6;
}
count=count1;//恢复原来count的值
if(a%2==0)
{P10=1;
P11=0;
P12=0;
P13=1;//返回主干道通行
}
else
{P10=0;
P11=1;
P12=1;
P13=0;//返回主干道通行
}
}
四、设计中遇到的问题及解决方法
9
微机课程设计——交通灯控制系统
1.数码管的计数每秒钟减1,当时不熟练8254的应用,就想用软件延时来实现这个功能,最后查资料的时候知道了计时器的级联应用,很容易的就解决了这个问题。
2.对于数码管的显示,最开始感觉很模糊,查阅资料的时候找到了XLAT表转换指令的应用,首先定义十进制的七段显示码,将表格首地址送入BX,数字的七段码在表格中的偏移量送入AL,然后执行XLAT就可以实现这个功能了。
3.对于要求中的紧急响应功能,开始时只想利用8254来实现,结果失败了,所以我就想到了用两级中断,产生高级中断时就开启紧急响应功能,触发蜂鸣器,点亮红灯。
4.在执行中断程序的过程中,寄存器中的变量好多都改变了,开始时束手无策,最后查资料时想到了栈的运用,利用入栈和出栈来保护寄存器中的初值。
5.在用C语言编程时,用PROTUES软件进行仿真时,数码管显示错误,一会显示一会停止,闪烁感太明显了。
想想后,我就把显示函数从中断子程序中改放到主函数中,放在while
(1)无限循环语句中,最后很好的解决了这个问题。
查阅资料后才明白,执行中断子程序是很快的事,执行完了后就会返回到主函数中继续执行,所以显示函数放在中断子程序中只有在产生中断的时候才会工作,所以数码管很多时候就处于熄灭的状态,而显示函数放在主函数中就放好解决了这个问题。
6.要做到可以人为设置通行时间,在单片机中,我不熟练键盘扫描,所以就想到了另外一个办法,给P1的高四位赋不同的初值,这样可以得到16种组合,故可以设置16中初值,为了简化程序,我只设置了4种初值,不过同样可以达到设置初值的效果。
7.用单片机产生两级中断的时候,我不知道该选定时器中断还是外部中断,查资料后知道定时器0和定时器1的中断优先级不一样,定时器T0的优先级高,所以可以让定时器T1控制正常工作状态的灯显示和数码管计数,而定时器T0则控制突发情况。
10
微机课程设计——交通灯控制系统
五、程序清单和程序注释,相关流程图
5.1程序清单和注释:
基于8086汇编语言的程序清单及注释如下所示:
;8255A口的地址IOY0+00H*4MY8255_AEQU
;8255B口的地址IOY0+01H*4MY8255_BEQU
;8255C口的地址IOY0+02H*4MY8255_CEQU
;8255控制寄存器的地址IOY0+03H*4MY8255_MODEEQU
;8254计数器0端口的地址IOY1+00H*4MY8254_0EQU
;8254计数器0端口的地址IOY1+01H*4MY8254_1EQU
;8254计数器0端口的地址IOY1+02H*4MY8254_MODEEQU
根据CHECK配置信息修改下列符号值*******************;***************;INTR对应的中断矢量地址EQU01CCHINTR_IVADD
;INTR对应PC机内部8259的OCW1地址0A1HINTR_OCW1EQU
;INTR对应PC机内部8259的OCW2地址INTR_OCW2EQU0A0H
;INTR对应的中断屏蔽字0F7HINTR_IMEQU
;PCI卡中断控制寄存器地址9438HPCI_INTCSREQU
;片选IOY0对应的端口始地址0C400HIOY0EQU
;片选IOY0对应的端口始地址0C440HIOY1EQU
;片选IOY0对应的端口始地址0C480HIOY2EQU
;*****************************************************************
;实验系统中8259的ICW1端口地址IOY2+00HMY8259_ICW1EQU
;实验系统中8259的ICW2端口地址MY8259_ICW2EQUIOY2+04H
;实验系统中8259的ICW3端口地址MY8259_ICW3EQUIOY2+04H
;实验系统中8259的ICW4端口地址EQUIOY2+04HMY8259_ICW4
;实验系统中8259的OCW1端口地址IOY2+04HMY8259_OCW1EQU
;实验系统中8259的OCW2端口地址IOY2+00HMY8259_OCW2EQU
;实验系统中8259的OCW3端口地址IOY2+00HMY8259_OCW3EQU
;紧急时刻,主支干道全部亮红灯0FAHREDEQU
;主干道灯的状态ZHUEQU0F5H
;支干道灯的状态0F9HZHIEQU
;控制灯闪烁0F0HFLICKEREQU
;关闭所有的灯EQU00HCLOSE
;主干道通行时间TIME1EQU20
;支干道通行时间10TIME2EQU
11
微机课程设计——交通灯控制系统
DATASEGMENT
CS_BAKDW?
IP_BAKDW?
IM_BAKDW?
;十进制数的七段40H,79H,24H,30H,19H,12H,02H,78H,00H,18HTABDB
显示码
;存储计数的变量?
COUNTDW
;flag为偶数时表明主干道通行?
FLAGDW
DATAENDS
STACK1SEGMENTSTACK
DW256DUP(?
)
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK1
START:
MOVAX,DATA
MOVDS,AX
CLI
MOVDX,MY8255_MODE
MOVAL,80H
;初始化8255的工作模式A、B、C工作在方式0,均OUTDX,AL
为输出
LOOP1:
MOVDX,MY8255_A
MOVCX,3
A1:
MOVAL,RED
OUTDX,AL
;延时0.5sCALLDELAY1
MOVAL,CLOSE
OUTDX,AL
CALLDELAY1
;初始状态主支干道红灯均闪烁,3s后进入正常工作状LOOPA1
态
LOOP2:
MOVDX,MY8254_MODE
12
微机课程设计——交通灯控制系统
MOVAL,0
;计数器0,读写16位低高字节,工作方式3,BCDOUTDX,AL
计数
MOVAL,00H
MOVDX,MY8254_0
OUTDX,AL
MOVAL,50
OUTDX,AL
MOVDX,MY8254_MODE
AL,77H
MOV
BCD,1,读写16位低高字节,工作方式3;计数器DX,ALOUT
计数
AL,8
MOV
MOVDX,MY8254_1
OUTDX,AL
MOVAL,2
的;1.041667MHZ/2000/1000=1HZ,即计数器输出1HZDX,ALOUT
方波
MOVCOUNT,TIME1
初始化主干道通行;MOVFLAG,0
MOVCL,ZHU
AL,CLMOV
MOVDX,MY8255_A
OUTDX,AL
MOVDX,PCI_INTCSR
DX,19HSUB
AL,DX
IN
卡中断控制寄存器PCI初始化;MOVDX,PCI_INTCSR
003F1F00H向PCI_INTCSR中写入;AX,1F00HMOV
DX,AXOUT
ADDDX,2
MOVAX,003FH
DX,AXOUT
的中断矢量替换;INTRAX,0000HMOV
MOVES,AX
13
微机课程设计——交通灯控制系统
MOVDI,INTR_IVADD
MOVAX,ES:
[DI]
;保存INTR原中断处理程序入口偏移地址IP_BAK,AXMOV
MOVAX,OFFSETMYISR
;设置当前中断处理程序入口偏移地址ES:
[DI],AXMOV
ADDDI,2
MOVAX,ES:
[DI]
;保存INTR原中断处理程序入口段地址MOVCS_BAK,AX
MOVAX,SEGMYISR
设置当前中断处理程序入口段地址;ES:
[DI],AXMOV
的屏;设置中断屏蔽寄存器,打开INTRMOVDX,INTR_OCW1
蔽位
AL,DXIN
XORAX,AX
原中断屏蔽字;保存INTRIM_BAK,MOVAX
ANDAL,INTR_IM
OUTDX,AL
ICW18259;初始化实验系统中的MOVDX,MY8259_ICW1
ICW4、需要;边沿触发、单片8259AL,13HMOV
OUTDX,AL
ICW28259的;初始化实验系统中MOVDX,MY8259_ICW2
MOVAL,08H
OUTDX,AL
ICW48259的初始化实验系统中;MOVDX,MY8259_ICW4
EOI;非自动结束MOVAL,01H
DX,ALOUT
OCW1的初始化实验系统中;8259MOVDX,MY8259_OCW1
的屏蔽位IR0;打开和IR1AL,0FCHMOV
DX,ALOUT
STI
数码管显示;WAIT1:
DISPCALL
14
微机课程设计——交通灯控制系统
;判断是否有按键按下AH,1MOV
INT16H
;无按键则跳回继续等待,有则退出WAIT1JZ
QUIT:
CLI
;恢复PCI卡中断控制寄存器MOVDX,PCI_INTCSR
MOVAX,0000H
OUTDX,AX
;恢复INTR原中断矢量AX,0000HMOV
MOVES,AX
DI,INTR_IVADD
MOV
原中断处理程序入口偏移地址;恢复INTRMOVAX,IP_BAK
MOVES:
[DI],AX
DI,2
ADD
原中断处理程序入口段地址恢复INTR;AX,CS_BAKMOV
ES:
[DI],AXMOV
DX,INTR_OCW1MOV
AX,AX
XOR
;恢复INTR原中断屏蔽寄存器的屏蔽字
AX,IM_BAKMOV
DX,ALOUT
STI
DOS;返回到MOVAX,4C00H
21H
INT
MYISR
中断处理程序;MYISRPROCNEAR
发送查询命令OCW38259;向的DX,MY8259_OCW3QUERY:
MOV
MOVAL,0CH
OUTDX,AL
读出查询字;AL,DXIN
判断中断是否已响应;AL,80HTEST
没有响应则继续查询;JZQUERY
AL,03HAND
CMPAL,00H
处理程序若为;IR0IR0请求,