关于单片机简单的红绿灯程序问题

2025-02-24 00:17:13
推荐回答(2个)
回答1:

代码修改如下,经keil编译,proteus仿真结果为 P1.0亮10秒,然后P1.1亮2秒,然后P1.2亮10秒,最后P1.0亮10秒,,,

#include 
sbit R=P1^0;//HONG
sbit W=P1^1;//HUANG
sbit L=P1^2;//LV
unsigned int a,b=0;
//unsigned char code c[]={0xfe,0xfc,0xfb};//1110,1100,1011
unsigned char code c[]={0xfe,0xfD,0xfb,0xfd};//1110,1101,1011,1101//红 黄 绿 黄//修正黄灯的值,增加一个状态
void timer10s () interrupt 1
{

 if (a<2000)
    {
        TH0=0xec;//5ms
        TL0=0x78;
        a++;
  //      b=0;//这里不能对b赋值
        TR0=1;
        TR1=0;//【增加】
    }
    if (a>=2000)
    {
        TH0=0xec;
        TL0=0x78;
        a=0;
        b++;//b=1;
        if(b==4) b=0;//【增加】
        TR1=1;
        TR0=0;//【增加】
    }
}
void timer2s ()interrupt 3
{
   
   if (a<400)
    {
        TH1=0xec;
        TL1=0x78;
        a++;
        TR1=1;
        TR0=0;
    }
    if (a>=400)
    {
        TH1=0xec;
        TL1=0x78;
        a=0;
        b++;//b=2;
        //
        if(b==4) b=0;//【增加】
        TR0=1;
        TR1=0;//【增加】
    }
}
void main ()
{
    EA=1;
    ET0=1;
    ET1=1;
    TMOD=0X11;
    TH0=0xec;//5MS
    TL0=0x78;
    TH1=0xec;
    TL1=0x78;
    TR0=1;
    TR1=0;
    P1=c[0];
    b=0;////【增加】
    while (1)
    {
        switch (b)
        {
            case 0x00:P1=c[0];break;
            case 0x01:P1=c[1];break;
            case 0x02:P1=c[2];break;
            case 0x03:P1=c[3];break;//增加一个状态
        }
    }
}

以上代码可以优化,如下:


#include 
sbit R=P1^0;//HONG
sbit W=P1^1;//HUANG
sbit L=P1^2;//LV
unsigned int a,b=0;
unsigned char code c[]={0xfe,0xfD,0xfb,0xfd};
void timer10s () interrupt 1
{
    TH0=0xec;//5ms
    TL0=0x78;
    a++;
    if(TR1==1) TR1=0;

    if (a>=2000)
    {
        a=0;
        b++;
        if(b==4) b=0;
        TR1=1;
        TR0=0;
    }
}
void timer2s ()interrupt 3
{
    TH1=0xec;
    TL1=0x78;
    a++; 
    if(TR0==1) TR0=0;

    if (a>=400)
    {
        a=0;
        b++;
        if(b==4) b=0;
        TR0=1;
        TR1=0;
    }
}
void main ()
{
    EA=1;
    ET0=1;
    ET1=1;
    TMOD=0X11;
    TH0=0xec;//5MS
    TL0=0x78;
    TH1=0xec;
    TL1=0x78;
    TR0=1;
    TR1=0;
    a=0;//
    b=0;//
    while (1)
    {
        switch (b)
        {
            case 0x00:P1=c[0];break;
            case 0x01:P1=c[1];break;
            case 0x02:P1=c[2];break;
            case 0x03:P1=c[3];break;
        }
    }
}

回答2:

有程序流程图吗