//晶振是11.0592Mhz #include <reg52.h>#define s8 signed char#define u8 unsigned char#define u16 unsigned int
sbit D1 = P0^0;//位定义LED0u8 tmr0_value = 1000;//定时器0的初值
void init_tmr0(void);
int main(void){ init_tmr0();//初始化定时器0 while (1); return 0;}
void init_tmr0(void){ TMOD = 0x01;//设置tmr0为工作方式1 EA = 1;//开总中断 ET0 = 1;//开定时器0中断 TH1 = (65536 - tmr0_value) / 16;//得到高8位 TH0 = (65536 - tmr0_value) % 16;//得到低8位 TR0 = 1;//启动定时器0
return;}
//注:定时器溢出后若没重装初值就重新从0开始计数(0—65535)//计数到65536就溢出!void tmr0(void) interrupt 1//定时器0中断{ TR0 = 0;//关闭定时器0 //重新给定时器0赋初值 TH1 = (65536 - tmr0_value) / 16; TH0 = (65536 - tmr0_value) % 16; D1 = !D1;//D1的闪烁速度和tmr0_value的值不匹配 TR0 = 1;//启动定时器0 return;} 现象:人眼可以明显地看见D1的闪烁! 困惑:大家看红色代码tmr0_value = 1000,说明定时器0是大约1ms中断一次,对吧?那么即D1的亮灭状态是1ms变化一次,以这个速度人眼肯定不能看到灯的闪烁的,但我的灯的闪烁状态就很明显。这是为什么呢?大神解释,小弟很痛苦!!!
TH0 = (65536 - tmr0_value) % 16;//得到低8位
这一句都是高位了,写法错误要改成TH0、TL0
tmr0_value的类型不要用char型,用int
可以先看看你的外部的晶振是多大的
再把变量改成int型的