蓝桥杯国信长天单片机实战—交通灯设计

案例:

L1 - 红灯 30s; L2 - 黄灯 3s; L3 - 绿灯 40s。

核心代码


#include "reg52.h"
#define u8  unsigned char
#define u16 unsigned int
#define u32 unsigned long

u8 code LedChar[] = {
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
u8 LedBuff[] = {
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};

u8 T0RH;
u8 T0RL;

bit flag1s = 0;
void CloseFucker();
void ConfigTimer0(u16 ms);
void TrafficLed();
void OpenLed(u8 i);
void main()
{
    EA = 1;
    CloseFucker();
    ConfigTimer0(1);
    P2 = (P2 & 0x1F) | 0x80;
    P0 = 0xFF;
    P2 = 0x00;

    while(1)
    {
        if(flag1s == 1)
        {
            flag1s = 0;
            TrafficLed();
        }
    }

}

void OpenLed(u8 i)//注意里面的移位...
{
    P2 = (P2 & 0x1F) | 0x80;
    P0 = ~(0x01 << (i-1));
    P2 = 0x00;
}

void TrafficLed()
{
    static u8 timer = 0;
    static u8 color = 0; //0-Red; 1-Yellow; 2-Green

    if(timer == 0)
    {
        switch(color)
        {
        case 0:
            color = 1;
            timer = 3;
            OpenLed(2);
            break;
        case 1:
            color = 2;
            timer = 40;
            OpenLed(3);
            break;

        case 2:
            color = 0;
            timer = 30;
            OpenLed(1);
            break;

        default :
            break;
        }
    }
    else
    {
        timer--;
    }

    LedBuff[0] = LedChar[timer%10];
    LedBuff[1] = LedChar[timer/10];

}

void CloseFucker()
{
    P2 = (P2 & 0x1F) | 0xA0;
    P0 = P0 & 0xAF;
    P2 = 0x00;
}

void ConfigTimer0(u16 ms)
{
    u32 tmp;

    tmp = 11059200/12;
    tmp = (tmp*ms)/1000;
    tmp = 65536 - tmp;
    T0RH = (u8)(tmp >> 8);
    T0RL = (u8)tmp;
    TMOD &= 0xF0;
    TMOD |= 0x01;
    TH0 = T0RH;
    TL0 = T0RL;
    ET0 = 1;
    TR0 = 1;
}

void LedScan()
{
    static u8 index;

    P2 = (P2 & 0x1F) | 0xE0;
    P0 = 0xFF;
    P2 = 0x00;

    P2 = (P2 & 0x1F) | 0xC0;
    P0 = 0x80 >> index;
    P2 = 0x00;

    P2 = (P2 & 0x1F) | 0xE0;
    P0 = LedBuff[index];
    P2 = 0x00;

    if(index < 7)
        index++;
    else
        index = 0;
}

void InterruptTimer0() interrupt 1
{
    static u16 tmr1s=0;

    TH0 = T0RH;
    TL0 = T0RL;

    LedScan();

    tmr1s++;
    if(tmr1s == 1000)
    {
        tmr1s = 0;
        flag1s = 1;
    }
}