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

8051的交通灯程序

发布时间:2020-05-28 发布时间:
|
一个简单的交通灯的实验

 

#include
#define uchar unsigned char 
#define uint unsigned int
#define MAX 30    // 红灯亮的时间
#define YELLOW 6   // 黄灯亮的时间
uchar code num[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //共阴级数码管的段选码
uchar data count=0;
void LED_display(uchar ,uchar);
void isr_T1(void);
uchar data i,j,x,t,time;
bit flag=0;

void main()
{
 TMOD=0x10;
 TH1=0x3c;           // 12 MHz 定时时间是 50 ms
 TL1=0x0b0;
 ET1=1;
 EA=1;
 TR1=1;
 time=MAX;
 P1=0x56;
 while(1)
 {
  i=time/10;     // 个位
  j=time%10;    // 十位   
  x=0x80;
  LED_display(x,i);
  x=x>>1;
  LED_display(x,j);  
 } 
}

 void LED_display(uchar wei,uchar digital)    // LED 数码管显示子程序
{          // wei 表示位选码,digital 表示要显示的数字
 uchar x,y,i;
 x=wei;
 y=num[digital];
 P2=x;           // 位选码输出
 P0=y;   // 段选码输出

 for(i=0;i<10;i++) {};     // 延时,等待数码管显示

}

void isr_T1(void) interrupt 3
{  
 TH1=0x3c; // 12 MHz 定时时间是 50 ms
 TL1=0x0b0;

 count++;
 if(count==20)
 {
  if(time>YELLOW) 
  {
   time--;
   if(flag==0)  P1=0x56;
   else P1=0x65; 
  }
  else if(time==1)  
   {
     time=MAX;
     flag=~flag;
   }
   else  
   {  
      time--;
     if(flag==0) P1=0x36;
     else  P1=0x63;
    }
    count=0;
 }
}  

 

经过测试,可以达到效果



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

热门文章 更多
浅谈AVR中定时器几种工作模式