这么长的延时,不用循环延时,没实际意义 。单片机在这10s时间里不能做其它事了。要用定时器中断,定时10s。不是很难的,按常规写法,误差+1.6ms。
#include
#defineuchar unsigned char
sbit LED=P1^0;
uchar time;
void initT0( )
{
TMOD = 0x01; //定时器0,工作方式1
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256; //50ms中断一次
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main(void)
{
initT0();
while(1)
if(time==200) //中断200次,10s
{
time=0;
LED=~LED; //P1.0上的LED10s亮或灭一次
}
}
void T0int( ) interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
time++;
}
如果细调定时初值(包括重装),TH0 = (65536-49993)/256;
TL0 = (65536-49993256;
误差可以减小到+0.3ms
取消
评论