单片机交通灯程序C语言.docx
《单片机交通灯程序C语言.docx》由会员分享,可在线阅读,更多相关《单片机交通灯程序C语言.docx(7页珍藏版)》请在冰豆网上搜索。
单片机交通灯程序C语言
/*******************************************************************************
*实验名:
动态显示数码管实验
*使用的IO:
*实验效果:
数码管显示76543210。
*注意:
当位选用P1口的时候注意可能会有一位不亮,那么调整J21
*******************************************************************************/
#include
//--定义使用的IO口--//
#defineGPIO_DIGP0
#defineGPIO_PLACEP1
#defineGPIO_TRAFFICP2
sbitRED10=P2^0;//上人行道红灯
sbitGREEN10=P2^1;//上人行道绿灯
sbitRED11=P2^2;
sbitYELLOW11=P2^3;
sbitGREEN11=P2^4;
sbitRED00=P3^0;//右人行道红灯
sbitGREEN00=P3^1;//右人行道绿灯
sbitRED01=P2^5;
sbitYELLOW01=P2^6;
sbitGREEN01=P2^7;
//--定义全局变量--//
unsignedcharcodeDIG_PLACE[8]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制查表的方法控制
unsignedcharcodeDIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsignedcharDisplayData[8];
//用来存放要显示的8位数的值
unsignedcharTime,Second;//用来存放定时时间
//--声明全局函数--//
voidDigDisplay();//动态显示函数
voidTimer0Cofig(void);
/*******************************************************************************
*函数名:
main
*函数功能:
主函数
*输入:
无
*输出:
无
*******************************************************************************/
voidmain(void)
{
Second=1;
Timer0Cofig();
while
(1)
{
if(Second==70)
{
Second=1;
}
//--宝田路通行,30秒--//
if(Second<31)
{
DisplayData[0]=0x00;
DisplayData[1]=0x00;
DisplayData[2]=DIG_CODE[(30-Second)%100/10];
DisplayData[3]=DIG_CODE[(30-Second)%10];
DisplayData[4]=0x00;
DisplayData[5]=0x00;
DisplayData[6]=DisplayData[2];
DisplayData[7]=DisplayData[3];
DigDisplay();
//--宝田路通行--//
GPIO_TRAFFIC=0xFF;//将所有的灯熄灭
RED00=1;
GREEN00=1;
GREEN11=0;//宝田路绿灯亮
GREEN10=0;//宝田路人行道绿灯亮
RED01=0;//前进路红灯亮
RED00=0;//前进路人行道红灯亮
}
//--黄灯等待切换状态,5秒--//
elseif(Second<36)
{
DisplayData[0]=0x00;
DisplayData[1]=0x00;
DisplayData[2]=DIG_CODE[(35-Second)%100/10];
DisplayData[3]=DIG_CODE[(35-Second)%10];
DisplayData[4]=0x00;
DisplayData[5]=0x00;
DisplayData[6]=DisplayData[2];
DisplayData[7]=DisplayData[3];
DigDisplay();
//--黄灯阶段--//
GPIO_TRAFFIC=0xFF;//将所有的灯熄灭
RED00=1;
GREEN00=1;
YELLOW11=0;//宝田路黄灯亮
RED10=0;//宝田路人行道红灯亮
YELLOW01=0;//前进路红灯亮
RED00=0;//前进路人行道红灯亮
}
//--前进路通行--//
elseif(Second<66)
{
DisplayData[0]=0x00;
DisplayData[1]=0x00;
DisplayData[2]=DIG_CODE[(65-Second)%100/10];
DisplayData[3]=DIG_CODE[(65-Second)%10];
DisplayData[4]=0x00;
DisplayData[5]=0x00;
DisplayData[6]=DisplayData[2];
DisplayData[7]=DisplayData[3];
DigDisplay();
//--黄灯阶段--//
GPIO_TRAFFIC=0xFF;//将所有的灯熄灭
RED00=1;
GREEN00=1;
RED11=0;//宝田路红灯亮
RED10=0;//宝田路人行道红灯亮
GREEN01=0;//前进路绿灯亮
GREEN00=0;//前进路人行道绿灯亮
}
//--黄灯等待切换状态,5秒--//
else
{
DisplayData[0]=0x00;
DisplayData[1]=0x00;
DisplayData[2]=DIG_CODE[(70-Second)%100/10];
DisplayData[3]=DIG_CODE[(70-Second)%10];
DisplayData[4]=0x00;
DisplayData[5]=0x00;
DisplayData[6]=DisplayData[2];
DisplayData[7]=DisplayData[3];
DigDisplay();
//--黄灯阶段--//
GPIO_TRAFFIC=0xFF;//将所有的灯熄灭
RED00=1;
GREEN00=1;
YELLOW11=0;//宝田路黄灯亮
RED10=0;//宝田路人行道红灯亮
YELLOW01=0;//前进路红灯亮
RED00=0;//前进路人行道红灯亮
}
}
}
/*******************************************************************************
*函数名:
DigDisplay
*函数功能:
使用数码管显示
*输入:
无
*输出:
无
*******************************************************************************/
voidDigDisplay()
{
unsignedchari;
unsignedintj;
for(i=0;i<8;i++)
{
GPIO_PLACE=DIG_PLACE[i];//发送位选
GPIO_DIG=DisplayData[i];//发送段码
j=10;//扫描间隔时间设定
while(j--);
GPIO_DIG=0x00;//消隐
}
}
/*******************************************************************************
*函数名:
Timer0Cofig
*函数功能:
配置定时器
*输入:
无
*输出:
无
*******************************************************************************/
voidTimer0Cofig(void)
{
TMOD=0x01;//定时器0选择工作方式1
TH0=0x3C;//设置初始值,定时50MS
TL0=0xB0;
EA=1;//打开总中断
ET0=1;//打开定时器0中断
TR0=1;//启动定时器0
}
/*******************************************************************************
*函数名:
Timer0
*函数功能:
定时器0中断函数
*输入:
无
*输出:
无
*******************************************************************************/
voidTimer0()interrupt1
{
TH0=0x3C;//设置初始值
TL0=0xB0;
Time++;
if(Time==20)
{
Second++;
Time=0;
}
}