#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;
}
}
通常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语句的问题;否则,就是定时器初始化的问题啦。