基于单片机的交通灯控制系统程序c语言.docx

上传人:b****1 文档编号:3329052 上传时间:2023-05-05 格式:DOCX 页数:20 大小:17.92KB
下载 相关 举报
基于单片机的交通灯控制系统程序c语言.docx_第1页
第1页 / 共20页
基于单片机的交通灯控制系统程序c语言.docx_第2页
第2页 / 共20页
基于单片机的交通灯控制系统程序c语言.docx_第3页
第3页 / 共20页
基于单片机的交通灯控制系统程序c语言.docx_第4页
第4页 / 共20页
基于单片机的交通灯控制系统程序c语言.docx_第5页
第5页 / 共20页
基于单片机的交通灯控制系统程序c语言.docx_第6页
第6页 / 共20页
基于单片机的交通灯控制系统程序c语言.docx_第7页
第7页 / 共20页
基于单片机的交通灯控制系统程序c语言.docx_第8页
第8页 / 共20页
基于单片机的交通灯控制系统程序c语言.docx_第9页
第9页 / 共20页
基于单片机的交通灯控制系统程序c语言.docx_第10页
第10页 / 共20页
基于单片机的交通灯控制系统程序c语言.docx_第11页
第11页 / 共20页
基于单片机的交通灯控制系统程序c语言.docx_第12页
第12页 / 共20页
基于单片机的交通灯控制系统程序c语言.docx_第13页
第13页 / 共20页
基于单片机的交通灯控制系统程序c语言.docx_第14页
第14页 / 共20页
基于单片机的交通灯控制系统程序c语言.docx_第15页
第15页 / 共20页
基于单片机的交通灯控制系统程序c语言.docx_第16页
第16页 / 共20页
基于单片机的交通灯控制系统程序c语言.docx_第17页
第17页 / 共20页
基于单片机的交通灯控制系统程序c语言.docx_第18页
第18页 / 共20页
基于单片机的交通灯控制系统程序c语言.docx_第19页
第19页 / 共20页
基于单片机的交通灯控制系统程序c语言.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于单片机的交通灯控制系统程序c语言.docx

《基于单片机的交通灯控制系统程序c语言.docx》由会员分享,可在线阅读,更多相关《基于单片机的交通灯控制系统程序c语言.docx(20页珍藏版)》请在冰点文库上搜索。

基于单片机的交通灯控制系统程序c语言.docx

基于单片机的交通灯控制系统程序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)

{

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

当前位置:首页 > IT计算机 > 电脑基础知识

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

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