找回密码
 立即注册

QQ登录

只需一步,快速开始

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

鱼缸自动控制系统设计与制作(带自动喂鱼)附单片机程序电路图

  [复制链接]
跳转到指定楼层
楼主
经常好几天不在家,一直想做一个自动喂鱼的东西,在网上找了很久,就看到一个用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, 下载次数: 174)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏16 分享淘帖 顶2 踩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
楼主,你哪个螺旋的东西是用什么做的,怎么焊上去的

一般的打印机硒鼓,都有螺旋进料装置。
拆一个试试。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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