怎么用51定时器延时?找了很久,都没有,自己写了个,有问题.

2020-01-27 11:46发布

怎么实现不了呢?帮忙看看多谢!

void timer0_init(void)  
{
TMOD |=0x01;    //MODEL1,timer  
TH0=0xdC;             //定时10ms
  TL0=0x00;
  ET0=1;             //中断使能
TR0=1;                 //关闭定时器0
}

void T0_OverFlow(void) interrupt 1 //定时器0溢出中断,延时10ms
{
TH0=0xDC;
TL0=0x00;
  Time++;
  if(Time==50)
  {
    TR0=0;
     Time=0;
   }

void Delay_s(Uchar Num)
{
    while(TR0==0)
   {
    for(;Num>=0;Num--);
    TR0=1;
   }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
xieguangye2001
1楼-- · 2020-01-27 12:03
定时器做延时一般是为个规避死等。如果你是为了做精确的死等可以这样做
main()
{
定时器初始化();

whlie
{
  .....
......
// 需要延时的位置
延时_s标志 =0;
定时器启动();
while(延时_s标志 ==0);
定时器关闭();
  ......
}
}

定时器中断
{
延时_s标志 = 1;
}

当然你可以把那部分代码写成Delay_s()但要注意参数传递。
信天游
2楼-- · 2020-01-27 12:20
全局中断没打开
1501697860
3楼-- · 2020-01-27 14:48
 精彩回答 2  元偷偷看……
lcw_swust
4楼-- · 2020-01-27 20:41
本帖最后由 lcw_swust 于 2013-6-27 10:08 编辑

逻辑有问题
void Delay_s(Uchar Num)
{
    for(;Num>0;Num--)
   {
    TR0=1;//启动TIMER
    while(TR0==1);//等待TIMER停止
   }
}
还有,Num>=0改为Num>0;因为uchar型数据永远不会小于0
背西风酒旗
5楼-- · 2020-01-27 23:39
加上EA=1
绿茶山人
6楼-- · 2020-01-28 00:53
楼上正解。编程得时候>  >=  <  <=逻辑很重要,到底用哪个要想清楚,不然出了问题不好找

一周热门 更多>