×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-06-22 发布时间:
|

这是一个运用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;
 }
}

关键字:交通灯  定时器  51单片机

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM基础知识八