请高手具体解释一下以下51单片机C语言程序:
/*定时器0中断服务子程序,用于实现5ms的延时*/voidtimer()interrupt1using2{Flag_Delay5ms=0;TH0=-5000/256;T...
/*定时器0中断服务子程序,用于实现5ms的延时*/
void timer() interrupt 1 using 2
{
Flag_Delay5ms=0;
TH0=-5000/256;
TL0=-5000%256;
}
/*延时5ms函数,主要利用定时器0实现*/
void Delay5ms(void)
{
TR0=1;
ET0=1;
while(Flag_Delay5ms);
ET0=0;
TR0=0;
Flag_Delay5ms=1;
} 展开
void timer() interrupt 1 using 2
{
Flag_Delay5ms=0;
TH0=-5000/256;
TL0=-5000%256;
}
/*延时5ms函数,主要利用定时器0实现*/
void Delay5ms(void)
{
TR0=1;
ET0=1;
while(Flag_Delay5ms);
ET0=0;
TR0=0;
Flag_Delay5ms=1;
} 展开
2个回答
展开全部
void timer() interrupt 1 using 2//定时器0中断函数,interrupt 1是T0的中断入口
{
Flag_Delay5ms=0;//将 延时5ms 标志位 置为 0,表示5ms结束
TH0=-5000/256;//为T0高8位赋初值,相当于TH0=(65536-5000)/256;可以推出晶振为12MHz
TL0=-5000%256;//为T0低8位赋初值,同上
}
/*延时5ms函数,主要利用定时器0实现*/
void Delay5ms(void)
{
TR0=1;//T0计时开始
ET0=1;//允许T0中断
while(Flag_Delay5ms);//若 延时5ms 标志位 为1,即5ms未结束,则继续等待
ET0=0;//5ms结束,禁止T0中断
TR0=0;//停止T0计时
Flag_Delay5ms=1;//重新将 延时5ms 标志位 置为 1,为下次延时做准备
}
该程序不合理的地方,在等待、及 禁止 T0中断时,停止T0计时前,T0依然在计时,换句话说,下次再启动的初值,已经不是原来设置好的初值了。所以延时误差依然存在。
{
Flag_Delay5ms=0;//将 延时5ms 标志位 置为 0,表示5ms结束
TH0=-5000/256;//为T0高8位赋初值,相当于TH0=(65536-5000)/256;可以推出晶振为12MHz
TL0=-5000%256;//为T0低8位赋初值,同上
}
/*延时5ms函数,主要利用定时器0实现*/
void Delay5ms(void)
{
TR0=1;//T0计时开始
ET0=1;//允许T0中断
while(Flag_Delay5ms);//若 延时5ms 标志位 为1,即5ms未结束,则继续等待
ET0=0;//5ms结束,禁止T0中断
TR0=0;//停止T0计时
Flag_Delay5ms=1;//重新将 延时5ms 标志位 置为 1,为下次延时做准备
}
该程序不合理的地方,在等待、及 禁止 T0中断时,停止T0计时前,T0依然在计时,换句话说,下次再启动的初值,已经不是原来设置好的初值了。所以延时误差依然存在。
展开全部
这个 延时 占用 一个 定时器, 还 不准确
还不如 以下程序:
void Delay5ms(void)
{
unsigned char i,j;
for(i=10;i>0;i--)
{
for(j=250;j>0;j--)
}
}
根据 不同型号的 单片机 调整下 i 、j 的 初始值,如果 是 AT89C51,12M晶振, 这个 值就是对的
i、j 的 值取决于 djnz 这个 指令 的 执行时间, 具体 看 相应 单片机 资料(指令集)里 会有
还不如 以下程序:
void Delay5ms(void)
{
unsigned char i,j;
for(i=10;i>0;i--)
{
for(j=250;j>0;j--)
}
}
根据 不同型号的 单片机 调整下 i 、j 的 初始值,如果 是 AT89C51,12M晶振, 这个 值就是对的
i、j 的 值取决于 djnz 这个 指令 的 执行时间, 具体 看 相应 单片机 资料(指令集)里 会有
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询