请高手具体解释一下以下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;
}
展开
 我来答
烟火夜空
2012-02-19 · TA获得超过6623个赞
知道大有可为答主
回答量:1678
采纳率:93%
帮助的人:566万
展开全部
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依然在计时,换句话说,下次再启动的初值,已经不是原来设置好的初值了。所以延时误差依然存在。
百度网友7f4f28558
2012-02-19 · TA获得超过272个赞
知道小有建树答主
回答量:489
采纳率:0%
帮助的人:237万
展开全部
这个 延时 占用 一个 定时器, 还 不准确
还不如 以下程序:
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 这个 指令 的 执行时间, 具体 看 相应 单片机 资料(指令集)里 会有
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式