注册 登录
编程论坛 单片机编程

关于交通灯控制问题

爱闹的娃 发布于 2011-12-25 13:08, 594 次点击
程序代码:
#include<reg51.h>
#include<intrins.h>
sbit D1=P1^0;         //led灯引脚定义
sbit D2=P1^1;
sbit D3=P1^2;
sbit LS138A=P2^2;      //数码管引脚定义
sbit LS138B=P2^3;
sbit LS138C=P2^4;
void delay(unsigned int i);
unsigned char aa,num,num1,a;
unsigned int LedOut[2];
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};  //0~9数模
void main()
{ unsigned char i;
   TMOD=0x01,TH0=0x3c,TL0=0xb0, EA=1;    //定时器初始化(50ms中断一次)
   ET0=1;
   TR0=1;
   num = 40;
  D1=1;D2=1;D3=0;                         //led灯初始化
   while(1)
   {  num1=num/2;
     LedOut[0]=Disp_Tab[num1/10];
     LedOut[1]=Disp_Tab[num1%10];   
     for( i=0; i<2; i++)  //实现8位动态扫描循环
     {   
      P0 = LedOut[i];  //将字模送到P0口显示
            
      switch(i)      //使用switch 语句控制位选  也可以是用查表的方式 学员可以试着自己修改                 
         {      
           case 0:LS138A=0; LS138B=0; LS138C=0;
                     break;        
           case 1:LS138A=1; LS138B=0; LS138C=0;
                     break;               
         
         }
        
        delay(10);
      }
   
   }
}
void timer0(void) interrupt 1
 {
    TH0=0x3c,TL0=0xb0;
    aa++;
    if(aa == 10)
     {                //如果到了0.5s
          aa = 0;
          num--;   
         if(num <= 6) D1 = ~D1;  //黄灯闪烁                        
         else if(a==2&&num==39)   //变量a是控制不能重如这个通道
           {
            D1 = 1;          //关闭黄灯.
            D2 = 1;          //关闭红灯.
            D3 = 0;          //打开绿灯.
            a=0;
          }
         if(num == 0)            
              {
                D1 = 1;               //关闭黄灯.
                D2 = 0;               //打开红灯.
                D3 = 1;               //关闭绿灯.
                num = 40;            //开始20s倒计时.
                a++;
              }   
    }
}

void delay(unsigned int i)
{
    char j;
    for(i; i > 0; i--)
        for(j = 200; j > 0; j--);
}
这怎么在灯交换时,它的秒数跳得不正常,望高手解决.......谢谢!
0 回复
1