使用定时器控制流水灯和呼吸灯的51单片机程序详解

让LED从L1开始流到L8,(间隔1S,使用定时器)然后全灭LED,然后从L1开始进行呼吸灯状态。之后L1,L3,L5,L7点亮,然后L2,L4,L6,L8点亮。最后所有LED全亮

#include <REGX52.H>
#include<INTRINS.H>

sbit LED = P2 ^ 0;

unsigned int TOTOTO = 0;
int number = 0;
unsigned int Time;
unsigned int i;

//配置定时器
void Timer0Init(void)        //定时器1ms@12.000MHz
{

    TMOD &= 0xF0;        //工作模式寄存器TMOD配置 只配置了定时器0
    TMOD |= 0x01;       // TCON控制寄存器配置中TF1和TR1是定时器1,TF0和TR0是定时器0
    TL0 = 0x18;            //是低位寄存器赋初值 提升计数器初始时间
    TH0 = 0xFC;            //是高位寄存器赋初值  提升计数器初始时间
    TF0 = 0;            //等于1是产生中断,清零
    TR0 = 1;            //等于1是定时器0开启
    ET0 = 1;            //等于1是中断路线连接
    EA = 1;                //等于1是中断路线中开关连接
    PT0 = 0;            //等于0是默认等于0 开关拨下 联通
}

//延时函数
void Delay(unsigned int t)
{
    while (t–);
}
//主函数
void main()
{

    Timer0Init();

    while (1)
    {

    }

}

//定时器0的中断程序 
void Timer0_Routine() interrupt 1  //中断号
{

    TL0 = 0x18;            //计数器溢出归0 重新给计数器赋初值
    TH0 = 0xFC;
    TOTOTO++;            //进入中断的次数,1ms进入1次 

    switch (TOTOTO)        //用定时器每隔1s LED灯流水
    {
    case 1000:P2 = ~(0x01 << 0);
        break;
    case 2000:P2 = ~(0x01 << 1);
        break;
    case 3000:P2 = ~(0x01 << 2);
        break;
    case 4000:P2 = ~(0x01 << 3);
        break;
    case 5000:P2 = ~(0x01 << 4);
        break;
    case 6000:P2 = ~(0x01 << 5);
        break;
    case 7000:P2 = ~(0x01 << 6);
        break;
    case 8000:P2 = ~(0x01 << 7);
        break;
    }

    //    if(TOTOTO>=1000)
    //    {
    //        
    //        
    //        TOTOTO=0;
    //        P2=~(0x01<<number);
    //        number++;
    //    }

    if (TOTOTO == 9000)        //第九秒LED灯全灭
    {

        P2 = 0xFF;

    }

    if (TOTOTO == 10000)    //第10秒LED1呼吸
    {

        for (Time = 0; Time < 50; Time++)//不断改变占空比
        {
            for (i = 0; i < 20; i++)//延长波形变化
            {
                LED = 0;
                Delay(Time);
                LED = 1;
                Delay(50 – Time);
            }
        }
        for (Time = 50; Time > 0; Time–)//从后往前报数
        {
            for (i = 0; i < 20; i++)
            {
                LED = 0;
                Delay(Time);
                LED = 1;
                Delay(50 – Time);
            }
        }
    }
    if (TOTOTO == 11000)//第11秒1357灯亮
    {
        P2 = 0x55;
    }
    if (TOTOTO == 12000)//第12秒2468灯亮
    {
        P2 = 0xAA;
    }

 if (TOTOTO == 13000)//第13秒灯全亮
    {
        P2 = 0x00;
    }

}
 

物联沃分享整理
物联沃-IOTWORD物联网 » 使用定时器控制流水灯和呼吸灯的51单片机程序详解

发表评论