锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

运用定时器中断写的交通灯

时间:2024-04-22 21:07:09

这是一个运用51单片机写的交通灯的例子,可以显示时间,红黄蓝等,第一个按键是左右路通行20S,第二个按键是上下路通行20S,第一个按键是所有路都是红灯20S。这是从时钟该来的程序,与上一个始终的程序大体相同。

#include
#define uint unsigned int
int code table[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,
};
sbit hongA=P0^0;
sbit huangA=P0^1;
sbit lvA=P0^2;
sbit hongB=P0^3;
sbit huangB=P0^4;
sbit lvB=P0^5;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
int t=0,t1=0,flag=0,tt0,tt1;
void delay();
void ziyou();
void Bfangxing();
void Afangxing();
void zhongduan();
void main()
{

EA=1;//开总中断
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
ET0=1;//开定时器0中断
TR0=1;//启动定时器0

P0=0xff;
lvA=0;//打开绿灯
hongB=0;
while(1)
{

if(flag==0) ziyou();//自由状态
if(flag==1) Afangxing();//B放行期间改变
if(flag==2) Bfangxing();//B放行期间改变
if(flag==3) zhongduan();//B放行期间改变
if(tt0==-1) {tt1--;tt0=9;}
P3=0X01;
P2=table[tt1];
delay();
P3=0X02;
P2=table[tt0];
delay();
}
}
void delay()
{
int i;
for(i=0;i<200;i++);
}
void ziyou()//自由状态
{
if(t==20)//达到1s
{
t=0;
t1=t1+1;
tt0--;//减少秒
}
if(t1==0)
{
hongB=0;lvB=1;huangB=1;//B道
lvA=0;huangA=1;hongA=1;//A道
tt1=3;tt0=0;
}
if(t1==30)//30
{
hongB=0;lvB=1;huangB=1;//B道
lvA=1;huangA=0;hongA=1;//A道
tt1=0;tt0=5;
}
if(t1==35)//35
{
hongB=1;lvB=0;huangB=1;//B道
hongA=0;huangA=1;lvA=1;//A道
tt1=2;tt0=0;
}
if(t1==55)//55
{
hongA=0;lvA=1;huangA=1;//A道
lvB=1;huangB=0;hongB=1;//B道
tt1=0;tt0=5;
}
if(t1==60)//60
{
t1=0;
tt1=0;tt0=0;
}
}
void Afangxing()//A放行
{
hongB=0;lvB=1;huangB=1;//B道
lvA=0;huangA=1;hongA=1;//A道
if(t==20)//达到1s
{
t=0;
t1=t1+1;
tt0--;
}
if(t1==15)
{
t1=30;//跳至30
flag=0;

}
}
void Bfangxing()//B放行
{
hongB=1;lvB=0;huangB=1;//B道
hongA=0;huangA=1;lvA=1;//A道
if(t==20)//达到1s
{
t=0;
t1=t1+1;
tt0--;
}
if(t1==15)
{
t1=55;//跳至55
flag=0;
}
}
void zhongduan()//key3
{
hongB=0;lvB=1;huangB=1;//B道
hongA=0;huangA=1;lvA=1;//A道
if(t==20)//达到1s
{
t=0;
t1=t1+1;
tt0--;
}
if(t1==20)
{
t1=0;//跳至55
flag=0;
}
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
t++; //tt=20为1s
if(key1==0)
{
if(t1>30){flag=1;t=0;t1=0;tt1=1;tt0=5;}//35
}

if(key2==0)
{
if(t1<35){flag=2;t=0;t1=0;tt1=1;tt0=5;}//35
}
if(key3==0)
{tt1=2;tt0=0;
flag=3;t=0;t1=0;
}
}


-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章