标题: 用单片机定时中断做个定时水循环系统,代码不报错,时间和预想的不一样 [打印本页]

作者: xiaosps    时间: 2022-4-19 19:07
标题: 用单片机定时中断做个定时水循环系统,代码不报错,时间和预想的不一样
求帮助!我用定时中断做个定时水循环系统,代码没报错,但是关水泵的时间和预想的不一样,请教大佬,我哪里弄错了原定计划是:5分钟开, 30分钟关,这样一直循环。
void time0_init(void)
{
        TMOD|=0X01;//选择为定时器0模式,工作方式1
        TH0=0XFC;        //给定时器赋初值,定时1ms
        TL0=0X18;        
        ET0=1;//打开定时器0中断允许
        EA=1;//打开总中断
        TR0=1;//打开定时器               
}
void main()
{        
        time0_init();//定时器0中断配置
//        beng=0;
        while(1)
        {                        

        }               
}


void time0() interrupt 1 //定时器0中断函数
{
        static u16 i;//定义静态变量i
        static u8 j;  //定义秒变量
        static u8 k;  //定义分钟变量
        TH0=0XFC;        //给定时器赋初值,定时1ms
        TL0=0X18;
        i++;
        if(i==1000)                  //一秒的计时
        {
                i=0;
                j++;
        }               
        if(j==60)                  //一分钟的计时
        {
                k++;
                j=0;
                i=0;
        }        
        if(k==5 && beng==0)          //到了5分钟,并且水泵打开的情况下
        {
                beng=1;                          //关闭水泵
                k=0;
                i=0;
                j=0;
        }
        if(k==30 && beng==1)          //到了30分钟,并且水泵关闭的情况下
        {
                beng=0;                          //打开水泵
                k=0;
                i=0;
                j=0;
        }                        
}



作者: 188610329    时间: 2022-4-19 21:39
把定时器设置为10ms,i改成char 定100看看会不会准点
作者: innere    时间: 2022-4-19 22:09
用的什么型号的单片机,晶振频率呢?说到底还初值赋的对不对,定义个输出引脚,看下输出周期对不对
作者: wulin    时间: 2022-4-20 05:37
  1. void time0() interrupt 1 //定时器0中断函数
  2. {
  3.         static u16 i;//定义静态变量i
  4.         static u8 j;  //定义秒变量
  5.         static u8 k;  //定义分钟变量
  6.         TH0=0XFC;        //给定时器赋初值,定时1ms
  7.         TL0=0X18;
  8.         i++;
  9.         if(i==1000)                  //一秒的计时
  10.         {
  11.                 i=0;
  12.                 j++;               
  13.                 if(j==60)                  //一分钟的计时
  14.                 {
  15.                         j=0;
  16.                         k++;
  17.                         if(k==35)k=0;               
  18.                 }               
  19.         }
  20.         if(k<5)beng=0;  //打开水泵
  21.         if(k>=5)beng=1; //关闭水泵
  22. }
复制代码

作者: xiaosps    时间: 2022-4-20 10:01
感谢,wulin 、188610329、innere 各位大佬,已经解决了。万分感谢。
作者: innere    时间: 2022-4-20 10:13
xiaosps 发表于 2022-4-20 10:01
感谢,wulin 、188610329、innere 各位大佬,已经解决了。万分感谢。

别光感谢啊,解决了说说是哪的原因啊?
作者: xiaosps    时间: 2022-4-20 17:49
innere 发表于 2022-4-20 10:13
别光感谢啊,解决了说说是哪的原因啊?

单片机是51的,晶振是12M,我原来的意思是想水泵工作5分钟,休息30分钟。
代码成功烧录后遇到的问题是,休息时间过长,工作时间太短。
使用的是wulin大佬的办法解决的,我看了下应该是我的判断不对,导致重复判断了。
作者: seaciel    时间: 2022-5-4 00:20
代码主体没问题,就是在判断水泵开关的时候判断反了,beng=1为关,beng=0为开
作者: lsgzq    时间: 2022-5-5 17:06
用普通的单片机做定时器,不管程序写的多么好,想精确定时是不可能地,这是单片机的硬件和软件同共造成的误差,如果使用外部时钟源,情况就会好很多,我以前用单片机内部中断做过电子钟,每24小时误差随便都在15秒以上,用外部的时钟源配合单片机做的时钟,一个月的误差不超过5秒
作者: yaoyao2022    时间: 2022-5-15 10:55
static u16 i;//定义静态变量i         static u8 j;  //定义秒变量         static u8 k;  //定义分钟变量 中加入Volatile




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