课程设计实验报告交通灯控制功能设计Word文件下载.docx

上传人:b****1 文档编号:816097 上传时间:2023-04-29 格式:DOCX 页数:43 大小:387.06KB
下载 相关 举报
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第1页
第1页 / 共43页
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第2页
第2页 / 共43页
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第3页
第3页 / 共43页
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第4页
第4页 / 共43页
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第5页
第5页 / 共43页
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第6页
第6页 / 共43页
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第7页
第7页 / 共43页
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第8页
第8页 / 共43页
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第9页
第9页 / 共43页
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第10页
第10页 / 共43页
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第11页
第11页 / 共43页
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第12页
第12页 / 共43页
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第13页
第13页 / 共43页
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第14页
第14页 / 共43页
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第15页
第15页 / 共43页
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第16页
第16页 / 共43页
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第17页
第17页 / 共43页
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第18页
第18页 / 共43页
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第19页
第19页 / 共43页
课程设计实验报告交通灯控制功能设计Word文件下载.docx_第20页
第20页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

课程设计实验报告交通灯控制功能设计Word文件下载.docx

《课程设计实验报告交通灯控制功能设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《课程设计实验报告交通灯控制功能设计Word文件下载.docx(43页珍藏版)》请在冰点文库上搜索。

课程设计实验报告交通灯控制功能设计Word文件下载.docx

要求同学独立完成课题,写出课程设计说明书,画出电路原理图,说明工作原理,画出电路印制板图,编写设计程序及程序流程图。

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口接扬声器,在计数器T0工作时扬声器就会响。

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

MOVAL,77H

计数器1,读写16位低高字节,工作方式3,BCD计数

MOVAL,8

MOVDX,MY8254_1

MOVAL,2

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

CALLDELAY1ms

MOVAL,0

MOVAL,0FDH;

选通低位数码管

MOVAL,AH

MOVAL,0

MOVAH,1

INT16H;

有键按下则跳出

JNZQUIT

dispENDP

中断子程序模块是通过扩充中断源实现的,主要是通过设置8259的工作模式,开放TR1和TR0的中断,按上开关K后,TR0就发生中断,在TR0中断没有触发的情况下,从OU1口输出一个上升沿脉冲,TR1就中断一次,程序如下所示:

QUERY:

MOVDX,MY8259_OCW3;

向8259的OCW3发送查询命令

MOVAL,0CH

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%10];

取t的个位送到P0口显示

}

中断服务子程序有计数器T0和计数器T1的子程序。

T1的优先级低,它主要用于控制正常工作状态的红绿灯和数码管计数,而T0的优先级高,可以处理紧急情况,并且在处理紧急情况以后能返回原正常运行状态,这在汇编里面用的是栈保护,而在C语言中可以设置一个变量也存储原来的数据,可以达到同样保护数据的效果,这一点的实现代码如下:

voidTime0(void)interrupt1using0

t=0;

count1=count;

//寄存中断前count的值,以便中断结束后恢复

while(t!

=125)

{

t++;

sound=~sound;

P10=0;

//紧急情况绿灯全熄

P12=0;

P11=1;

//紧急情况红灯全亮

P13=1;

//点亮两个数码管

count=88;

display(count);

TH0=(65535-921)/256;

TL0=(65535-921)%256;

}

count=count1;

//恢复原来count的值

if(a%2==0)

