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

QQ登錄

只需一步,快速開始

搜索
查看: 14439|回復(fù): 19
收起左側(cè)

魚缸自動(dòng)控制系統(tǒng)設(shè)計(jì)與制作(帶自動(dòng)喂魚)附單片機(jī)程序電路圖

  [復(fù)制鏈接]
ID:171111 發(fā)表于 2019-3-30 19:21 | 顯示全部樓層 |閱讀模式
經(jīng)常好幾天不在家,一直想做一個(gè)自動(dòng)喂魚的東西,在網(wǎng)上找了很久,就看到一個(gè)用15F104W單片機(jī) 只用定時(shí)器功能定時(shí)震動(dòng)下魚食的,不太喜歡,今天給大家分享一個(gè)我自己設(shè)計(jì)制作,還算比較滿意的小作品。
第一次發(fā)帖 不太會(huì)啊……

制作出來(lái)的實(shí)物圖如下:
2019_03_30_19_23_IMG_0665.JPG 2019_03_19_12_01_IMG_0639.JPG

電路原理圖如下:
2019_03_30_18_37_IMG_0663.JPG

引腳分配    lcd    lcddata:    P0
            lcd_e:        P2^7
            lcd_rs:        P2^6
            lcd_rw:        P2^5
        
        設(shè)置按鍵    limit_choise:        P    //溫度上下限選擇按鍵
                increase_temperature        P    //增加溫度限值按鍵
                reduce_temperature        P    //減少溫度限值按鍵
        
        蜂鳴器報(bào)警    warning        P   

        溫度傳感器    temperature_sensor    P

        制熱    heatting    P

        制冷    refrigerating    P

        LED顯示        normal        P    //正常溫度指示燈
                high_temperature    P    //高溫指示燈
                low_temperature        P    //低溫指示燈   

制作過程圖片:
2019_03_19_10_40_IMG_0638.JPG 2019_03_13_14_03_IMG_0625.jpg 2019_03_13_14_03_IMG_0624.jpg 2019_03_13_13_04_IMG_0623.JPG 2019_03_13_13_04_IMG_0622.JPG

