用C语言编程单片机做交通灯(定时器0中断)
程序员文章站
2022-06-20 12:17:43
...
# include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
void delay(u16 i);
void DigDisplay();
void Time01();
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
#define GPIO_DIG P0
#define GPIO_TRAFFIC P1
sbit Red10=P1^0;
sbit Green10=P1^1;
sbit Red11=P1^2;
sbit Yellow11=P1^3;
sbit Green11=P1^4;
sbit Red21=P1^5;
sbit Yellow21=P1^6;
sbit Green21=P1^7;
sbit Red30=P3^0;
sbit Green30=P3^1;
u8 code smgDuan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴
static u16 i;
u8 Second=0;
u8 SmgTime[8];
void main()
{
Second=1;
Time01();
while(1)
{
if(Second==60)
{
Second=1;
}
if(Second<25) //路灯为25秒
{
SmgTime[0]=0x00; //第一个数码管不亮
SmgTime[1]=0x00; //第二个数码管不亮
SmgTime[2]=smgDuan[(25-Second)%100/10];//取出十位
SmgTime[3]=smgDuan[(25-Second)%10];//取出个位
SmgTime[4]=0x00; //第一个数码管不亮
SmgTime[5]=0x00; //第二个数码管不亮
SmgTime[6]=smgDuan[(25-Second)%100/10];//取出十位
SmgTime[7]=smgDuan[(25-Second)%10];//取出个位
DigDisplay();
GPIO_TRAFFIC=0xff; //熄灭所以LED灯
Red30=1; //D9
Green30=1; //D10
Green11=0;
Green10=0;
Red21=0;
Red30=0;
}
else if(Second<30) //设置黄灯为4秒
{
SmgTime[0]=0x00; //第一个数码管不亮
SmgTime[1]=0x00; //第二个数码管不亮
SmgTime[2]=smgDuan[(30-Second)%100/10];//取出十位
SmgTime[3]=smgDuan[(30-Second)%10];//取出个位
SmgTime[4]=0x00; //第一个数码管不亮
SmgTime[5]=0x00; //第二个数码管不亮
SmgTime[6]=smgDuan[(30-Second)%100/10];//取出十位
SmgTime[7]=smgDuan[(30-Second)%10];//取出个位
DigDisplay();
GPIO_TRAFFIC=0xff; //熄灭所以LED灯
Red30=1; //D9
Green30=1; //D10
Yellow11=0;
Red10=0;
Yellow21=0;
Red30=0;
}
else if(Second<55) //设置红灯亮的时间为25秒
{
SmgTime[0]=0x00; //第一个数码管不亮
SmgTime[1]=0x00; //第二个数码管不亮
SmgTime[2]=smgDuan[(55-Second)%100/10];//取出十位
SmgTime[3]=smgDuan[(55-Second)%10];//取出个位
SmgTime[4]=0x00; //第一个数码管不亮
SmgTime[5]=0x00; //第二个数码管不亮
SmgTime[6]=smgDuan[(55-Second)%100/10];//取出十位
SmgTime[7]=smgDuan[(55-Second)%10];//取出个位
DigDisplay();
GPIO_TRAFFIC=0xff; //熄灭所以LED灯
Red30=1; //D9
Green30=1; //D10
Red11=0;
Red10=0;
Green21=0;
Green30=0;
}
else //设置黄灯为3秒
{
SmgTime[0]=0x00; //第一个数码管不亮
SmgTime[1]=0x00; //第二个数码管不亮
SmgTime[2]=smgDuan[(60-Second)%100/10];//取出十位
SmgTime[3]=smgDuan[(60-Second)%10];//取出个位
SmgTime[4]=0x00; //第一个数码管不亮
SmgTime[5]=0x00; //第二个数码管不亮
SmgTime[6]=smgDuan[(60-Second)%100/10];//取出十位
SmgTime[7]=smgDuan[(60-Second)%10];//取出个位
DigDisplay();
GPIO_TRAFFIC=0xff; //熄灭所以LED灯
Red30=1; //D9
Green30=1; //D10
Yellow11=0;
Red10=0;
Yellow21=0;
Red30=0;
}
}
}
void delay(u16 i)
{
while(i--);
}
void DigDisplay()
{
void delay(u16 i);
u8 i;
for(i=0;i<8;i++)
{
switch(i)
{
case 0:LSA=0;LSB=0;LSC=0;break;
case 1:LSA=1;LSB=0;LSC=0;break;
case 2:LSA=0;LSB=1;LSC=0;break;
case 3:LSA=1;LSB=1;LSC=0;break;
case 4:LSA=0;LSB=0;LSC=1;break;
case 5:LSA=1;LSB=0;LSC=1;break;
case 6:LSA=0;LSB=1;LSC=1;break;
case 7:LSA=1;LSB=1;LSC=1;break;
}
GPIO_DIG=SmgTime[i];
delay(100);
GPIO_DIG=0x00;
}
}
void Time01()
{
TMOD|=0x01;//选择为定时器0模式,工作方式1,仅用TR0打开启动
TH0=0xfc; //给定时器赋初值,定时1ms
TL0=0x18;
ET0=1;//打开定时器0中断允许
EA=1;//开总中断
TR0=1;//打开定时器
}
void Time01Int() interrupt 1
{
TH0=0xfc; //给定时器赋初值,定时1ms
TL0=0x18;
i++;
if(i==1000)
{
i=0;
Second++;
}
}
接线图
下一篇: 状态机实现的LED交通灯2