{P10=1;

P11=0;

//返回主干道通行

else

{P10=0;

P12=1;

P13=0;

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则控制突发情况。

5.1程序清单和注释:

基于8086汇编语言的程序清单及注释如下所示:

MY8255_AEQUIOY0+00H*4;

8255A口的地址

MY8255_BEQUIOY0+01H*4;

8255B口的地址

MY8255_CEQUIOY0+02H*4;

8255C口的地址

MY8255_MODEEQUIOY0+03H*4;

8255控制寄存器的地址

MY8254_0EQUIOY1+00H*4;

8254计数器0端口的地址

MY8254_1EQUIOY1+01H*4;

MY8254_MODEEQUIOY1+02H*4;

;

***************根据CHECK配置信息修改下列符号值*******************

INTR_IVADDEQU01CCH;

INTR对应的中断矢量地址

INTR_OCW1EQU0A1H;

INTR对应PC机内部8259的OCW1地址

INTR_OCW2EQU0A0H;

INTR对应PC机内部8259的OCW2地址

INTR_IMEQU0F7H;

INTR对应的中断屏蔽字

PCI_INTCSREQU9438H;

PCI卡中断控制寄存器地址

IOY0EQU0C400H;

片选IOY0对应的端口始地址

IOY1EQU0C440H;

IOY2EQU0C480H;

*****************************************************************

MY8259_ICW1EQUIOY2+00H;

实验系统中8259的ICW1端口地址

MY8259_ICW2EQUIOY2+04H;

实验系统中8259的ICW2端口地址

MY8259_ICW3EQUIOY2+04H;

实验系统中8259的ICW3端口地址

MY8259_ICW4EQUIOY2+04H;

实验系统中8259的ICW4端口地址

MY8259_OCW1EQUIOY2+04H;

实验系统中8259的OCW1端口地址

MY8259_OCW2EQUIOY2+00H;

实验系统中8259的OCW2端口地址

MY8259_OCW3EQUIOY2+00H;

实验系统中8259的OCW3端口地址

REDEQU0FAH;

紧急时刻,主支干道全部亮红灯

ZHUEQU0F5H;

主干道灯的状态

ZHIEQU0F9H;

支干道灯的状态

FLICKEREQU0F0H;

控制灯闪烁

CLOSEEQU00H;

关闭所有的灯

TIME1EQU20;

主干道通行时间

TIME2EQU10;

支干道通行时间

DATASEGMENT

CS_BAKDW?

IP_BAKDW?

IM_BAKDW?

TABDB40H,79H,24H,30H,19H,12H,02H,78H,00H,18H;

十进制数的七段显示码

COUNTDW?

;

存储计数的变量

FLAGDW?

flag为偶数时表明主干道通行

DATAENDS

STACK1SEGMENTSTACK

DW256DUP(?

STACK1ENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA,SS:

STACK1

START:

MOVAX,DATA

MOVDS,AX

CLI

MOVDX,MY8255_MODE

MOVAL,80H

OUTDX,AL;

初始化8255的工作模式A、B、C工作在方式0,均为输出

LOOP1:

MOVDX,MY8255_A

MOVCX,3

A1:

MOVAL,RED

CALLDELAY1;

延时0.5s

MOVAL,CLOSE

CALLDELAY1

LOOPA1;

初始状态主支干道红灯均闪烁,3s后进入正常工作状态

LOOP2:

MOVCOUNT,TIME1

MOVFLAG,0;

初始化主干道通行

MOVCL,ZHU

MOVAL,CL

MOVDX,PCI_INTCSR

SUBDX,19H

INAL,DX

MOVDX,PCI_INTCSR;

初始化PCI卡中断控制寄存器

MOVAX,1F00H;

向PCI_INTCSR中写入003F1F00H

OUTDX,AX

ADDDX,2

MOVAX,003FH

MOVAX,0000H;

替换INTR的中断矢量

MOVES,AX

MOVDI,INTR_IVADD

MOVAX,ES:

[DI]

MOVIP_BAK,AX;

保存INTR原中断处理程序入口偏移地址

MOVAX,OFFSETMYISR

MOVES:

[DI],AX;

设置当前中断处理程序入口偏移地址

ADDDI,2

MOVCS_BAK,AX;

保存INTR原中断处理程序入口段地址

MOVAX,SEGMYISR

[DI],AX;

设置当前中断处理程序入口段地址

MOVDX,INTR_OCW1;

设置中断屏蔽寄存器,打开INTR的屏蔽位

INAL,DX

XORAX,AX

MOVIM_BAK,AX;

保存INTR原中断屏蔽字

ANDAL,INTR_IM

MOVDX,MY8259_ICW1;

初始化实验系统中8259的ICW1

MOVAL,13H;

边沿触发、单片8259、需要ICW4

MOVDX,MY8259_ICW2;

初始化实验系统中8259的ICW2

MOVAL,08H

MOVDX,MY8259_ICW4;

初始化实验系统中8259的ICW4

MOVAL,01H;

非自动结束EOI

MOVDX,MY8259_OCW1;

初始化实验系统中8259的OCW1

MOVAL,0FCH;

打开IR0和IR1的屏蔽位

STI

WAIT1:

CALLDISP;

数码管显示

MOVAH,1;

判断是否有按键按下

INT16H

JZWAIT1;

无按键则跳回继续等待,有则退出

QUIT:

恢复PCI卡中断控制寄存器

MOVAX,0000H

MOVAX,0000H;

恢复INTR原中断矢量

MOVAX,IP_BAK;

恢复INTR原中断处理程序入口偏移地址

[DI],AX

MOVAX,CS_BAK;

恢复INTR原中断处理程序入口段地址

MOVDX,INTR_OCW1

恢复INTR原中断屏蔽寄存器的屏蔽字

MOVAX,IM_BAK

MOVAX,4C00H;

返回到DOS

INT21H

MYISRPROCNEAR;

中断处理程序MYISR

QUERY:

MOVDX,MY8259_OCW3;

INAL,DX;

TESTAL,80H;

JZQUERY;

JEIRO0;

JNEIRO1;

IRO0:

MOVAL,FLAG;

IRO为高级中断,处理紧急情况

CBW

MOVBX,AX;

把count变成双字节存入AX,这样就可以存入栈中

MOVAL,COUNT;

PUSHAX

PUSHBX

MOVCX,0FFFFH;

中断程序执行时间为65536*256/f=3s

LOOP0:

MOVBL,0FFH

MOVAX,0FAH;

主干道支干道红灯均亮

MOVDX,MY8255_C

MOVAL,80H;

PC7为高电平,接扬声器

DECBL

CMPBL,0

JNELOOP1

LOOPLOOP0

POPBX

POPAX

MOVCOUNT,AL;

还原中断前的变量值

MOVFLAG,BL

MOVAH,0

MOVAL,FLAG

MOVBL,2

DIVBL;

AH=1,FLAG为奇数,支干道通行

CMPAH,1

JEP3

MOVAL,ZHU;

主干道通行灯的状态

P3:

MOVAL,ZHI;

支干道通行灯的状态

IRET

IRO1:

MOVAL,COUNT

SUBAL,01H

DAS

计数初值自减1

CMPAL,0

JEL2

JEP1

MOVAL,ZHU;

P1:

MOVAL,ZHI

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2