交通灯控制电路设计课程设计 交通灯控制电路设计原理
具体内容如下:
交通灯控制电路设计课程设计 交通灯控制电路设计原理
交通灯控制电路设计课程设计 交通灯控制电路设计原理
一 设计题目
题目:交通灯控制电路的设计
二 设计目的
训练学生综合地运用所学的 《数字逻辑》的基本知识,使用电脑EWB仿真技术,完整地设计一定功能的电子电路,以及仿真和调试等的综合能力。本次电脑仿真所用的软件版本为EWB Version 5.0c
三 设计内容
现有一个十字路口,为了其通行的顺利,我们针对这设计了一个交通灯系统。
四 设计要求
1、设计一个十字路口的交通灯控制电路,要求东西方向车道和南北方向车道两条交叉道路上的车辆交替运行,每次通行时间都设为45秒。时间可设置修改。
2、在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道;
3、黄灯亮时,要求每秒闪亮一次。
4、东西方向、南北方向车道除了有红、黄、绿灯指示外,每一种灯亮的时间都用显示器进行显示(采用倒计时的方法)。
五 总体功能框图
图5 总体功能框图
交通灯控制系统的原理框图如图5所示。它主要由倒计时计数电路、信号灯转换器和秒脉冲信号发生器组成。秒脉冲信号发生器是该系统中倒计时计数电路和黄灯闪烁控制电路的标准时钟信号源,倒计时计数器输出两组驱动信号T5和T0,经信号灯转换器控制信号灯工作,倒计时计数电路是系统的主要部分,由它控制信号灯转换器的工作。
六 单元电路图
6.1信号灯转换器
选用JK触发器,设状态编码为:S0=00 S1=01 S2=11 S3=10,其输出为Q1 Q0,则其状态表为:
表6-1 状态编码与信号灯关系表
现态 次态 输出
Q1n Q0n Q1n+1 Q0n+1 Ga Ya Ra Gb Yb Rb
0 0 0 1 1 0 0 0 0 1
0 1 1 1 0 1 0 0 0 1
1 1 1 0 0 0 1 1 0 0
1 0 0 0 0 0 1 0 1 0
图6.1 信号灯转换器
6.2倒计时计数器
十字路口要有数字显示,作为倒计时提示,以便人们更直观地把握时间。具体为:当某方向绿灯亮时,置显示器为某值,然后以每秒减1,计数方式工作,直至减到数为“5”和“0”,十字路口绿、黄、红灯变换,一次工作循环结束,而进入下一步某方向的工作循环。在倒计时过程中计数器还向译码器提供模5的定时信号T5和模0的定时信号T0。
作G=0时的卡诺图:
BC 00 01 11 10
X 1 1 1
1 1 0 0
A 0
1(1) 倒计时显示采用七段数码管作为显示,由计数器驱动并显示计数器输出值。
(2) 计数器选用集成电路74190进行设计。74190是十进制同步可逆计数器,它具有异步并行置数功能、保持功能。74190没有专用的清零输入端,但可以借助QA、QB、QC、QD的输出数据间接实现清零功能。
表6-2 74190的状态表
CTEN D/U CLK LOAD A B C D QA QB QC QD
0 X X 0 X X X X A
B C
D0 1 POS 1 X X X X Count Down
0 0 POS 1 X X X X Count Up
1 X X X X X X X Qa0 Qb0 Qc0 Qd0
现选用两个74190芯片级联成一个从可任意设定时间00~99倒计至00的计数器,其中作为个位数的74190芯片的CLK接秒脉冲发生器(频率为1),再把个位数74190芯片输出端的QA、QD用一个与门连起来,再接在十位数74190芯片的CLK端。当个位数减到0时,再减1就会变成9, 0(0000)和9(1001)之间的QA、QD同时由0变为1,把QA、QD与起来接在十位数的CLK端,此时会给十位数74190芯片一个脉冲数字减1,相当于借位。具体连接方法如图一:
图6.2 译码器
信号LD由两个芯片的8个输出端用或门连起来,决定倒计时是置数,还是计数。工作开始时,LD为0,计数器预置数,置完数后,LD变为1,计数器开始倒计时。当倒计时减到数00时,LD又变为0,计数器又预置数,之后又倒计时,如此循环下去。
图6.3 通行时间控制开关
(3) 预置数(即车的通行时间)功能:如图6.3所示,8个开关分别接十位数74190芯片的D、C、B、A端和个位数74190芯片的D、C、B、A端。预置数的范围为6~98。如把通行时间设为45秒,就像图2的接法,A接0,B接1,C接0,D接0,E接0,F接1,G接0,H接1。(接电源相当于接1,悬空相当于接0)
图6.4 倒计时计数器
(4) 向译码器提供模5的定时信号T5和模0的定时信号T0:T0表示倒计时减到数“00”(也即绿灯的预置时间,因为到00时,计数器重新置数),T0=1,此时T0给译码器一个脉冲,使信号灯发生转换,一个方向的绿灯亮,另一个方向的红灯亮。接法为:把两个74190计数器的8个输出端用一个集成的八输入一输出或门连起来。
T5表示倒计时减到数“05”时。T5=1,此时T5给译码器一个脉冲,使信号灯发生转换,绿灯的变为黄灯,红灯的不变。接法为:当减到数为“05”(0000 0101)时,把十位计数器的输出端QA、QB、QC、QD连同个位计数器的输出端QB、QD用一个或非门连起来,再把这个或非门与个位计数器的输出端QA、QC用一个与非门连接起来。具体连接方法如图6.4所示。
要求黄灯每秒闪一次,用一个频率为1的脉冲一端与控制黄灯的输出信号的JK触发器连接起来,另一端再接到黄灯。
七 总电路图
图7 交通灯总电路图
八 调试(实现的结果)
1. 根据题目的要求,整个交通灯控制系统需要有4个时间显示器,12个交通灯。但由于4个时间显示器是由同一个倒计时计数器控制,所以我在设计图电路的过程中,为了简化电路使画图看起来更加清晰,就只接了1个时间显示器。
2. 点击启动按钮,便可以进行交通灯控制系统的仿真,电路默认把通车时间设为45秒,打开开关后,东西方向绿灯亮,“东来西往”的行人车辆都可自由通行;南北方向车道的红灯亮,南来北往的车辆禁止通行。时间显示器从预置的45秒,以每秒减1,减到数5时,东西方向车道的绿灯转换为黄灯,而且黄灯每秒闪一次,其余灯都不变。减到数1时,1秒后显示器又转换成预置的45秒,东西方向车道的黄灯转换为红灯;南北方向车道的红灯转换为绿灯。如此循环下去。
3. 修改通车时间为其它的值再进行仿真(时间范围为6~98秒),效果和上面不多,东西方向车道的绿灯亮,时间倒计数5,车灯进行一次转换,到0秒时又进行转换,而且时间重置为预置的数值,如此循环。
九 心得体会
开始拿到题目的时候,不知道怎么去做,因为自己对这门课的一般设计都不是很会.对很多的芯片的功能都不是很清楚.还有ewb仿真软件,以前才来没有接触过,只是现在需要的时候才开始用它,它的功能,按键都不清楚.
通过这次课程设计,加强了我动手、思考和解决问题的能力.现在设计已经做好了,自己感觉还是比较好的,虽然花了很多的时间,但学到了很多东西.做课程设计的时候,自己把整个书本都看了几遍,增强了自己对知识的理解,很多以前不是很懂的问题现在都已经一一解决了.在课程设计的过程中,我想了很多种方案,对同一个问题(像计数器的接法)都想了很多种不同的接法,运用不同的芯片进行了比较,还是采取了上面的方法进行连接.从开始做课程设计那天起,脑中天天都想着同样的问题,怎么去接线,怎么去把电路弄得更加简单,怎么别人更容易看懂.但似乎时间过得真的很快,我用了好几天才把它完全弄完,完成后,心里有一种说不出的高兴.
这次课程设计之后,使我明白了,做任何事情都要认真仔细,不然的话,你会花更多的时间才会做好.课程设计有利于提高我们的动手能力,能把我们所学的书本知识运用到实际生活中去.同时也丰富了我们的业余生活,提高我们对知识的理解能力.
参考文献
〔1〕 胡道元.计算机局域网.:清华大学出版社,2002年
〔2〕 江国强.现代数字逻辑电路习题指导.:电子工业出版社,2002年
〔3〕 李宜达.数字逻辑电路设计与实现.:科学出版社,2004年
〔4〕
蒋立平. 数字逻辑电路与系统设计. :电子工
以上回答你满意么?
C8255 EQU 203H ;8255 状态/命令口地址
P8255A EQU 200H ;8255 PA 口地址
P8255B EQU 201H ;8255 PB 口地址
P8255C EQU 202H ;8255 PC 口地址
DATA SEGMENT
DATA ENDS
STACK SEGMENT STACK
STA DW 50 (?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START:
MOV DX,C8255 ;A口输出
MOV AL,80H
OUT DX,AL
PUSH CS
POP DS
CALL STATUS0 ;初始状态(都是红灯)
MLOOP: CALL STATUS1 ;南北绿灯,东西红灯
CALL STATUS2 ;南北绿灯闪转黄灯,东西红灯
CALL STATUS3 ;南北红灯,东西绿灯
CALL STATUS4 ;南北红灯,东西绿灯闪转黄灯
JMP MLOOP
STATUS0:
MOV AL,0F0H ;南北红灯,东西红灯
MOV DX,P8255A
OUT DX,AL
MOV BL,10
CALL DELAY ;延时1秒
RET
STATUS1:
MOV AL,05AH ;南北红灯,东西红灯
MOV DX,P8255A
OUT DX,AL
MOV BL,50
CALL DELAY ;延时5秒
RET
STATUS2:
MOV CX,3 ;绿灯闪3次
FLASH: MOV AL,050H ;南北红灯,东西红灯
MOV DX,P8255A
OUT DX,AL
MOV BL,3
CALL DELAY ;延时0.3秒
MOV AL,05AH ;南北红灯,东西红灯
MOV DX,P8255A
OUT DX,AL
MOV BL,3
CALL DELAY ;延时0.3秒
LOOP FLASH
MOV AL,0FAH ;南北红灯,东西红灯
MOV DX,P8255A
OUT DX,AL
MOV BL,10
CALL DELAY ;延时1秒
RET
STATUS3:
MOV AL,0A5H ;南北红灯,东西绿灯
MOV DX,P8255A
OUT DX,AL
MOV BL,50
CALL DELAY ;延时5秒
RET
STATUS4: ;南北红灯,东西绿灯闪转黄灯
MOV CX,3 ;绿灯闪3次
FLASH1: MOV AL,0A0H
MOV DX,P8255A
OUT DX,AL
MOV BL,3
CALL DELAY ;延时0.3秒
MOV AL,0A5H
MOV DX,P8255A
OUT DX,AL
MOV BL,3
CALL DELAY ;延时0.3秒
LOOP FLASH1
MOV AL,0F5H ;南北红灯,东西黄灯
MOV DX,P8255A
OUT DX,AL
MOV BL,10
CALL DELAY ;延时1秒
RET
DELAY PROC NEAR
PUSH CX
DL1: MOV CX,8000H
DL2: LOOP DL2
DEC BL
CMP BL,0
JNE DL1
POP CX
RET
DELAY ENDP
CODE ENDS
END START
这个简单啊,很多资料书上都有的。。启动按钮X1输出Y0(用C0非锁)Y2(用C1非锁)同时产生定时T1,T2
T1加1S振荡加C1控制Y0闪(东西绿灯)T2控制南北绿灯亮同时产生T4,T4加1S振荡加C2控制Y2闪(南北红灯)
用C1 C2控制Y1(东西黄灯)Y2(南北黄灯)同时产生T3T4
单片机控制的交通灯
#include
#include
#define uint unsigned int
#define uchar unsigned char
//定义按键位置
//东西通行
it key0=P3^0;
// 南北通行
it key1=P3^1;
//时间设置确定;
it key2=P3^2;
//加
it key3=P3^3;
//减
it key4=P3^4;
//紧急报警
it key5=P3^5;
it set0=P3^6;
it set1=P3^7;
//a=65时,刚好为1s
uint tt;
uchar i=0,j;
//时间倒计时变量
uchar temp=0;
//通行时间变量;初始值25秒;
uchar tx_time=15;
//显示的变量;
uchar tab[2]={0,1};
//是否为设置通行时间变量;set=1,设置通行时间;set=0;正常通行;
uchar set;
uchar bojing;
//定义共阳极数码管码值
uchar Table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xff};
//延时函数ms
void DelayMs(uchar i)
{uchar j;
for(;i>0;i--)
{for(j=0;j<120;j++);
}}
//定时器0初始化配置
void Timer0_Init(void)
{TMOD=0x01;// 2:定时器1《》1:定时器0;
//----------
//-------定时器0 方式1
ET0=1;
TH0=(65536-64000)/256; //定时器的初值到ms
TL0=(65536-64000)%256;
TR0=1; //停止定时器0
PX1=1;
EA=1; //zong
}//显示函数
void dis(void)
{//没有按下设置通行时间按键时;正常显示倒计时变量temp
if(set==0) {tab[0]=temp%100/10;tab[1]=temp%10;}
//set=1时;闪烁显示通行时间值
else
{if(tt>32){tab[0]=tx_time%100/10;tab[1]=tx_time%10;} //通行时间值送显示
else {tab[0]=10;tab[1]=10;}//关显示
}for(i=0;i<2;i++) //要显示的位数
{set1=1;
P1=Table[tab[1]]; //改变tab[]的值将得到您要显示的字符
DelayMs(5); //延时
set1=0;
set0=1;
P1=Table[tab[0]]; //改变tab[]的值将得到您要显示的字符
DelayMs(5); //延时
set0=0;
}}
//延时函数
void delay(uint t)
{while(--t);
}//按键程序
void keyscan(void)
{//关数码管显示
//判断key0是否按下---东西通行,南北禁止;
while(key0==0)
{P2=0XF3;TR0=0;}//点亮红绿灯
//判断key1是否按下----南北通行,东西禁止;
while(key1==0)
{P2=0XDE;TR0=0;}//点亮红绿灯
//-----------------------------------------------------
//-----------------------------------------------------
//-----------------------------------------------------
//判断key2是否按下 //时间设置/确定键
//按下次时间设置,第二次时间设定退出
if (key2==0)
{set++;if(set>1)set=0;}
while(key2==0);//等待释放
//判断key3是否按下
if(key3==0)
{if(set==1) //设置按键被按下才时间加加;
{tx_time++;
if(tx_time>99)tx_time=99;
}
}while(key3==0);//等待释放
//判断key4是否按下
if(key4==0)
{if(set==1)if(tx_time>6)tx_time--; //6---99s设置值;
}while(key4==0);//等待释放
//-----------------------------------------------------
//---------------紧急处理----------------------------
//-----------------------------------------------------
//判断key5是否按下 紧急车通行全部红灯,
while(key5==0)
{TR0=0;
P2=0Xf6; //全部红灯
}
TR0=1;
}/main()/
void main(void)
{Timer0_Init(); //初始化定时器0
P0=0X00;
P1=0X00;
P2=0X00;
key0=1;
key1=1;
key2=1;
key3=1;
key4=1;
key5=1;
while(1)
{//东西通行,南北禁止
temp=tx_time+1;
while(1)
{P2=0XF3; //红绿灯点亮
dis(); //显示
keyscan(); //按键扫描
if(tt>65)
{tt=0; //定时完成一次后清0
temp--; //变量自减
if(temp>200) //减到小于0 跳出循环
{tt=65; //赋初值
break;
}}
}//东西方向绿灯闪2s
temp=6;//变量赋初值
while(1)
{dis(); //数码管显示
keyscan(); //按键扫描
if(tt>32)P2=0Xf7; //闪烁 tt=32的时候是半秒钟;
else P2=0Xf3;
if(tt>65)
{tt=0; //定时完成一次后清0
temp--; //变量自增
if(temp==2) //减到小于0 跳出循环
{tt=65; //赋初值
break;
}}
}//东西方向黄灯亮3s
temp=3;
while(1)
{P2=0Xf5; //红绿灯点亮
keyscan(); //按键扫描
dis(); //显示
if(tt>65)
{tt=0; //定时完成一次后清0
temp--; //变量自增
if(temp>200) //减到小于0 跳出循环
{tt=65;
break;
}}
}//南北通行,东西禁止
temp=tx_time+1;
while(1)
{P2=0XDE;
keyscan();
dis();
if(tt>65)
{tt=0;//定时完成一次后清0
temp--;//变量自增
if(temp>200) //减到小于0 跳出循环
{tt=20;
break;
}}
}//南北绿灯闪2s
temp=5;
while(1)
{keyscan();
dis();
if(tt>32)P2=0XFE;
else P2=0XDE;
if(tt>65)
{tt=0; //定时完成一次后清0
temp--; //变量自增
if(temp==2) //减到小于0 跳出循环
{tt=65;
break;
}}
}//南北方向黄灯亮2s;
temp=3;
while(1)
{P2=0XEE;
keyscan();
dis();
if(tt>65)
{tt=0; //定时完成一次后清0
temp--; //变量自增
if(temp>200) //减到小于0 跳出循环
{tt=65;
break;
}}
}}
}void Time0() interrupt 1
{//重装初值;
TH0=(65536-15384)/256;
TL0=(65536-15384)%256;
tt++; //时间累加
}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。