[51单片机] 关于主函数定时刷新问题。

[复制链接]
2625|27
 楼主| 一个小黄人 发表于 2016-8-16 09:17 | 显示全部楼层 |阅读模式


void shijian0() interrupt 1

{        
       TH0 = (65536-200)/256;      // 200us定时
       TL0 = (65536-200)%256;
           BaseTime++;



void main()
{
                Init();                               
                 delay(100);               
                displayAll(0,table,16);
                init_int();
                                
while(1)
        {
        distance();
        clock();
        keyscan();
        turn(temp);
        while(BaseTime<20)        这里我加了个基准时间,主函数在限制时间内刷新一次
                BaseTime=0;
                                       
        }          
}


这个程序跑步起来,为什么呢?我试了很多方法,就是想不懂,原谅我是个小白,大神帮我看看,谢谢。


ningling_21 发表于 2016-8-16 09:54 | 显示全部楼层
怎么跑不起来?
joyme 发表于 2016-8-16 10:46 | 显示全部楼层
能跑起来才怪呢,while(BaseTime<20)BaseTime=0; 这是个死循环
 楼主| 一个小黄人 发表于 2016-8-16 10:52 | 显示全部楼层
joyme 发表于 2016-8-16 10:46
能跑起来才怪呢,while(BaseTime

后来我改成了这样        while(BaseTime<20);       
                                  BaseTime=0;
但是还是不行.........
 楼主| 一个小黄人 发表于 2016-8-16 10:54 | 显示全部楼层

        while(BaseTime<20);       
                BaseTime=0;

就是执行不了主循环中的程序。改了之后还是不行。我想定时刷新主函数,限制while(1)中循环一次的时间。
joyme 发表于 2016-8-16 10:59 | 显示全部楼层
你怎么改的?
joyme 发表于 2016-8-16 11:02 | 显示全部楼层
哦,加了一个";"是吧,那可能是没有进中断,定时器初始化做了没?有没有开中断?
 楼主| 一个小黄人 发表于 2016-8-16 11:03 | 显示全部楼层

        while(BaseTime<20);       
                BaseTime=0;


就是在        while(BaseTime<20)改成        while(BaseTime<20);        ,这样好像有反应,但是效果不明显。大神指点下       
 楼主| 一个小黄人 发表于 2016-8-16 11:06 | 显示全部楼层
joyme 发表于 2016-8-16 11:02
哦,加了一个";"是吧,那可能是没有进中断,定时器初始化做了没?有没有开中断?
...

你看我前面贴的程序,这样不行吗?
kingTek 发表于 2016-8-16 11:07 | 显示全部楼层
本帖最后由 kingTek 于 2016-8-16 11:13 编辑

楼主本意是想降低功耗吧,
应该是灵活运用sleep,或者halt,然后wakeup,
中断初始化做好没,把别的部分都关掉,先确保这个运行正常,

 楼主| 一个小黄人 发表于 2016-8-16 11:11 | 显示全部楼层
kingTek 发表于 2016-8-16 11:07
楼主本意是想降低功耗吧,
但是你程序这么写是达不到目的的,
应该是sleep,或者halt,

不是降低功耗,我是初学者。我案件扫描原本使用delay()延时的,做到后面我发现这种方法非常不好,功能一多,按键经常出问题,我就改成用定时中断去扫描按键,就定义了一个时间基准,while(1)循环一次就扫描一次按键,就出现了现在这些问题.........
ningling_21 发表于 2016-8-16 11:16 | 显示全部楼层
一个小黄人 发表于 2016-8-16 11:06
你看我前面贴的程序,这样不行吗?

while(BaseTime<20);        
                BaseTime=0;

把20改大点试试,例如100

评分

参与人数 1威望 +1 收起 理由
一个小黄人 + 1 很给力!

查看全部评分

joyme 发表于 2016-8-16 11:18 | 显示全部楼层
有反应就可以了,20*200us就是4个ms,效果不明显是什么意思?
当然你还可以在定时器中断里置不同时间间隔的标志,不同的时间间隔执行不同的函数
 楼主| 一个小黄人 发表于 2016-8-16 11:22 | 显示全部楼层

谢谢,好像还是不行。
 楼主| 一个小黄人 发表于 2016-8-16 11:23 | 显示全部楼层
joyme 发表于 2016-8-16 11:18
有反应就可以了,20*200us就是4个ms,效果不明显是什么意思?
当然你还可以在定时器中断里置不同时间间隔的 ...

您能具体说下吗?我没动您说的在定时中置不同时间的时间标志是什么意思
ayb_ice 发表于 2016-8-16 11:25 来自手机 | 显示全部楼层
检查定时器初始化,

评分

参与人数 1威望 +1 收起 理由
一个小黄人 + 1 很给力!

查看全部评分

 楼主| 一个小黄人 发表于 2016-8-16 11:28 | 显示全部楼层
ayb_ice 发表于 2016-8-16 11:25
检查定时器初始化,

/******************中断初始化******/
void init_int()
{
         
    TMOD=0x01;//设置定时器0为工作方式1
        TH0=(65536-200)/256;
        TL0=(65536-200)%256;
        EA=1;//开总中断
        ET0=1;//开定时器0中断
        TR0=1;//启动定时器0

}

/*********定时服务函数********/
void shijian0() interrupt 1
{        
               
                uint second=0 ;       
       TH0 = (65536-200)/256;      // 200ms定时
       TL0 = (65536-200)%256;
           BaseTime++;
}

谢谢,定时初始化没问题。
joyme 发表于 2016-8-16 12:06 | 显示全部楼层
下面是个简单的例子(标志位定位为一个联合体,BaseTime定义为unsigned char型,到255后会自动从0开始计数,也可以人为指定数字清零),就是一个定时器做多个定时用的方法,可以以不同的时间间隔循环执行不同的任务代码
void main(void)
{
      .....
      while(1)
      {
            if(TimeFlag.b16times)
           {
                 TimeFlag.b16times = 0;
                 ......                                  //这里的代码每16*200us会执行一次
           }
            if(TimeFlag.b8times)
           {
                 TimeFlag.b8times = 0;
                 ......                                  //这里的代码每8*200us会执行一次
           }
            if(TimeFlag.b4times)
           {
                 TimeFlag.b4times = 0;
                 ......                                  //这里的代码每4*200us会执行一次
           }

      }
}

void shijian0() interrupt 1
{         
       TH0 = (65536-200)/256;      // 200us定时
       TL0 = (65536-200)%256;
       BaseTime++;
       if((BaseTime & 0x03) == 0)
            TimeFlag.b4times = 1;
      if((BaseTime & 0x07) == 0)
            TimeFlag.b8times = 1;
      if((BaseTime & 0x0f) == 0)
            TimeFlag.b16times = 1;
      .......
}
 楼主| 一个小黄人 发表于 2016-8-16 12:38 | 显示全部楼层
joyme 发表于 2016-8-16 12:06
下面是个简单的例子(标志位定位为一个联合体,BaseTime定义为unsigned char型,到255后会自动从0开始计数, ...

谢谢,我试试。
 楼主| 一个小黄人 发表于 2016-8-16 14:06 | 显示全部楼层
joyme 发表于 2016-8-16 12:06
下面是个简单的例子(标志位定位为一个联合体,BaseTime定义为unsigned char型,到255后会自动从0开始计数, ...

我试了,你这样好像还是会影响到其他函数的运行,因为这样做的话,当3个条件同时达到的时候,就会产生错误。。.....
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

66

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部