打印
[51单片机]

关于主函数定时刷新问题。

[复制链接]
2105|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;
但是还是不行.........

使用特权

评论回复
5
一个小黄人|  楼主 | 2016-8-16 10:54 | 只看该作者

        while(BaseTime<20);       
                BaseTime=0;

就是执行不了主循环中的程序。改了之后还是不行。我想定时刷新主函数,限制while(1)中循环一次的时间。

使用特权

评论回复
6
joyme| | 2016-8-16 10:59 | 只看该作者
你怎么改的?

使用特权

评论回复
7
joyme| | 2016-8-16 11:02 | 只看该作者
哦,加了一个";"是吧,那可能是没有进中断,定时器初始化做了没?有没有开中断?

使用特权

评论回复
8
一个小黄人|  楼主 | 2016-8-16 11:03 | 只看该作者

        while(BaseTime<20);       
                BaseTime=0;


就是在        while(BaseTime<20)改成        while(BaseTime<20);        ,这样好像有反应,但是效果不明显。大神指点下       

使用特权

评论回复
9
一个小黄人|  楼主 | 2016-8-16 11:06 | 只看该作者
joyme 发表于 2016-8-16 11:02
哦,加了一个";"是吧,那可能是没有进中断,定时器初始化做了没?有没有开中断?
...

你看我前面贴的程序,这样不行吗?

使用特权

评论回复
10
kingTek| | 2016-8-16 11:07 | 只看该作者
本帖最后由 kingTek 于 2016-8-16 11:13 编辑

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

使用特权

评论回复
11
一个小黄人|  楼主 | 2016-8-16 11:11 | 只看该作者
kingTek 发表于 2016-8-16 11:07
楼主本意是想降低功耗吧,
但是你程序这么写是达不到目的的,
应该是sleep,或者halt,

不是降低功耗,我是初学者。我案件扫描原本使用delay()延时的,做到后面我发现这种方法非常不好,功能一多,按键经常出问题,我就改成用定时中断去扫描按键,就定义了一个时间基准,while(1)循环一次就扫描一次按键,就出现了现在这些问题.........

使用特权

评论回复
12
ningling_21| | 2016-8-16 11:16 | 只看该作者
一个小黄人 发表于 2016-8-16 11:06
你看我前面贴的程序,这样不行吗?

while(BaseTime<20);        
                BaseTime=0;

把20改大点试试,例如100

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
一个小黄人 + 1 很给力!
13
joyme| | 2016-8-16 11:18 | 只看该作者
有反应就可以了,20*200us就是4个ms,效果不明显是什么意思?
当然你还可以在定时器中断里置不同时间间隔的标志,不同的时间间隔执行不同的函数

使用特权

评论回复
14
一个小黄人|  楼主 | 2016-8-16 11:22 | 只看该作者

谢谢,好像还是不行。

使用特权

评论回复
15
一个小黄人|  楼主 | 2016-8-16 11:23 | 只看该作者
joyme 发表于 2016-8-16 11:18
有反应就可以了,20*200us就是4个ms,效果不明显是什么意思?
当然你还可以在定时器中断里置不同时间间隔的 ...

您能具体说下吗?我没动您说的在定时中置不同时间的时间标志是什么意思

使用特权

评论回复
16
ayb_ice| | 2016-8-16 11:25 | 只看该作者
检查定时器初始化,

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
一个小黄人 + 1 很给力!
17
一个小黄人|  楼主 | 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++;
}

谢谢,定时初始化没问题。

使用特权

评论回复
18
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;
      .......
}

使用特权

评论回复
19
一个小黄人|  楼主 | 2016-8-16 12:38 | 只看该作者
joyme 发表于 2016-8-16 12:06
下面是个简单的例子(标志位定位为一个联合体,BaseTime定义为unsigned char型,到255后会自动从0开始计数, ...

谢谢,我试试。

使用特权

评论回复
20
一个小黄人|  楼主 | 2016-8-16 14:06 | 只看该作者
joyme 发表于 2016-8-16 12:06
下面是个简单的例子(标志位定位为一个联合体,BaseTime定义为unsigned char型,到255后会自动从0开始计数, ...

我试了,你这样好像还是会影响到其他函数的运行,因为这样做的话,当3个条件同时达到的时候,就会产生错误。。.....

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

66

帖子

1

粉丝