找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1518|回复: 9
打印 上一主题 下一主题
收起左侧

用单片机定时中断做个定时水循环系统,代码不报错,时间和预想的不一样

[复制链接]
跳转到指定楼层
楼主
ID:821461 发表于 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;
        }                        
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:624769 发表于 2022-4-19 21:39 来自手机 | 只看该作者
把定时器设置为10ms,i改成char 定100看看会不会准点
回复

使用道具 举报

板凳
ID:911455 发表于 2022-4-19 22:09 | 只看该作者
用的什么型号的单片机,晶振频率呢?说到底还初值赋的对不对,定义个输出引脚,看下输出周期对不对
回复

使用道具 举报

地板
ID:213173 发表于 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. }
复制代码
回复

使用道具 举报

5#
ID:821461 发表于 2022-4-20 10:01 | 只看该作者
感谢,wulin 、188610329、innere 各位大佬,已经解决了。万分感谢。
回复

使用道具 举报

6#
ID:911455 发表于 2022-4-20 10:13 | 只看该作者
xiaosps 发表于 2022-4-20 10:01
感谢,wulin 、188610329、innere 各位大佬,已经解决了。万分感谢。

别光感谢啊,解决了说说是哪的原因啊?
回复

使用道具 举报

7#
ID:821461 发表于 2022-4-20 17:49 | 只看该作者
innere 发表于 2022-4-20 10:13
别光感谢啊,解决了说说是哪的原因啊?

单片机是51的,晶振是12M,我原来的意思是想水泵工作5分钟,休息30分钟。
代码成功烧录后遇到的问题是,休息时间过长,工作时间太短。
使用的是wulin大佬的办法解决的,我看了下应该是我的判断不对,导致重复判断了。
回复

使用道具 举报

8#
ID:1023659 发表于 2022-5-4 00:20 | 只看该作者
代码主体没问题,就是在判断水泵开关的时候判断反了,beng=1为关,beng=0为开
回复

使用道具 举报

9#
ID:593706 发表于 2022-5-5 17:06 | 只看该作者
用普通的单片机做定时器,不管程序写的多么好,想精确定时是不可能地,这是单片机的硬件和软件同共造成的误差,如果使用外部时钟源,情况就会好很多,我以前用单片机内部中断做过电子钟,每24小时误差随便都在15秒以上,用外部的时钟源配合单片机做的时钟,一个月的误差不超过5秒
回复

使用道具 举报

10#
ID:1026496 发表于 2022-5-15 10:55 | 只看该作者
static u16 i;//定义静态变量i         static u8 j;  //定义秒变量         static u8 k;  //定义分钟变量 中加入Volatile
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表