久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14288|回復: 19
打印 上一主題 下一主題
收起左側

魚缸自動控制系統設計與制作(帶自動喂魚)附單片機程序電路圖

  [復制鏈接]
跳轉到指定樓層
樓主
經常好幾天不在家,一直想做一個自動喂魚的東西,在網上找了很久,就看到一個用15F104W單片機 只用定時器功能定時震動下魚食的,不太喜歡,今天給大家分享一個我自己設計制作,還算比較滿意的小作品。
第一次發帖 不太會啊……

制作出來的實物圖如下:


電路原理圖如下:


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

        溫度傳感器    temperature_sensor    P

        制熱    heatting    P

        制冷    refrigerating    P

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

制作過程圖片:


單片機源程序如下:
  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()                         //手動喂魚
  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晶振 定時20ms
  70.         TL0=0x00;
  71.         ET0=1;
  72.         EA=1;
  73.         TR0=1;
  74. }

  75. void main()//主函數
  76. {
  77.         init();//初始化函數
  78.         K1=1;
  79.         XIAODU=1;
  80.         YANGQI=1;
  81.         BENG=1;
  82.         Timer0Init();
  83.   while(1)
  84.         {
  85.                 temp_control();//控制按鍵函數
  86.                 unnormal_proccessing(get_temp(Ds18b20ReadTemp()),up_limit_temp,down_limit_temp);//恒溫控制函數
  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()//初始化函數
  115. {
  116.         uint i,j;
  117.         //函數初始化
  118.         LcdInit();//LCD初始化函數
  119.         Ds18b20Init();
  120.         
  121.         //I/O口初始化
  122.         heatting=1;//不制熱
  123.         refrigerating=1;//不制冷
  124.         normal=1;//正常溫度指示燈不顯示
  125.         unnormal=1;//不正常溫度指示燈不顯示
  126.         warning=1;//蜂鳴器不報警
  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);  //關閉寫一個指針加1
  144. }

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

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

  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]); //個位

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

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

  172. }

  173. void temp_control()//控制溫度上下限函數
  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);//關閉光標
  191.                 display_real_tenp(get_temp(Ds18b20ReadTemp()));//顯示函數
  192.         }
  193.                         
  194.         if(limit_choise_num==1)//調節上限溫度
  195.         {
  196.                 LcdWriteCom(0x80+0X40+2);
  197.                 LcdWriteCom(0x0f);//開啟光標
  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.                                 //寫入新數據
  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);//光標回寫
  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.                                 //寫入新數據
  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);//光標回寫
  234.                         }
  235.                 }
  236.         }
  237.         
  238.         if(limit_choise_num==2)//調節下限溫度
  239.         {
  240.                 LcdWriteCom(0x80+0X40+12);
  241.                 LcdWriteCom(0x0f);//開啟光標
  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.                                 //寫入新數據
  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);//光標回寫
  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.                                 //寫入新數據
  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);//光標回寫
  278.                         }
  279.                 }
  280.         }        
  281. }

  282. void unnormal_proccessing(uint temp,uint up_temp,uint down_temp)//恒溫控制函數
  283. {
  284.         uchar datas[] = {0, 0, 0, 0}; //定義數組
  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];//實際的溫度乘以100

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

  339. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

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

評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏20 分享淘帖 頂3 踩1
回復

使用道具 舉報

沙發
ID:546719 發表于 2019-6-16 23:12 | 只看該作者
樓主。我編譯出問題了,可以說一下怎么辦嗎
回復

使用道具 舉報

板凳
ID:592209 發表于 2019-8-12 09:43 | 只看該作者
樓主,請問有沒有材料清單啊?實在想不到 用什么材料去做!
回復

使用道具 舉報

地板
ID:229732 發表于 2019-10-18 10:28 | 只看該作者
高手高手
回復

使用道具 舉報

5#
ID:36359 發表于 2020-2-23 20:39 | 只看該作者
樓主用的是那款芯片?
回復

使用道具 舉報

6#
ID:730171 發表于 2020-4-15 23:18 | 只看該作者
好厲害的樓主,作為一個小白也想嘗試一下不知道能不能給點意見啊
回復

