專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

運(yùn)用定時(shí)器中斷寫的交通燈

作者:未知   來(lái)源:不詳   點(diǎn)擊數(shù):  更新時(shí)間:2014年06月28日   【字體:

這是一個(gè)運(yùn)用51單片機(jī)寫的交通燈的例子,可以顯示時(shí)間,紅黃藍(lán)等,第一個(gè)按鍵是左右路通行20S,第二個(gè)按鍵是上下路通行20S,第一個(gè)按鍵是所有路都是紅燈20S。這是從時(shí)鐘該來(lái)的程序,與上一個(gè)始終的程序大體相同。

 

#include<reg52.h>
#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;//開(kāi)總中斷
 TMOD=0x01;//設(shè)置定時(shí)器0為工作方式1
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%6; 
 ET0=1;//開(kāi)定時(shí)器0中斷
 TR0=1;//啟動(dòng)定時(shí)器0

 P0=0xff;
 lvA=0;//打開(kāi)綠燈
 hongB=0;
 while(1)
 
   
    if(flag==0)  ziyou();//自由狀態(tài)
    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()//自由狀態(tài)
{
  if(t==20)//達(dá)到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)//達(dá)到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)//達(dá)到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)//達(dá)到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;
 }
}

關(guān)閉窗口

相關(guān)文章