标题: 单片机定时器延时哪里不对? [打印本页]

作者: hjx5548    时间: 2021-9-26 19:52
标题: 单片机定时器延时哪里不对?
unsigned long SysTick;


void Timer0Init(void)                //20毫秒@12.000MHz
{
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0xE0;                //设置定时初始值
        TH0 = 0xB1;                //设置定时初始值
//        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        ET0=1;
        EA=1;
}

timer0() interrupt 1
{
          TL0 = 0xE0;                //设置定时初始值
        TH0 = 0xB1;                //设置定时初始值      
        SysTick++;      
}

void Delay_20ms(unsigned int var)
{
    unsigned long i;

        i = SysTick;

        while(SysTick-i < var)
        {
                                SysTick=0;        
       ;
        }   
}

void main()
{
shui=0;re=1;

        Timer0Init();

while(1)
{
if(key1==0)
{
        
                Delay_20ms(5);
  shui=0;
        //        delay(2000);
  Delay_20ms(5);
re=1;

               
}
else
  {

                Delay_20ms(500);
         shui=1;
                //delay(2000);
  Delay_20ms(50);
    re=0;

}
}
}



作者: lkc8210    时间: 2021-9-26 22:57
        while(SysTick-i < var)
        {
                                SysTick=0;        //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       ;
        }   
作者: yzwzfyz    时间: 2021-9-27 10:45
while(SysTick-i < var)
         {
                                 SysTick=0;        
        ;
         }   
这个函数何,进去后SysTick被清0,还能出来吗?
作者: npn    时间: 2021-9-27 11:18
8位单片机下,中断和main被调用的函数,同时读写int/long/float等全局变量会出错(bit/char除外)。
16位int全局变量,高8位已经赋值进去,此时触发中断,中断内操作该变量的值,中断返回后再去赋值低8位,导致问题出现,并且编译器也发现不了。
作者: tcc8266    时间: 2021-9-27 11:48
         while(SysTick-i < var)         {                                 SysTick=0;        //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<        ;         }   




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1