打印

关于单片机定时器的问题

[复制链接]
1886|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bingshuixichen|  楼主 | 2013-8-23 10:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠,我定时器计时60秒,如果显示一个60秒计时器,可以正常显示,我在时基函数加了一个count1,果显示两个定时器,这时候两个计时器只显示偶数,请教各位大侠是什么原因啊 程序如下:
void dis_time()
{
         
          uchar i;
                 if(count>=10000)
        {
                count=0;
                sec1++;
                if(sec1>59)
                {
                        sec1=0;
                        min1++;
                        if(min1>59)
                        {
                                min1=0;
                                hou1++;
                                if(hou>23)
                                {
                                        hou=0;
                                }  
                        }
                }
        }
        tab[6]=sec1/10;
        tab[7]=sec1%10;
        tab[3]=min1/10;
        tab[4]=min1%10;
        tab[0]=hou1/10;
        tab[1]=hou1%10;
        write_cmd(0x88);                                           //设置指针地址为第一行第五个位置
        for(i=0;i<8;i++)
        {
                write_dat(tab1[tab[i]]);
        }

}  
void dis_time1()
{
         
          uchar i;
                 if(count1>=10000)
        {
                count1=0;
                sec1++;
                if(sec1>59)
                {
                        sec1=0;
                        min1++;
                        if(min1>59)
                        {
                                min1=0;
                                hou1++;
                                if(hou>23)
                                {
                                        hou=0;
                                }  
                        }
                }
        }
        tab[6]=sec1/10;
        tab[7]=sec1%10;
        tab[3]=min1/10;
        tab[4]=min1%10;
        tab[0]=hou1/10;
        tab[1]=hou1%10;
        write_cmd(0x98);                                           //设置指针地址为第一行第五个位置
        for(i=0;i<8;i++)
        {
                write_dat(tab1[tab[i]]);
        }

}
main()
{
   lcd_init();
        while(1)
   {

        dis_time();
//        dis_time1();

        }
}

void timer0() interrupt 1
{
        TH0=(65536-100)/256; //100us定时
        TL0=(65536-100)%256;
        count++;
        count1++;
       
}
如何把其中任意一个显示去掉,就可以正常工作,请教各位是什么原因?

相关帖子

沙发
ayb_ice| | 2013-8-23 10:40 | 只看该作者
对count,count1的读写必须满足原子操作

使用特权

评论回复
板凳
joyme| | 2013-8-23 10:53 | 只看该作者
程序写得不好
1、显示刷新不需要这么频繁,有变化时才需要写(if(count > 10000)把写的内容也包含了),或定时刷新
2、sec、min、hour没有必要用全局变量(两个显示函数用的是一样的变量如果时间不同步就会导致显示错误)

使用特权

评论回复
地板
bingshuixichen|  楼主 | 2013-8-23 11:08 | 只看该作者
joyme 发表于 2013-8-23 10:53
程序写得不好
1、显示刷新不需要这么频繁,有变化时才需要写(if(count > 10000)把写的内容也包含了),或定 ...

按照你说的,时间显示正确啦,但是刷新的频率怎么改呢?能不能帮忙改一下上面的程序?谢谢啦

使用特权

评论回复
5
joyme| | 2013-8-23 11:21 | 只看该作者
把写显示代码放在if条件里,就已经是定时刷新了,即1s刷新一次
如果是动态扫描的显示设备,一般要求刷新率大于50hz,那么可以没10ms调用一次你的显示子函数
比如if((count & 0x7f) == 0)dis_time(); 就是每12.8ms刷新一次

使用特权

评论回复
6
bingshuixichen|  楼主 | 2013-8-23 13:58 | 只看该作者
joyme 发表于 2013-8-23 11:21
把写显示代码放在if条件里,就已经是定时刷新了,即1s刷新一次
如果是动态扫描的显示设备,一般要求刷新率 ...

不好意思,我还是不太懂,你说每12.8ms刷新我明白,把写显示代码放到if条件里,不太懂?我上面刷新不是1秒吗?

使用特权

评论回复
7
xiaoliping1945| | 2013-8-23 14:36 | 只看该作者
请问你这定时也太短了吧?作为60秒的计数器,你定时才0.1ms??弄个50ms最合适,这些子函数可以在50ms内处理完,并且把处理时间的子函数放中断里去,而且处理时间别超过你定时的时间,不然会有点错乱。把100改成50000吧,就是50ms。

使用特权

评论回复
8
bingshuixichen|  楼主 | 2013-8-23 15:17 | 只看该作者
xiaoliping1945 发表于 2013-8-23 14:36
请问你这定时也太短了吧?作为60秒的计数器,你定时才0.1ms??弄个50ms最合适,这些子函数可以在50ms内处理 ...

我还要输出一个1K的PWM,定时小一点

使用特权

评论回复
9
tergy2012| | 2013-8-23 16:10 | 只看该作者
路过学习的

使用特权

评论回复
10
NE5532| | 2013-8-23 16:44 | 只看该作者
显示偶数的时候,是2秒变1次还是1秒变1次?

使用特权

评论回复
11
opal11| | 2013-8-23 23:51 | 只看该作者
这定时做的,肯这不准,100us定时太小,定时值小,时间误差就大,如要输出PWM,可以开另一个定时器或用带PWM输出的片子。

使用特权

评论回复
12
guangbiao| | 2013-8-29 16:15 | 只看该作者
这程序够BT的。。。把刷新显示的代码放进去IF里面就好了。。。估计你的不是动态显示。。。不然你就回听懂上面人说的啦。。

使用特权

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

本版积分规则

7

主题

27

帖子

1

粉丝