找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3889|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)凈水器的程序,新手,搞得無法運(yùn)行,大家指點(diǎn)一下吧

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
20黑幣
第一次自己琢磨著寫程序,估計(jì)差得比較遠(yuǎn)

請(qǐng)大神們指導(dǎo)一下,謝謝

我覺得在架構(gòu)上有為,倒不是細(xì)節(jié)的問題,我理解得太淺了

現(xiàn)在感覺最大的問題是,機(jī)器如果進(jìn)入一個(gè)狀態(tài),怎么樣能讓它在保持運(yùn)行狀態(tài)的同時(shí)循環(huán)閃動(dòng)led,總感覺這兩個(gè)沒法各自運(yùn)行

因?yàn)檫\(yùn)行狀態(tài)是一個(gè)賦值就結(jié)束了,而led的閃動(dòng)需要不斷循環(huán)改變輸出的,這里總有抓不住的感覺

所以,請(qǐng)大家不吝賜教吧,謝謝


單片機(jī)源程序如下:
/*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;   //低壓開關(guān)
sbit HIGH=P2^1;   //高壓開關(guān)
sbit LED1=P1^0;  //沖洗指示燈
sbit LED2=P1^1;   //水滿指示燈
sbit LED3=P1^2;    //缺水指示燈
sbit LED4=P1^3;    //故障指示燈
sbit LED5=P1^4;     //制水指示燈
sbit run=P1^5;     //泵+進(jìn)水閥
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)    //開機(jī)檢測(cè)有無自來水
                        delay_ms(10);  //延時(shí)去抖
                        if(LOW==0)
                        {
                                status=1;        //有水,沖洗
                                aa=0;
                          delay_ms(18000);  //沖洗延時(shí)18秒
                         }
                        
                while(1)
                        {
                          display (qian,bai,shi,ge);
        
                                machine();
                                 
                         if(HIGH==0&LOW==0)   //水桶沒滿,不缺水,則進(jìn)入制水
                           {
                                 status=5;
                                 numx=aa;
                                 TR1=1;    //這個(gè)計(jì)時(shí)器打開,計(jì)算制水運(yùn)行時(shí)間,水滿待機(jī)狀態(tài)就不計(jì)時(shí)了--這里后續(xù)還得增加濾芯使用時(shí)間的計(jì)量
                                 //num=0;
                                 
                                                  if(num==2160)  //連續(xù)6小時(shí)制水進(jìn)入故障
                                                        {
                                                                num=0;
                                  status=4;
                                                         }
                                   
                                                  if(numx==2160)//累計(jì)6小時(shí)制水沖洗一次,或從頭開始執(zhí)行也可以
                                                  {
                                                    numx=0;
                                                          status=1;
                                                  }                                 
                            }
                            else if(LOW==1) //缺水狀態(tài)
                        
                             status=3;
                                         
                                        else if(HIGH==1)  //高壓動(dòng)作,水滿,同時(shí)清零連續(xù)制水6小時(shí)的計(jì)時(shí)數(shù)據(jù),關(guān)閉累計(jì)制水的計(jì)時(shí)器,但是把計(jì)時(shí)數(shù)據(jù)保存起來
                                 {
                            num=0;
                                        aa=numx;
                                        TR1=0;
                            status=2;        
                    }
                        
                                 
          }
         
        }

        void machine()
        {
           while(status==1)//沖洗狀態(tài),水泵和排水閥門打開
                 {
                   run=0;
                         flow=0;
                          if(num1==0)
                                        LED1=~LED1;         
                 }
                 while(status==2)//水滿,待機(jī)狀態(tài),水泵、排水閥門全部關(guān)閉
                 {
                    run=1;
                          flow=1;
                          if(num1==0)
                          LED2=~LED2;
                 }
                 while(status==3)//缺水,待機(jī),水泵和排水閥全部關(guān)閉
                 {
                    run=1;
                          flow=1;
                          if(num1==0)
                          LED3=~LED3;
                 }
                 while(status==4)//故障,就是連續(xù)制水沒有水滿狀態(tài),如果中間有過水滿待機(jī),則這個(gè)故障計(jì)時(shí)清零重新計(jì)算,后續(xù)還會(huì)增加一個(gè)常開觸點(diǎn),閉合后也會(huì)進(jìn)入故障待機(jī)狀態(tài)
                 {
                    run=1;
                         flow=1;
                          if(num1==0)
                          LED4=~LED4;
                 }
                 while(status==5)//正常制水,水泵打開,排水閥關(guān)閉
                 {
                    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)  //每個(gè)中斷是50毫秒,200個(gè)中斷是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)//這里想監(jiān)視一下時(shí)間的,實(shí)際運(yùn)行時(shí)不需要這些顯示
{

        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 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:328014 發(fā)表于 2019-5-20 02:01 | 只看該作者
電路呢?
回復(fù)

使用道具 舉報(bào)

板凳
ID:522450 發(fā)表于 2019-5-20 08:41 | 只看該作者



大致的原理圖,外圍的部件沒有畫出來,就是驅(qū)動(dòng)水泵和排水電磁閥的部分沒有畫出來,大致的原理就是這個(gè)樣子
回復(fù)

使用道具 舉報(bào)

地板
ID:522450 發(fā)表于 2019-5-20 21:55 | 只看該作者
什么情況,我的帖子都沒有人理啊,郁悶了。。。
回復(fù)

使用道具 舉報(bào)

5#
ID:158375 發(fā)表于 2019-5-21 12:56 | 只看該作者
你需要一些標(biāo)志,根據(jù)標(biāo)志來運(yùn)行。。。。。。
回復(fù)

使用道具 舉報(bào)

6#
ID:511890 發(fā)表于 2019-5-21 15:35 | 只看該作者
水泵有單獨(dú)的驅(qū)動(dòng)器么,沒有的話要改下電路。
至于LED單獨(dú)閃爍。講LED等閃爍單獨(dú)做成一個(gè)方法函數(shù)。要用的時(shí)候調(diào)用函數(shù)就行了。
回復(fù)

使用道具 舉報(bào)

7#
ID:447439 發(fā)表于 2022-5-5 22:34 | 只看該作者
幻劍心 發(fā)表于 2019-5-21 15:35
水泵有單獨(dú)的驅(qū)動(dòng)器么,沒有的話要改下電路。
至于LED單獨(dú)閃爍。講LED等閃爍單獨(dú)做成一個(gè)方法函數(shù)。要用的 ...

真是大佬,太牛了。真細(xì)致。這種凈水器的電機(jī)一般都由MCU控制繼電器。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表