基于单片机的交通灯控制系统程序c语言.docx
《基于单片机的交通灯控制系统程序c语言.docx》由会员分享,可在线阅读,更多相关《基于单片机的交通灯控制系统程序c语言.docx(20页珍藏版)》请在冰点文库上搜索。
![基于单片机的交通灯控制系统程序c语言.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/02ba0e5e-8088-476b-a9c1-e78d15ee2947/02ba0e5e-8088-476b-a9c1-e78d15ee29471.gif)
基于单片机的交通灯控制系统程序c语言
/****************************************************************************************
******************************单片机交通灯实时控制系统***********************************
模块名称:
jtd.c
说明:
数码管段地址74HC373(U2)FE00、位地址74HC373(U3)为FD00
G1选通FE00、G2选通FD00、G3选通FB00、G4选通EF00、G5选通F700
共阴极数码管显示0123456789
0X7E0XOC0XB60X9E0XCC0XDA0XFA0X0E0XFE0XDE
四个方向的标识:
南(S)北(N)东(E)西(W)
两位数码管的标识:
北向N1N2,南向S1S2、西向W1W2、东向E1E2
指示灯标识:
G(绿)Y(黄)R(红)L(左转弯)F(直行)M(人行)
例如:
北向左转弯灯行用NLG;左转弯等待用NLY;左转弯停用NLR
程序设计:
GYX
设计时间:
20100604
修改时间:
20100604
*****************************************************************************************/
#include//内含单片机寄存器地址
#include//访问绝对地址XBYTE
unsignedcharSet_time[8];
bitSet_flag,flag,fsec;
unsignedcharNSLGtime,NSLYtime,NSFGtime,NSFYtime,NStime;
unsignedcharWELGtime,WELYtime,WEFGtime,WEFYtime,WEtime;
unsignedcharT,count,Tab,Set_num,key,p;
//函数声明
voidcpuInit(void);//cpu初始化
voidDisplay(void);//显示运行时间
voidSet_bitDisplay();//显示设定时间
voidkey_analyse(void);//键处理程序
voidKv_Set(void);//设置键
voidKv_Enter(void);//确定键
voidKv_Up(void);//加键
voidKv_Down(void);//减键
voidsmec(unsignedcharx);//延时子程序
//0123456789
unsignedcharTAB1[10]={0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0x0E,0xFE,0xDE};
/**********************************************************************
函数名:
main()
功能,主程序不断查询有键按下
说明:
主函数
入口参数:
无
返回值:
无
设计:
GYX日期:
20100605
修改:
日期:
***********************************************************************/
main()
{
cpuInit();
while
(1)
{
key_analyse();//查询是否有键按下
if(Set_flag)
{
Set_bitDisplay();
}
else
{
Display();//显示
switch(T)
{
case1:
XBYTE[0XFB00]=0XAD;//NS左转行,直行停人行左停
XBYTE[0XF700]=0XFE;//NS人行右停
XBYTE[0XEF00]=0XBC;//WE左转停,直行停,人行左停
XBYTE[0XF700]=0XFA;//NS人行右停,WE人行右停
break;
case2:
XBYTE[0XFB00]=0XB9;//NS左转等待,直行停,人行左停
XBYTE[0XF700]=0XFE;//NS人行右停
XBYTE[0XEF00]=0XBC;//WE左转停,直行停,人行左停
XBYTE[0XF700]=0XFA;//NS人行右停,WE人行右停
break;
case3:
XBYTE[0XFB00]=0X5E;//NS左转停,直行行,人行左行
XBYTE[0XF700]=0XF9;//NS人行右行,WE人行右停
XBYTE[0XEF00]=0XBC;//WE左转停,直行停,人行左停
break;
case4:
XBYTE[0XFB00]=0XB6;//NS左转停,直行等待,人行左停
XBYTE[0XF700]=0XFA;//NS人行右停,WE人行右停
XBYTE[0XEF00]=0XBC;//WE左转停,直行停,人行左停
break;
case5:
XBYTE[0XFB00]=0XBC;//NS左转停,直行停,人行左停
XBYTE[0XF700]=0XFA;//NS人行右停,WE人行右停
XBYTE[0XEF00]=0XAD;//WE左转行,直行停,人行左停
break;
case6:
XBYTE[0XFB00]=0XBC;//NS左转停,直行停,人行左停
XBYTE[0XF700]=0XFA;//NS人行右停,WE人行右停
XBYTE[0XEF00]=0XB9;//WE左转等待,直行停,人行左停
break;
case7:
XBYTE[0XFB00]=0XBC;//NS左转停,直行停,人行左停
XBYTE[0XF700]=0XF6;//NS人行右停,WE人行右行
XBYTE[0XEF00]=0X5E;//WE左转停,直行行,人行行
break;
case8:
XBYTE[0XFB00]=0XBC;//NS左转停,直行停人行左停
XBYTE[0XF700]=0XFA;//NS人行右停,WE人行右停
XBYTE[0XEF00]=0XB6;//WE左转停,直行等待,人行左停
count=0;
break;
default:
break;
}
}
}
}
/************************************************************************
函数名:
cpuInit(void)
功能:
cpu初始化
说明:
入口参数:
返回值:
无
设计:
GYX日期:
20100604
修改:
日期:
20100604
**************************************************************************/
voidcpuInit(void)
{
TMOD=0x01;//定时器0按方式1工作
TH0=0x4c;//定时50ms(11.0592M)
TL0=0x00;
ET0=1;
TR0=1;
EA=1;
XBYTE[0XFD00]=0XFF;//关8位显示
XBYTE[0XFB00]=0XFF;//关LED
XBYTE[0XEF00]=0XFF;//关LED
XBYTE[0XF700]=0XFF;//关LED
Set_flag=0;
//初始值设置
NSLGtime=20;//南北左转弯时间
NSLYtime=3;//南北左转弯注意时间
NSFGtime=25;//南北直行时间
NSFYtime=3;//南北注意时间
WELGtime=30;//东西左转弯时间
WELYtime=3;//东西左转弯注意时间
WEFGtime=35;//东西直行时间
WEFYtime=3;//东西注意时间
//初始值存入数组
Set_time[0]=NSLGtime;
Set_time[1]=NSLYtime;
Set_time[2]=NSFGtime;
Set_time[3]=NSFYtime;
Set_time[4]=WELGtime;
Set_time[5]=WELYtime;
Set_time[6]=WEFGtime;
Set_time[7]=WEFYtime;
//工作过程1取值
T=1;
NStime=NSLGtime;
WEtime=(NSLGtime+NSLYtime+NSFGtime+NSFYtime);
count=1;
P=0;
}
/************************************************************************
函数名:
Display(void)
功能:
显示交通灯时间
说明:
入口参数:
无
返回值:
无
设计:
GYX日期:
20100604
修改:
日期:
20100604
**************************************************************************/
voidDisplay(void)
{
XBYTE[0XFE00]=TAB1[NStime/10];//N1S1送段码
if(T==2||T==4)//NS注意时间
{
XBYTE[0XFD00]=0XFF;//N1S1位关闭
}
elseXBYTE[0XFD00]=0XFA;//N1S1位为0选通
smec
(2);
XBYTE[0XFE00]=TAB1[NStime%10];//N2S2送段码
if(T==2||T==4)//NS注意时间
{
XBYTE[0XFD00]=0XFF;//N2S2位关闭
}
elseXBYTE[0XFD00]=0XF5;//N2S2位为0选通
smec
(2);
XBYTE[0XFE00]=TAB1[WEtime/10];//W1E1送段码
if(T==6||T==8)//WE注意时间
{
XBYTE[0XFD00]=0XFF;//W1E1位关闭
}
elseXBYTE[0XFD00]=0XAF;//W1E1位为0选通
smec
(2);
XBYTE[0XFE00]=TAB1[WEtime%10];//W2E2送段码
if(T==6||T==8)//WE注意时间
{
XBYTE[0XFD00]=0XFF;//W2E2位关闭
}
elseXBYTE[0XFD00]=0X5F;//W2E2位为0选通
smec
(2);
}
/************************************************************************
函数名:
Set_bitDisplay()
功能:
设定南北方向、东西方向的左转弯、左转弯等待时间
设定南北方向、东西方向的直行、直行等待时间
说明:
入口参数:
返回值:
无
设计:
GYX日期:
20100604
修改:
日期:
20100604
**************************************************************************/
voidSet_bitDisplay()
{
switch(Tab)//根据设置过程其相应指示灯亮
{
case1:
XBYTE[0XFB00]=0XEF;break;//NSLG亮
case2:
XBYTE[0XFB00]=0XFB;break;//NSLY亮
case3:
XBYTE[0XFB00]=0XDF;break;//NSFG亮
case4:
XBYTE[0XFB00]=0XF7;break;//NSFY亮
case5:
XBYTE[0XEF00]=0XEF;break;//WELG亮
case6:
XBYTE[0XEF00]=0XFB;break;//WELY亮
case7:
XBYTE[0XEF00]=0XDF;break;//WEFG亮
case8:
XBYTE[0XEF00]=0XF7;break;//WEFY亮
default:
break;
}
if(Tab<5)
{
XBYTE[0XFE00]=TAB1[Set_num/10];//N1S1送段码
XBYTE[0XFD00]=0XFA;//N1S1位为0选通
smec
(2);
XBYTE[0XFE00]=TAB1[Set_num%10];//N2S2送段码
XBYTE[0XFD00]=0XF5;//N2S2位为0选通
smec
(2);
}
else{
XBYTE[0XFE00]=TAB1[Set_num/10];//W1E1送段码
XBYTE[0XFD00]=0XAF;//W1E1位为0选通
smec
(2);
XBYTE[0XFE00]=TAB1[Set_num%10];//W2E2送段码
XBYTE[0XFD00]=0X5F;//W2E2位为0选通
smec
(2);
}
}
/********************************************************************
函数名:
timer0()
功能:
用定时中断计数延时控制8路流水灯(50mS一中断)
说明:
定时器0函数
入口参数:
无
返回值:
无
设计:
GYX日期:
20100605
修改:
日期:
20100605
***********************************************************************/
timer0()interrupt1using1
{
TH0=0X4C;
TL0=0X00;
if(!
Set_flag)
{
p++;
if(p==20)//1S
{
p=0;
if(NStime>1)NStime--;//NS方向显示时间秒-1
else{flag=1;}
if(WEtime>1)WEtime--;//WE方向显示时间秒-1
else{flag=1;}
}
if(flag==1)
{
flag=0;
switch(++count)//根据工作过程取显示值
{
case1:
NStime=NSLGtime;WEtime=(NSLGtime+NSLYtime+NSFGtime+NSFYtime);T=1;break;
case2:
NStime=NSLYtime;T=2;break;
case3:
NStime=NSFGtime;T=3;break;
case4:
NStime=NSFYtime;T=4;break;
case5:
WEtime=WELGtime;NStime=(WELGtime+WELYtime+WEFGtime+WEFYtime);T=5;break;
case6:
WEtime=WELYtime;T=6;break;
case7:
WEtime=WEFGtime;T=7;break;
case8:
WEtime=WEFYtime-1;T=8;break;
default:
break;
}
}
}
}
/********************************************************************
函数名:
key_analyse()
功能:
按键键处理程序
说明:
调用smec();
入口参数:
返回值:
无
设计:
GYX日期:
20100605
修改:
日期:
20100605
***********************************************************************/
voidkey_analyse(void)
{
unsignedcharkey_value;
key_value=P1;
if((key_value&0x0f)!
=0x0f)//有键按下
{
smec(150);
if((key_value&0x0f)!
=0x0f)//有键按下
{
smec(80);
key_value=key_value&0x0f;
key=key_value;
}
}
switch(key)
{
case0x0e:
key=0;Kv_Set();break;//功能键
case0x0d:
key=0;Kv_Up();break;//加键
case0x0b:
key=0;Kv_Down();break;//减键
case0x07:
key=0;Kv_Enter();break;//确定键
default:
break;
}
}
/********************************************************************
函数名:
Kv_Set()
功能:
设置键
说明:
Set_flag=0功能状态,Set_flag=1按键状态
调用Set_bitDisplay();
入口参数:
返回值:
无
设计:
GYX日期:
20100605
修改:
日期:
20100605
***********************************************************************/
voidKv_Set(void)
{
Set_flag=1;
XBYTE[0XFD00]=0XFF;//关8位显示
XBYTE[0XFB00]=0XFF;//关LED
XBYTE[0XEF00]=0XFF;//关LED
XBYTE[0XF700]=0XFF;//关LED
if(Tab>7)Tab=0;
NSLGtime=Set_time[0];
NSLYtime=Set_time[1];
NSFGtime=Set_time[2];
NSFYtime=Set_time[3];
WELGtime=Set_time[4];
WELYtime=Set_time[5];
WEFGtime=Set_time[6];
WEFYtime=Set_time[7];
switch(++Tab)
{
case1:
if(flag){flag=0;Set_time[7]=Set_num;}
Set_num=NSLGtime;break;
case2:
Set_time[0]=Set_num;
Set_num=NSLYtime;break;
case3:
Set_time[1]=Set_num;
Set_num=NSFGtime;break;
case4:
Set_time[2]=Set_num;
Set_num=NSFYtime;break;
case5:
Set_time[3]=Set_num;
Set_num=WELGtime;break;
case6:
Set_time[4]=Set_num;
Set_num=WELYtime;break;
case7:
Set_time[5]=Set_num;
Set_num=WEFGtime;break;
case8:
Set_time[6]=Set_num;
Set_num=WEFYtime;break;
flag=1;
default:
break;
}
Set_bitDisplay();
}
/********************************************************************
函数名:
Kv_Enter(void)
功能:
确定键
说明:
调用Set1302(Set_time);
入口参数:
返回值:
无
设计:
GYX日期:
20100605
修改:
日期:
20100605
***********************************************************************/
voidKv_Enter(void)
{
Set_flag=0;
switch(Tab)
{
case1:
Set_time[0]=Set_num;break;
case2:
Set_time[1]=Set_num;break;
case3:
Set_time[2]=Set_num;break;
case4:
Set_time[3]=Set_num;break;
case5:
Set_time[4]=Set_num;break;
case6:
Set_time[5]=Set_num;break;
case7:
Set_time[6]=Set_num;break;
default:
break;
}
T=1;flag=1;count=0;
NSLGtime=Set_time[0];
NSLYtime=Set_time[1];
NSFGtime=Set_time[2];
NSFYtime=Set_time[3];
WELGtime=Set_time[4];
WELYtime=Set_time[5];
WEFGtime=Set_time[6];
WEFYtime=Set_time[7];
Tab=0;
P=0;
}
/********************************************************************
函数名:
voidKv_Up(void)
功能:
加键
说明:
调用:
Set_bitDisplay();s
入口参数:
返回值:
无
设计:
GYX日期:
20100605
修改:
日期:
20100605
***********************************************************************/
voidKv_Up(void)
{