功能:
十字路口交通灯控制程序: 正常时,EW方向计时60s,SN方向计时40s 若按时间加按键(Add_Button)按钮,EW、SN方向各加5s,不可大于99s,79s 若按时间减按键(Reduces_Button)按键,EW、SN方向各减5s,不可小于40s,20s 若按EW方向强制通行(QZ_EW_Btton)按钮,EW方向强制通行,SN方向禁止通行 若按SN方向强制通行(QZ_SN_Btton)按钮,SN方向强制通行,EW方向禁止通行。
程序运行图:
仿真原理图:
部分程序:
/ #define TRAFFIC_GLOBAL 1
#include "TRAFFIC.H"
/********************************************************************************************
* 函数名称:延时子程序
* 功 能:延时,给LED显示的延时时间
* 入口参数:时间参数
* 出口参数:无
*********************************************************************************************/
void Delay(uchar a)
{
uchar i;
i=a;
while(i--){;}
}
/********************************************************************************************
* 函数名称:显示子函数
* 功 能:EW方向,SN方向主干道数码管显示驱动
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Display(void)
{
char h,l;
h=Time_EW/10; //EW方向计时的十位数
l=Time_EW%10; //EW方向计时的个位数
P0=table[l]; //显示EW计时时间的低位
EW_LED2=1;
Delay(2);
EW_LED2=0;
P0=table[h]; //显示EW计时时间的高位
EW_LED1=1;
Delay(2);
EW_LED1=0;
h=Time_SN/10; //SN方向计时的十位数
l=Time_SN%10; //SN方向计时的个位数
P0=table[l]; //显示SN计时时间的低位
SN_LED2=1;
Delay(2);
SN_LED2=0;
P0=table[h]; //显示SN计时时间的高位
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中断服务程序
* 功 能:中断,检测按钮的类别,执行相应的操作;
若Add_Button==0,通行时间加5s ;
若Reduces_Button==0,通行时间减5s ;
若Busy_Btton==0,开繁忙信号灯,关特殊信号灯,通行时间45s,30s;
若Add_Button==0,关繁忙信号灯,开特殊信号灯,通行时间75s,55s;
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void EXINT0(void) interrupt 0 using 0
{
EA = 0; //关中断
if(Add_Button==0) //时间加
{
EW1+=5; //通行时间加5s
SN1+=5;
if(EW1>=100) //通行时间不得大于100s,80s
{
EW1=99;
SN1=79;
}
}
if(Reduces_Button==0) //时间减
{
EW1-=5; //通行时间减5s
SN1-=5;
if(EW1<=40) //通行时间不得小于40s,20s
{
EW1=40;
SN1=20;
}
}
EA = 1; //开中断
}
/******************************************************************************
* 函数名称:外部中断1
* 功 能:中断,当遇到紧急情况,需要人工控制时,强制直行的函数处理
若QZ_EW_Btton按下时,EW方向绿灯亮,SN方向红灯亮 ,并点亮QZ_EW_LED指示灯
若QZ_SN_Btton按下时,EW方向红灯亮,SN方向绿灯亮 ,并点亮QZ_SN_LED指示灯
* 入口参数:无
* 出口参数:无
********************************************************************************/
void EXINT1(void) interrupt 2 using 2
{
EA = 0;
if(QZ_EW_Btton==0) //EW方向强制通行按键是否按下
{
QZ_EW = ~QZ_EW; //
QZ_SN = 0;
if(QZ_EW)
{QZ_EW_LED = 1;
QZ_SN_LED = 0;}
else QZ_EW_LED = 0;
}
if(QZ_SN_Btton==0) //测试按键是否按下,按下为特殊状态
{
QZ_SN = ~QZ_SN;
QZ_EW = 0;
if(QZ_SN)
{QZ_SN_LED = 1;
QZ_EW_LED = 0;}
else
QZ_SN_LED = 0;
}
/******************************************************************************
* 函数名称:main()
* 功 能:主函数
* 入口参数:无
* 出口参数:无
********************************************************************************/
void main(void)
{
QZ_EW_LED = 0;
QZ_SN_LED = 0;
QZ_EW = 0;
QZ_SN = 0;