51单片机定时器为什么不能定时2s,定时2s灯就一直不亮


#include "reg52.h"

typedef unsigned int u16;
typedef unsigned char u8;


sbit  LED1=P2^0;
sbit  LED2=P2^1;


void delay_10us(u16 ten_us)
{
            while(ten_us--);
}    

void delay_ms(u16 ms)
{    
        u16 i,j;
        for(i=ms;i>0;i--)
            for(j=110;j>0;j--);
}    

void time0_init(void)
{
        TMOD|=0X01;
        TH0=0xFC;
        TL0=0x66;
        EA=1;
        ET0=1;
        TR0=1;
}    

void time1_init(void)
{
        TMOD|=0X10;
        TH1=0xfe;
        TL1=0x33;
        EA=1;
        ET1=1;
        TR1=1;
}    


void main()
{
            time0_init();
            time1_init();
            while(1)
            {        
                
            }
}

void time0() interrupt    1
{
        static u16 i=0;
        i++;    
        TH0=0xFC;
        TL0=0x66;
        if(i==1000)
        {    
            i=0;
            LED1=!LED1;
        }
}


void time1() interrupt    3
{
        static u16 i=0;
        i++;    
        TH1=0xfe;
        TL1=0x33;
        if(i==1000)
        {    
            i=0;
            LED2=!LED2;
        }
}
 

img


51单片机定时器为什么不能定时2s,定时2s灯就一直不亮

通常2秒定时是在定时期基础上另行计数实现的,比如定时器设置50毫秒那么计数40次就是2秒,定时器初值越小精度越高也越易调整;
开2个定时器直接TMOD=0X11;即可因此可以2个初始设置合并为一个即可.

很久没玩51了有点忘记那些标志位是干啥的了,不过可以给你提供一个isp初始化的定时器函数


void Timer0Init(void)        //1毫秒@12.000MHz
{
    TMOD &= 0xF0;        //设置定时器模式
    TMOD |= 0x01;        //设置定时器模式
    TL0 = 0x18;        //设置定时初值
    TH0 = 0xFC;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    TR0 = 1;        //定时器0开始计时
    ET0=1;//打开定时器0中断允许
    EA=1;//打开总中断
}

还可以给你提供一个思路,用点灯来判断定时器的中断是否触发。如果能够触发那就是if语句的问题;否则,就是定时器初始化的问题啦。