使用道具 舉報

7#
ID:171111 發表于 2020-4-25 00:04 來自手機 | 只看該作者
神劍無敵 發表于 2020-2-23 20:39
樓主用的是那款芯片?

STC89C52RC
回復

使用道具 舉報

8#
ID:731820 發表于 2020-4-29 19:53 | 只看該作者
步進電機可以不用這么大嗎?
回復

使用道具 舉報

9#
ID:171111 發表于 2020-4-30 20:06 | 只看該作者
神劍無敵 發表于 2020-2-23 20:39
樓主用的是那款芯片?

stc89c52
回復

使用道具 舉報

10#
ID:171111 發表于 2020-4-30 20:07 | 只看該作者
omegrugal 發表于 2020-4-29 19:53
步進電機可以不用這么大嗎?

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

使用道具 舉報

11#
ID:704585 發表于 2020-5-4 14:38 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

12#
ID:515081 發表于 2020-5-22 10:14 | 只看該作者
很好很好,剛好需要
回復

使用道具 舉報

13#
ID:1053359 發表于 2023-5-22 09:18 | 只看該作者
*** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED
回復

使用道具 舉報

14#
ID:1075398 發表于 2023-5-23 08:17 | 只看該作者
樓主,你哪個螺旋的東西是用什么做的,怎么焊上去的
回復

使用道具 舉報

15#
ID:1075398 發表于 2023-5-23 15:53 | 只看該作者
大佬,附件中沒有原理圖,PC圖,帖圖上的原理圖也不全呢?有完全的圖嗎?
回復

使用道具 舉報

16#
ID:65237 發表于 2023-5-24 09:08 | 只看該作者
動手能力這么牛,學習了
回復

使用道具 舉報

17#
ID:171111 發表于 2023-7-1 12:06 | 只看該作者
Lthrwy 發表于 2023-5-23 08:17
樓主,你哪個螺旋的東西是用什么做的,怎么焊上去的

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

使用道具 舉報

18#
ID:820444 發表于 2023-7-3 10:14 | 只看該作者
Lthrwy 發表于 2023-5-23 08:17
樓主,你哪個螺旋的東西是用什么做的,怎么焊上去的

一般的打印機硒鼓,都有螺旋進料裝置。
拆一個試試。
回復

使用道具 舉報

19#
ID:1130604 發表于 2024-9-16 00:27 | 只看該作者
樓主,到時間定時投喂,可以在下面放一把電子秤多少g后自動停止,到然后用舵機打開艙門魚食自動滑下,嘻嘻,再加個智能監控觀察魚和水的情況,分析水中的顆粒物達到一定量(魚屎)自動過濾,水中加個水氧傳感器,值低于多少時打氧,到一定量停止,還有更多期待挖掘。
回復

使用道具 舉報

20#
ID:195666 發表于 2024-12-30 21:01 | 只看該作者
這動手能力
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久区 | 亚洲日本中文字幕在线 | 国产欧美在线视频 | 色吊丝2288sds中文字幕 | 91精品久久久久 | 国产三级精品视频 | 欧美性久久 | 国产精品1区2区3区 欧美 中文字幕 | 淫片专区 | 免费在线观看av网站 | 在线观看视频亚洲 | 网站黄色在线 | av天空| 色综合99 | 99免费在线视频 | 综合伊人 | 狠狠婷婷综合久久久久久妖精 | 你懂的国产 | 九九热精品在线 | 欧美一级欧美一级在线播放 | 久久一本| 国产精品免费一区二区三区四区 | 成人高清在线视频 | 国产精品自产av一区二区三区 | 久久99蜜桃综合影院免费观看 | 精品一区在线免费观看 | 欧美电影免费网站 | 久久久久国产精品人 | 69av网| 91视频大全 | 久久亚洲一区二区三区四区 | 欧美在线小视频 | 精品在线一区 | 99精品热视频| 国产99久久精品一区二区永久免费 | 在线欧美视频 | 欧美精品一区二区在线观看 | 精品久久一区 | 国产精品日日摸夜夜添夜夜av | 日本亚洲精品成人欧美一区 | 噜噜噜色网 |