單片機(jī)源程序如下:
  1. #include <main.h>

  2. void DelayUs(unsigned char tu)
  3. {
  4.         while(--tu);
  5. }

  6. void DelayMs(unsigned char tm)
  7. {
  8.         while(tm--)
  9.         {
  10.                 DelayUs(248);
  11.                 DelayUs(248);
  12.         }
  13. }

  14. void dianji()                         //喂魚
  15. {
  16.         unsigned int i;
  17.         speed=10;
  18.         i=3000;
  19.         while(i--)
  20.         {        
  21.                 A_ON
  22.                 DelayMs(speed);               
  23.                 AB_ON
  24.                 DelayMs(speed);
  25.                 B_ON
  26.                 DelayMs(speed);
  27.                 BC_ON
  28.                 DelayMs(speed);
  29.                 C_ON
  30.                 DelayMs(speed);                        
  31.                 CD_ON
  32.                 DelayMs(speed);
  33.                 D_ON
  34.                 DelayMs(speed);                                
  35.                 DA_ON
  36.                 DelayMs(speed);        
  37.         }
  38.         ABCD_OFF
  39. }
  40. void dianji_shoudong()                         //手動(dòng)喂魚
  41. {
  42.         unsigned int i;
  43.         speed=10;
  44.         i=500;
  45.         while(i--)
  46.         {        
  47.                 A_ON
  48.                 DelayMs(speed);               
  49.                 AB_ON
  50.                 DelayMs(speed);
  51.                 B_ON
  52.                 DelayMs(speed);
  53.                 BC_ON
  54.                 DelayMs(speed);
  55.                 C_ON
  56.                 DelayMs(speed);                        
  57.                 CD_ON
  58.                 DelayMs(speed);
  59.                 D_ON
  60.                 DelayMs(speed);                                
  61.                 DA_ON
  62.                 DelayMs(speed);        
  63.         }
  64.         ABCD_OFF
  65. }
  66. void Timer0Init()
  67. {
  68.         TMOD|=0X01;
  69.         TH0=0xB8;        //11.0592M晶振 定時(shí)20ms
  70.         TL0=0x00;
  71.         ET0=1;
  72.         EA=1;
  73.         TR0=1;
  74. }

  75. void main()//主函數(shù)
  76. {
  77.         init();//初始化函數(shù)
  78.         K1=1;
  79.         XIAODU=1;
  80.         YANGQI=1;
  81.         BENG=1;
  82.         Timer0Init();
  83.   while(1)
  84.         {
  85.                 temp_control();//控制按鍵函數(shù)
  86.                 unnormal_proccessing(get_temp(Ds18b20ReadTemp()),up_limit_temp,down_limit_temp);//恒溫控制函數(shù)
  87.                 if((h==0)&(m==0)&(s==5))BENG=0; if((h==3)&(m==0)&(s==0))BENG=1;
  88.                 if((h==4)&(m==0)&(s==0))BENG=0; if((h==7)&(m==0)&(s==0))BENG=1;
  89.                 if((h==8)&(m==0)&(s==0))BENG=0; if((h==11)&(m==0)&(s==0))BENG=1;
  90.                 if(BENG==1)
  91.                 {
  92.                         YANGQI=0;
  93.                         XIAODU=1;
  94.                 }
  95.                 else
  96.                 {
  97.                         YANGQI=1;
  98.                         XIAODU=0;
  99.                 }
  100.                 if((h==6)&(m==0)&(s==0))
  101.                 {
  102.                         dianji();
  103.                 }
  104.                 if(K1==0)
  105.                 {
  106.                         DelayMs(20);
  107.                         if(K1==0)
  108.                         {
  109.                                 dianji_shoudong();
  110.                         }
  111.                 }
  112.         }               
  113. }

  114. void init()//初始化函數(shù)
  115. {
  116.         uint i,j;
  117.         //函數(shù)初始化
  118.         LcdInit();//LCD初始化函數(shù)
  119.         Ds18b20Init();
  120.         
  121.         //I/O口初始化
  122.         heatting=1;//不制熱
  123.         refrigerating=1;//不制冷
  124.         normal=1;//正常溫度指示燈不顯示
  125.         unnormal=1;//不正常溫度指示燈不顯示
  126.         warning=1;//蜂鳴器不報(bào)警
  127.         
  128.         //LCD初始化顯示
  129.         LcdWriteCom(0x80);//第一行顯示
  130.         j=strlen(num1);
  131.         for(i=0; i<j; i++)
  132.         {
  133.                 LcdWriteData(num1[i]);        
  134.                 delay_ms(1);
  135.         }
  136.         LcdWriteCom(0x80+0x40);//第二行顯示
  137.         j=strlen(num2);
  138.         for(i=0; i<j; i++)
  139.         {
  140.                 LcdWriteData(num2[i]);        
  141.                 delay_ms(1);
  142.         }
  143.         LcdWriteCom(0x04);  //關(guān)閉寫一個(gè)指針加1
  144. }

  145. uint get_temp(uint temp)//計(jì)算溫度函數(shù)
  146. {
  147.         float tp;
  148.         
  149.         tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
  150.         //如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
  151.         temp=tp*0.0625*100+0.5;        
  152.         //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
  153.         //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
  154.         //算加上0.5,還是在小數(shù)點(diǎn)后面。
  155.         return temp;
  156. }

  157. void display_real_tenp(uint temp)//實(shí)時(shí)溫度顯示函數(shù)
  158. {
  159.         uchar datas[] = {0, 0, 0, 0}; //定義數(shù)組

  160.         datas[0] = temp % 10000 / 1000;
  161.         datas[1] = temp % 1000 / 100;
  162.         datas[2] = temp % 100 / 10;
  163.         datas[3] = temp % 10;

  164.         LcdWriteCom(0x80+0x0a);                 //寫地址 80表示初始地址
  165.         LcdWriteData('0'+datas[0]); //十位

  166.         LcdWriteCom(0x80+0x0b);        //寫地址 80表示初始地址
  167.         LcdWriteData('0'+datas[1]); //個(gè)位

  168.         LcdWriteCom(0x80+0x0d);         //寫地址 80表示初始地址
  169.         LcdWriteData('0'+datas[2]); //顯示小數(shù)點(diǎn)  

  170.         LcdWriteCom(0x80+0x0e);                 //寫地址 80表示初始地址
  171.         LcdWriteData('0'+datas[3]); //顯示小數(shù)點(diǎn)  

  172. }

  173. void temp_control()//控制溫度上下限函數(shù)
  174. {
  175.         if(limit_choise==0)//選擇按鍵
  176.         {
  177.                 delay_ms(5);
  178.                 if(limit_choise==0)
  179.                 {
  180.                         while(!limit_choise);
  181.                         limit_choise_num++;
  182.                         if(limit_choise_num>=3)
  183.                         {
  184.                                 limit_choise_num=0;
  185.                         }
  186.                 }
  187.         }
  188.         if(limit_choise_num==0)//正常顯示
  189.         {
  190.                 LcdWriteCom(0x0c);//關(guān)閉光標(biāo)
  191.                 display_real_tenp(get_temp(Ds18b20ReadTemp()));//顯示函數(shù)
  192.         }
  193.                         
  194.         if(limit_choise_num==1)//調(diào)節(jié)上限溫度
  195.         {
  196.                 LcdWriteCom(0x80+0X40+2);
  197.                 LcdWriteCom(0x0f);//開啟光標(biāo)
  198.                 if(increase_temperature==0)//增加溫度
  199.                 {
  200.                         delay_ms(5);
  201.                         if(increase_temperature==0)
  202.                         {
  203.                                 while(!increase_temperature);
  204.                                 up_limit_temp++;
  205.                                 if(up_limit_temp>=100)
  206.                                 {
  207.                                         up_limit_temp=0;
  208.                                 }
  209.                                 //寫入新數(shù)據(jù)
  210.                                 LcdWriteCom(0x80+0X40+0x03);
  211.                                 LcdWriteData('0'+up_limit_temp/10);
  212.                                 LcdWriteCom(0x80+0X40+0x04);
  213.                                 LcdWriteData('0'+up_limit_temp%10);
  214.                                 LcdWriteCom(0x80+0X40+2);//光標(biāo)回寫
  215.                         }
  216.                 }
  217.                 if(reduce_temperature==0)//減少溫度
  218.                 {
  219.                         delay_ms(5);
  220.                         if(reduce_temperature==0)
  221.                         {
  222.                                 while(!reduce_temperature);
  223.                                 up_limit_temp--;
  224.                                 if(up_limit_temp<0)
  225.                                 {
  226.                                         up_limit_temp=99;
  227.                                 }
  228.                                 //寫入新數(shù)據(jù)
  229.                                 LcdWriteCom(0x80+0X40+0x03);
  230.                                 LcdWriteData('0'+up_limit_temp/10);
  231.                                 LcdWriteCom(0x80+0X40+0x04);
  232.                                 LcdWriteData('0'+up_limit_temp%10);
  233.                                 LcdWriteCom(0x80+0X40+2);//光標(biāo)回寫
  234.                         }
  235.                 }
  236.         }
  237.         
  238.         if(limit_choise_num==2)//調(diào)節(jié)下限溫度
  239.         {
  240.                 LcdWriteCom(0x80+0X40+12);
  241.                 LcdWriteCom(0x0f);//開啟光標(biāo)
  242.                 if(increase_temperature==0)//增加溫度
  243.                 {
  244.                         delay_ms(5);
  245.                         if(increase_temperature==0)
  246.                         {
  247.                                 while(!increase_temperature);
  248.                                 down_limit_temp++;
  249.                                 if(down_limit_temp>=100)
  250.                                 {
  251.                                         down_limit_temp=0;
  252.                                 }
  253.                                 //寫入新數(shù)據(jù)
  254.                                 LcdWriteCom(0x80+0X40+0x0d);
  255.                                 LcdWriteData('0'+down_limit_temp/10);
  256.                                 LcdWriteCom(0x80+0X40+0x0e);
  257.                                 LcdWriteData('0'+down_limit_temp%10);
  258.                                 LcdWriteCom(0x80+0X40+12);//光標(biāo)回寫
  259.                         }
  260.                 }
  261.                 if(reduce_temperature==0)//減少溫度
  262.                 {
  263.                         delay_ms(5);
  264.                         if(reduce_temperature==0)
  265.                         {
  266.                                 while(!reduce_temperature);
  267.                                 down_limit_temp--;
  268.                                 if(down_limit_temp<0)
  269.                                 {
  270.                                         down_limit_temp=99;
  271.                                 }
  272.                                 //寫入新數(shù)據(jù)
  273.                                 LcdWriteCom(0x80+0X40+0x0d);
  274.                                 LcdWriteData('0'+down_limit_temp/10);
  275.                                 LcdWriteCom(0x80+0X40+0x0e);
  276.                                 LcdWriteData('0'+down_limit_temp%10);
  277.                                 LcdWriteCom(0x80+0X40+12);//光標(biāo)回寫
  278.                         }
  279.                 }
  280.         }        
  281. }

  282. void unnormal_proccessing(uint temp,uint up_temp,uint down_temp)//恒溫控制函數(shù)
  283. {
  284.         uchar datas[] = {0, 0, 0, 0}; //定義數(shù)組
  285.         uint temp1=0;

  286.         datas[0] = temp % 10000 / 1000;
  287.         datas[1] = temp % 1000 / 100;
  288.         datas[2] = temp % 100 / 10;
  289.         datas[3] = temp % 10;
  290.         temp1=datas[0]*1000+datas[1]*100+datas[2]*10+datas[3];//實(shí)際的溫度乘以100

  291.         if(temp1 < down_temp*100)//升溫函數(shù)
  292.         {
  293.                 heatting=0;//制熱
  294.                 refrigerating=1;//不制冷
  295.                
  296.                 unnormal=0;//不正常溫度指示燈顯示
  297.                 normal=1;//正常溫度指示燈不顯示
  298.                
  299.                 //蜂鳴器報(bào)警
  300.                 //warning=0;
  301.                 //delay_ms(10);
  302.                 //warning=1;
  303.         }
  304.         else if(temp1 > up_temp*100)//降溫函數(shù)
  305.         {
  306.                 heatting=1;//不制熱
  307.                 refrigerating=0;//制冷
  308.                
  309.                 unnormal=0;//不正常溫度指示燈顯示
  310.                 normal=1;//正常溫度指示燈不顯示
  311.                
  312.                 //蜂鳴器報(bào)警
  313.         //        warning=0;
  314.         //        delay_ms(10);
  315.         //        warning=1;
  316.         }
  317.         else//正常
  318.         {
  319.                 heatting=1;//不制熱
  320.                 refrigerating=1;//不制冷
  321.                
  322.                 unnormal=1;//不正常溫度指示燈不顯示
  323.                 normal=0;//正常溫度指示燈顯示
  324.                
  325.                 //蜂鳴器不報(bào)警
  326.         //        warning=1;
  327.         }
  328. }
  329. void Time0() interrupt 1
  330. {
  331.         static u8 i;
  332.         TH0=0xB8;        //11.0592M晶振 定時(shí)20ms
  333.         TL0=0x00;
  334.         i++;
  335.         if(i>=50)   //1秒時(shí)間到
  336.         {
  337.                 i=0;
  338. ……………………

  339. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
魚缸帶溫控 (最終版).rar (78.96 KB, 下載次數(shù): 187)

評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:546719 發(fā)表于 2019-6-16 23:12 | 顯示全部樓層
樓主。我編譯出問題了,可以說一下怎么辦嗎
回復(fù)

使用道具 舉報(bào)

ID:592209 發(fā)表于 2019-8-12 09:43 | 顯示全部樓層
樓主,請(qǐng)問有沒有材料清單?實(shí)在想不到 用什么材料去做!
回復(fù)

使用道具 舉報(bào)

ID:229732 發(fā)表于 2019-10-18 10:28 | 顯示全部樓層
高手高手
回復(fù)

使用道具 舉報(bào)

ID:36359 發(fā)表于 2020-2-23 20:39 | 顯示全部樓層
樓主用的是那款芯片?
回復(fù)

使用道具 舉報(bào)

ID:730171 發(fā)表于 2020-4-15 23:18 | 顯示全部樓層
好厲害的樓主,作為一個(gè)小白也想嘗試一下不知道能不能給點(diǎn)意見啊
回復(fù)

使用道具 舉報(bào)

ID:171111 發(fā)表于 2020-4-25 00:04 來(lái)自手機(jī) | 顯示全部樓層
神劍無(wú)敵 發(fā)表于 2020-2-23 20:39
樓主用的是那款芯片?

STC89C52RC
回復(fù)

使用道具 舉報(bào)

ID:731820 發(fā)表于 2020-4-29 19:53 | 顯示全部樓層
步進(jìn)電機(jī)可以不用這么大嗎?
回復(fù)

使用道具 舉報(bào)

ID:171111 發(fā)表于 2020-4-30 20:06 | 顯示全部樓層
神劍無(wú)敵 發(fā)表于 2020-2-23 20:39
樓主用的是那款芯片?

stc89c52
回復(fù)

使用道具 舉報(bào)

ID:171111 發(fā)表于 2020-4-30 20:07 | 顯示全部樓層
omegrugal 發(fā)表于 2020-4-29 19:53
步進(jìn)電機(jī)可以不用這么大嗎?

我剛開始用的是5V的 但是容易被魚食卡住 沒勁  后來(lái)改用12V的 就沒事了
回復(fù)

使用道具 舉報(bào)

ID:704585 發(fā)表于 2020-5-4 14:38 | 顯示全部樓層
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:515081 發(fā)表于 2020-5-22 10:14 | 顯示全部樓層
很好很好,剛好需要
回復(fù)

使用道具 舉報(bào)

ID:1053359 發(fā)表于 2023-5-22 09:18 | 顯示全部樓層
*** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED
回復(fù)

使用道具 舉報(bào)

ID:1075398 發(fā)表于 2023-5-23 08:17 | 顯示全部樓層
樓主,你哪個(gè)螺旋的東西是用什么做的,怎么焊上去的
回復(fù)

使用道具 舉報(bào)

ID:1075398 發(fā)表于 2023-5-23 15:53 | 顯示全部樓層
大佬,附件中沒有原理圖,PC圖,帖圖上的原理圖也不全呢?有完全的圖嗎?
回復(fù)

使用道具 舉報(bào)

ID:65237 發(fā)表于 2023-5-24 09:08 | 顯示全部樓層
動(dòng)手能力這么牛,學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

ID:171111 發(fā)表于 2023-7-1 12:06 | 顯示全部樓層
Lthrwy 發(fā)表于 2023-5-23 08:17
樓主,你哪個(gè)螺旋的東西是用什么做的,怎么焊上去的

用直徑6MM銅管壓扁 繞在銅管上面 電烙鐵就能焊 我是修家電的 所以用手里有的銅管做的
回復(fù)

使用道具 舉報(bào)

ID:820444 發(fā)表于 2023-7-3 10:14 | 顯示全部樓層
Lthrwy 發(fā)表于 2023-5-23 08:17
樓主,你哪個(gè)螺旋的東西是用什么做的,怎么焊上去的

一般的打印機(jī)硒鼓,都有螺旋進(jìn)料裝置。
拆一個(gè)試試。
回復(fù)

使用道具 舉報(bào)

ID:1130604 發(fā)表于 2024-9-16 00:27 | 顯示全部樓層
樓主,到時(shí)間定時(shí)投喂,可以在下面放一把電子秤多少g后自動(dòng)停止,到然后用舵機(jī)打開艙門魚食自動(dòng)滑下,嘻嘻,再加個(gè)智能監(jiān)控觀察魚和水的情況,分析水中的顆粒物達(dá)到一定量(魚屎)自動(dòng)過濾,水中加個(gè)水氧傳感器,值低于多少時(shí)打氧,到一定量停止,還有更多期待挖掘。
回復(fù)

使用道具 舉報(bào)

ID:195666 發(fā)表于 2024-12-30 21:01 | 顯示全部樓層
這動(dòng)手能力
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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