/*****************************************************
十字路口交通灯控制 C 程序
******************************************************/
#defineucharunsigned char
#defineuintunsigned int
#include<reg52.h>
/*****定义控制位**********************/
sbit Time_Show_LED2=P2^5//Time_Show_LED2控制位
sbit Time_Show_LED1=P2^4//Time_Show_LED1控制位
sbitEW_LED2=P2^3//EW_LED2控制位
sbitEW_LED1=P2^2//EW_LED1控制位
sbitSN_LED2=P2^1//SN_LED2控制位
sbitSN_LED1=P2^0//SN_LED1控制位
sbit SN_Yellow=P1^6//SN黄灯
sbit EW_Yellow=P1^2//EW黄灯
sbit EW_Red=P1^3//EW红灯
sbit SN_Red=P1^7//SN红灯
sbit EW_ManGreen=P3^0//EW人行道绿灯
sbit SN_ManGreen=P3^1//SN人行道绿灯
sbit Special_LED=P2^6//交通正常指示灯
sbit Busy_LED=P2^7//交通繁忙指示灯
sbit Nomor_Button=P3^5//交通正常按键
sbit Busy_Btton=P3^6//交通繁忙按键
sbit Special_Btton=P3^7//交通特殊按键
sbit Add_Button=P3^3//时间加
sbit Reduces_Button=P3^4//时间减
bit Flag_SN_Yellow //SN黄灯标志位
bit Flag_EW_Yellow//EW黄灯标志位
charTime_EW//东西方向倒计时单元
charTime_SN//南北方向倒计时单元
uchar EW=60,SN=40,EWL=19,SNL=19 //程序初始化赋值,正常模式
uchar EW1=60,SN1=40,EWL1=19,SNL1=19//用于存放修改值的变量
uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}//1~~~~9段选码
uchar code S[8]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84}//交通信号灯控制代码
/**********************延时子程序************************/
voidDelay(uchar a)
{
uchari
i=a
while(i--){}
}
/*****************显示子函数**************************/
voidDisplay(void)
{
char h,l
h=Time_EW/10
l=Time_EW%10
P0=table[l]
EW_LED2=1
Delay(2)
EW_LED2=0
P0=table[h]
EW_LED1=1
Delay(2)
EW_LED1=0
h=Time_SN/10
l=Time_SN%10
P0=table[l]
SN_LED2=1
Delay(2)
SN_LED2=0
P0=table[h]
SN_LED1=1
Delay(2)
SN_LED1=0
h= EW1/10
l= EW1%10
P0=table[l]
Time_Show_LED1=1
Delay(2)
Time_Show_LED1=0
P0=table[h]
Time_Show_LED2=1
Delay(2)
Time_Show_LED2=0
}
/**********************外部0中断服务程序************************/
voidEXINT0(void)interrupt 0 using 1
{
EX0=0 //关中断
if(Add_Button==0) //时间加
{
EW1+=5
SN1+=5
if(EW1>=100)
{
EW1=99
SN1=79
}
}
if(Reduces_Button==0) //时间减
{
EW1-=5
SN1-=5
if(EW1<=40)
{
EW1=40
SN1=20
}
}
if(Nomor_Button==0)//测试按键是否按下,按下为正常状态
{
EW1=60
SN1=40
EWL1=19
SNL1=19
Busy_LED=0//关繁忙信号灯
Special_LED =0//关特殊信号灯
}
if(Busy_Btton==0) //测试按键是否按下,按下为繁忙状态
{
EW1=45
SN1=30
EWL1=14
SNL1=14
Special_LED=0//关特殊信号灯
Busy_LED=1//开繁忙信号灯
}
if(Special_Btton==0)//测试按键是否按下,按下为特殊状态
{
EW1=75
SN1=55
EWL1=19
SNL1=19
Busy_LED=0//关繁忙信号灯
Special_LED =1//开特殊信号灯
}
EX0=1//开中断
}
/**********************T0中断服务程序*******************/
void timer0(void)interrupt 1 using 1
{
static uchar count
TH0=(65536-50000)/256
TL0=(65536-50000)%256
count++
if(count==10)
{
if(Flag_SN_Yellow==1) //测试南北黄灯标志位
{SN_Yellow=~SN_Yellow}
if(Flag_EW_Yellow==1) //测试东西黄灯标志位
{EW_Yellow=~EW_Yellow}
}
if(count==20)
{
Time_EW--
Time_SN--
if(Flag_SN_Yellow==1)//测试南北黄灯标志位
{SN_Yellow=~SN_Yellow}
if(Flag_EW_Yellow==1)//测试东西黄灯标志位
{EW_Yellow=~EW_Yellow}
count=0
}
}
/*********************主程序开始**********************/
voidmain(void)
{
Busy_LED=0
Special_LED=0
IT0=1//INT0负跳变触发
TMOD=0x01//定时器工作于方式1
TH0=(65536-50000)/256//定时器赋初值
TL0=(65536-50000)%256
EA=1 //CPU开中断总允许
ET0=1//开定时中断
EX0=1//开外部INTO中断
TR0=1//启动定时
while(1)
{/*******S0状态**********/
EW_ManGreen=0//EW人行道禁止
SN_ManGreen=1//SN人行道通行
Flag_EW_Yellow=0 //EW关黄灯显示信号
Time_EW=EW
Time_SN=SN
while(Time_SN>=5)
{P1=S[0] //SN通行,EW红灯
Display()}
/*******S1状态**********/
P1=0x00
while(Time_SN>=0)
{Flag_SN_Yellow=1 //SN开黄灯信号位
EW_Red=1 //SN黄灯亮,等待左拐信号,EW红灯
Display()
}
/*******S2状态**********/
Flag_SN_Yellow=0 //SN关黄灯显示信号
Time_SN=SNL
while(Time_SN>=5)
{P1=S[2]//SN左拐绿灯亮,EW红灯
Display()}
/*******S3状态**********/
P1=0x00
while(Time_SN>=0)
{Flag_SN_Yellow=1//SN开黄灯信号位
EW_Red=1 //SN黄灯亮,等待停止信号,EW红灯
Display()}
/***********赋值**********/
EW=EW1
SN=SN1
EWL=EWL1
SNL=SNL1
/*******S4状态**********/
EW_ManGreen=~EW_ManGreen//EW人行道通行
SN_ManGreen=~SN_ManGreen//SN人行道禁止
Flag_SN_Yellow=0 //SN关黄灯显示信号
Time_EW=SN
Time_SN=EW
while(Time_EW>=5)
{P1=S[4] //EW通行,SN红灯
Display()}
/*******S5状态**********/
P1=0X00
while(Time_EW>=0)
{Flag_EW_Yellow=1//EW开黄灯信号位
SN_Red=1//EW黄灯亮,等待左拐信号,SN红灯
Display()}
/*******S6状态**********/
Flag_EW_Yellow=0 //EW关黄灯显示信号
Time_EW=EWL
while(Time_EW>=5)
{P1=S[6]//EW左拐绿灯亮,SN红灯
Display()}
/*******S7状态**********/
P1=0X00
while(Time_EW>=0)
{Flag_EW_Yellow=1 //EN开黄灯信号位
SN_Red=1//EW黄灯亮,等待停止信号,SN红灯
Display()}
/***********赋值**********/
EW=EW1
SN=SN1
EWL=EWL1
SNL=SNL1
}
}
具体内容如下:一 设计题目
题目:交通灯控制电路的设计
二 设计目的
训练学生综合地运用所学的 《数字逻辑》的基本知识,使用电脑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
D
0 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〕
蒋立平. 数字逻辑电路与系统设计. 北京:电子工
以上回答你满意么?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)