Mkdm的51单片机学习日记:一个交通灯实例

用LED8和7模拟绿灯,1和2模拟红灯,4和5模拟黄灯

#include <reg52.h>

sbit  ADDR3 = P1^3;
sbit  ENLED = P1^4;

unsigned char code ledChar[] = {  
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char ledBuff[7] = { 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
bit flag1s = 1;          
unsigned char T0RH = 0;  
unsigned char T0RL = 0; 

void configTimer0(unsigned int ms);
void trafficLight();

void main()
{
    EA = 1;      //¿ª×ÜÖжÏ
    ENLED = 0;   //ʹÄÜÊýÂë¹ÜºÍLED
    ADDR3 = 1;
	configTimer0(1);  //ÅäÖÃT0¶¨Ê±1ms
    
    while (1)
    {
        if (flag1s)  
        {
            flag1s = 0;
            trafficLight();
        }
    }
}


void configTimer0(unsigned int ms)
{
    unsigned long tmp;  //
    
    tmp = 11059200 / 12;      
    tmp = (tmp * ms) / 1000;  //¼ÆËãËùÐèµÄ¼ÆÊýÖµ
    tmp = 65536 - tmp;        //¼ÆË㶨ʱÆ÷ÖØÔØÖµ
    tmp = tmp + 13;           //²¹³¥ÖжÏÏìÓ¦ÑÓʱÔì³ÉµÄÎó²î
    T0RH = (unsigned char)(tmp>>8);  //¶¨Ê±Æ÷ÖØÔØÖµ²ð·ÖΪ¸ßµÍ×Ö½Ú
    T0RL = (unsigned char)tmp;
    TMOD &= 0xF0;   //ÇåÁãT0µÄ¿ØÖÆÎ»
    TMOD |= 0x01;   //ÅäÖÃT0Ϊģʽ1
    TH0 = T0RH;     //¼ÓÔØT0ÖØÔØÖµ
    TL0 = T0RL;
    ET0 = 1;        //ʹÄÜT0ÖжÏ
    TR0 = 1;        //Æô¶¯T0
}


void TrafficLight()
{
    static unsigned char color = 0;  //ÑÕÉ«Ë÷Òý£º0-ÂÌÉ«/1-»ÆÉ«/2-ºìÉ«
    static unsigned char timer = 0;  //µ¹¼ÆÊ±¶¨Ê±Æ÷
    
    if (timer == 0) //µ¹¼ÆÊ±µ½0ʱ£¬Çл»½»Í¨µÆ
    {
        switch (color)  //LED8/9´ú±íÂ̵ƣ¬LED5/6´ú±í»ÆµÆ£¬LED2/3´ú±íºìµÆ
        {
            case 0:     //Çл»µ½»ÆÉ«£¬ÁÁ3Ãë
                color = 1;
                timer = 2;
                ledBuff[6] = 0xE7;
                break;
            case 1:     //Çл»µ½ºìÉ«£¬ÁÁ30Ãë
                color = 2;
                timer = 29;
                ledBuff[6] = 0xFC;
                break;
            case 2:     //Çл»µ½ÂÌÉ«£¬ÁÁ40Ãë
                color = 0;
                timer = 39;
                ledBuff[6] = 0x3F;
                break;
            default:
                break;
        }
    }
    else  //µ¹¼ÆÊ±Î´µ½0ʱ£¬µÝ¼õÆä¼ÆÊýÖµ
    {
        timer--;
    }
    ledBuff[0] = ledChar[timer%10];  //µ¹¼ÆÊ±ÊýÖµ¸öλÏÔʾ
    ledBuff[1] = ledChar[timer/10];  //µ¹¼ÆÊ±ÊýֵʮλÏÔʾ
}



void ledScan()
{
	static unsigned char i=0;
	
	P0=0xFF;
	P1=(P1&0xF8)|i;
	P0=ledBuff[i];
	if(i<6)i++;
	else i=0;
	
}



void InterruptTimer0() interrupt 1
{
	static unsigned int tmr1s=0;
	TH0=T0RH;
	TL0=T0RL;
	
	
	ledScan();
	tmr1s++;
	
	if(tmr1s>=1000)
	{
		tmr1s=0;
		flag1s=1;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值