找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机净水器的程序,新手,搞得无法运行,大家指点一下吧

[复制链接]
跳转到指定楼层
楼主
20黑币
第一次自己琢磨着写程序,估计差得比较远

请大神们指导一下,谢谢

我觉得在架构上有为,倒不是细节的问题,我理解得太浅了

现在感觉最大的问题是,机器如果进入一个状态,怎么样能让它在保持运行状态的同时循环闪动led,总感觉这两个没法各自运行

因为运行状态是一个赋值就结束了,而led的闪动需要不断循环改变输出的,这里总有抓不住的感觉

所以,请大家不吝赐教吧,谢谢


单片机源程序如下:
/*Main.c file generated by New Project wizard
*
* Created:   4 17 2019
* Processor: 89C52
* Compiler:  Keil for 89C52
****/

#include <reg52.h>
#include <stdio.h>
#include "main.h"
#include "delay.h"
void machine();
sbit LOW=P2^0;   //低压开关
sbit HIGH=P2^1;   //高压开关
sbit LED1=P1^0;  //冲洗指示灯
sbit LED2=P1^1;   //水满指示灯
sbit LED3=P1^2;    //缺水指示灯
sbit LED4=P1^3;    //故障指示灯
sbit LED5=P1^4;     //制水指示灯
sbit run=P1^5;     //泵+进水阀
sbit flow=P1^6;    //排水阀
sbit dula=P2^6;
sbit wela=P2^7;
void display(uchar,uchar,uchar,uchar);
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

uchar num1,num2,qian,bai,shi,ge,shine,LED,status;
uint num,numx,aa;

void main()
{
                                TMOD=0X11;
        TH0=(65536-45872)/256;
        TL0=(65536-45872)%256;
        TH1=(65536-45872)/256;
        TL1=(65536-45872)%256;
        EA=1;
        ET0=1;
        ET1=1;
        TR0=1;

              num=0;
        
         
            if(LOW==0)    //开机检测有无自来水
                        delay_ms(10);  //延时去抖
                        if(LOW==0)
                        {
                                status=1;        //有水,冲洗
                                aa=0;
                          delay_ms(18000);  //冲洗延时18秒
                         }
                        
                while(1)
                        {
                          display (qian,bai,shi,ge);
        
                                machine();
                                 
                         if(HIGH==0&LOW==0)   //水桶没满,不缺水,则进入制水
                           {
                                 status=5;
                                 numx=aa;
                                 TR1=1;    //这个计时器打开,计算制水运行时间,水满待机状态就不计时了--这里后续还得增加滤芯使用时间的计量
                                 //num=0;
                                 
                                                  if(num==2160)  //连续6小时制水进入故障
                                                        {
                                                                num=0;
                                  status=4;
                                                         }
                                   
                                                  if(numx==2160)//累计6小时制水冲洗一次,或从头开始执行也可以
                                                  {
                                                    numx=0;
                                                          status=1;
                                                  }                                 
                            }
                            else if(LOW==1) //缺水状态
                        
                             status=3;
                                         
                                        else if(HIGH==1)  //高压动作,水满,同时清零连续制水6小时的计时数据,关闭累计制水的计时器,但是把计时数据保存起来
                                 {
                            num=0;
                                        aa=numx;
                                        TR1=0;
                            status=2;        
                    }
                        
                                 
          }
         
        }

        void machine()
        {
           while(status==1)//冲洗状态,水泵和排水阀门打开
                 {
                   run=0;
                         flow=0;
                          if(num1==0)
                                        LED1=~LED1;         
                 }
                 while(status==2)//水满,待机状态,水泵、排水阀门全部关闭
                 {
                    run=1;
                          flow=1;
                          if(num1==0)
                          LED2=~LED2;
                 }
                 while(status==3)//缺水,待机,水泵和排水阀全部关闭
                 {
                    run=1;
                          flow=1;
                          if(num1==0)
                          LED3=~LED3;
                 }
                 while(status==4)//故障,就是连续制水没有水满状态,如果中间有过水满待机,则这个故障计时清零重新计算,后续还会增加一个常开触点,闭合后也会进入故障待机状态
                 {
                    run=1;
                         flow=1;
                          if(num1==0)
                          LED4=~LED4;
                 }
                 while(status==5)//正常制水,水泵打开,排水阀关闭
                 {
                    run=0;
                          flow=1;
                         if(num1==0)
                          LED5=~LED5;
                 }
        }

   void T0_time() interrupt 1
      {
            TH0=(65536-45872)/256;
            TL0=(65536-45872)%256;
            num1++;
                                if(num1==10)
                                {
                                        num1=0;
                                }
           }

    void T1_time() interrupt 3
         {
               TH1=(65536-45872)/256;
         TL1=(65536-45872)%256;
               num2++;
                     if(num2==200)  //每个中断是50毫秒,200个中断是10秒
                                  {
                                        num2=0;
                                        numx++;
                                  num++;
                                        qian=numx/1000;
                                                bai=numx%1000/100;
                                                 shi=numx%100/10;
                                                   ge=numx%10;
                                  }
                }
        void display(char qian,uchar bai,uchar shi,uchar ge)//这里想监视一下时间的,实际运行时不需要这些显示
{

        dula=1;
        P0=table[qian];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfe;
        wela=0;
        delay_ms(3);
        
        dula=1;
        P0=table[bai];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfd;
        wela=0;
        delay_ms(3);
        
        dula=1;
        P0=table[shi];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfb;
        wela=0;
        delay_ms(3);
        
        dula=1;
        P0=table[ge];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xf7;
        wela=0;
        delay_ms(3);
        
}



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

使用道具 举报

沙发
ID:328014 发表于 2019-5-20 02:01 | 只看该作者
电路呢?
回复

使用道具 举报

板凳
ID:522450 发表于 2019-5-20 08:41 | 只看该作者



大致的原理图,外围的部件没有画出来,就是驱动水泵和排水电磁阀的部分没有画出来,大致的原理就是这个样子
回复

使用道具 举报

地板
ID:522450 发表于 2019-5-20 21:55 | 只看该作者
什么情况,我的帖子都没有人理啊,郁闷了。。。
回复

使用道具 举报

5#
ID:158375 发表于 2019-5-21 12:56 | 只看该作者
你需要一些标志,根据标志来运行。。。。。。
回复

使用道具 举报

6#
ID:511890 发表于 2019-5-21 15:35 | 只看该作者
水泵有单独的驱动器么,没有的话要改下电路。
至于LED单独闪烁。讲LED等闪烁单独做成一个方法函数。要用的时候调用函数就行了。
回复

使用道具 举报

7#
ID:447439 发表于 2022-5-5 22:34 | 只看该作者
幻剑心 发表于 2019-5-21 15:35
水泵有单独的驱动器么,没有的话要改下电路。
至于LED单独闪烁。讲LED等闪烁单独做成一个方法函数。要用的 ...

真是大佬,太牛了。真细致。这种净水器的电机一般都由MCU控制继电器。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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