标题: 基于51单片机的恒温控制系统 [打印本页]

作者: forrest    时间: 2016-3-3 20:39
标题: 基于51单片机的恒温控制系统
1.显示当前才起的室内温度;
2.恒定温度在20C——25C之间,温度在此范围内外设不工作;如低于20C自动启动加热继电器升温;
超过25C则自动启动降温继电器降温;
3.温度超过恒定值会有不同颜色的指示灯报警提示;测温精度0.1C。

引脚分配    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    //低温指示灯   

详细代码及原理图见附件!!!!!!!!!!!!!!

343087629296337574.jpg (99.73 KB, 下载次数: 450)

343087629296337574.jpg

407156072252723955.jpg (190.94 KB, 下载次数: 384)

407156072252723955.jpg

727834607737966332.jpg (111.37 KB, 下载次数: 378)

727834607737966332.jpg

基于51单片机的恒温控制系统.zip

576.64 KB, 下载次数: 715, 下载积分: 黑币 -5

代码+原理图


作者: 51黑tt    时间: 2016-3-4 00:02
很棒的制作。值得收藏以后有时间做一个.
下面是楼主的电路图和主程序:

  1. #include <main.h>

  2. void main()//主函数
  3. {
  4.         init();//初始化函数
  5.   while(1)
  6.         {
  7.                 temp_control();//控制按键函数
  8.                 unnormal_proccessing(get_temp(Ds18b20ReadTemp()),up_limit_temp,down_limit_temp);//恒温控制函数
  9.         }               
  10. }

  11. void init()//初始化函数
  12. {
  13.         uint i,j;
  14.         //函数初始化
  15.         LcdInit();//LCD初始化函数
  16.         Ds18b20Init();
  17.        
  18.         //I/O口初始化
  19.         heatting=1;//不制热
  20.         refrigerating=1;//不制冷
  21.         normal=1;//正常温度指示灯不显示
  22.         unnormal=1;//不正常温度指示灯不显示
  23.         warning=1;//蜂鸣器不报警
  24.        
  25.         //LCD初始化显示
  26.         LcdWriteCom(0x80);//第一行显示
  27.         j=strlen(num1);
  28.         for(i=0; i<j; i++)
  29.         {
  30.                 LcdWriteData(num1[i]);       
  31.                 delay_ms(1);
  32.         }
  33.         LcdWriteCom(0x80+0x40);//第二行显示
  34.         j=strlen(num2);
  35.         for(i=0; i<j; i++)
  36.         {
  37.                 LcdWriteData(num2[i]);       
  38.                 delay_ms(1);
  39.         }
  40.         LcdWriteCom(0x04);  //关闭写一个指针加1
  41. }

  42. uint get_temp(uint temp)//计算温度函数
  43. {
  44.         float tp;
  45.        
  46.         tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  47.         //如果温度是正的那么,那么正数的原码就是补码它本身
  48.         temp=tp*0.0625*100+0.5;       
  49.         //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  50.         //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  51.         //算加上0.5,还是在小数点后面。
  52.         return temp;
  53. }

  54. void display_real_tenp(uint temp)//实时温度显示函数
  55. {
  56.         uchar datas[] = {0, 0, 0, 0}; //定义数组

  57.         datas[0] = temp % 10000 / 1000;
  58.         datas[1] = temp % 1000 / 100;
  59.         datas[2] = temp % 100 / 10;
  60.         datas[3] = temp % 10;

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

  63.         LcdWriteCom(0x80+0x0b);        //写地址 80表示初始地址
  64.         LcdWriteData('0'+datas[1]); //个位

  65.         LcdWriteCom(0x80+0x0d);         //写地址 80表示初始地址
  66.         LcdWriteData('0'+datas[2]); //显示小数点  

  67.         LcdWriteCom(0x80+0x0e);                 //写地址 80表示初始地址
  68.         LcdWriteData('0'+datas[3]); //显示小数点  

  69. }

  70. void temp_control()//控制温度上下限函数
  71. {
  72.         if(limit_choise==0)//选择按键
  73.         {
  74.                 delay_ms(5);
  75.                 if(limit_choise==0)
  76.                 {
  77.                         while(!limit_choise);
  78.                         limit_choise_num++;
  79.                         if(limit_choise_num>=3)
  80.                         {
  81.                                 limit_choise_num=0;
  82.                         }
  83.                 }
  84.         }
  85.         if(limit_choise_num==0)//正常显示
  86.         {
  87.                 LcdWriteCom(0x0c);//关闭光标
  88.                 display_real_tenp(get_temp(Ds18b20ReadTemp()));//显示函数
  89.         }
  90.                        
  91.         if(limit_choise_num==1)//调节上限温度
  92.         {
  93.                 LcdWriteCom(0x80+0X40+2);
  94.                 LcdWriteCom(0x0f);//开启光标
  95.                 if(increase_temperature==0)//增加温度
  96.                 {
  97.                         delay_ms(5);
  98.                         if(increase_temperature==0)
  99.                         {
  100.                                 while(!increase_temperature);
  101.                                 up_limit_temp++;
  102.                                 if(up_limit_temp>=100)
  103.                                 {
  104.                                         up_limit_temp=0;
  105.                                 }
  106.                                 //写入新数据
  107.                                 LcdWriteCom(0x80+0X40+0x03);
  108.                                 LcdWriteData('0'+up_limit_temp/10);
  109.                                 LcdWriteCom(0x80+0X40+0x04);
  110.                                 LcdWriteData('0'+up_limit_temp%10);
  111.                                 LcdWriteCom(0x80+0X40+2);//光标回写
  112.                         }
  113.                 }
  114.                 if(reduce_temperature==0)//减少温度
  115.                 {
  116.                         delay_ms(5);
  117.                         if(reduce_temperature==0)
  118.                         {
  119.                                 while(!reduce_temperature);
  120.                                 up_limit_temp--;
  121.                                 if(up_limit_temp<0)
  122.                                 {
  123.                                         up_limit_temp=99;
  124.                                 }
  125.                                 //写入新数据
  126.                                 LcdWriteCom(0x80+0X40+0x03);
  127.                                 LcdWriteData('0'+up_limit_temp/10);
  128.                                 LcdWriteCom(0x80+0X40+0x04);
  129.                                 LcdWriteData('0'+up_limit_temp%10);
  130.                                 LcdWriteCom(0x80+0X40+2);//光标回写
  131.                         }
  132.                 }
  133.         }
  134.        
  135.         if(limit_choise_num==2)//调节下限温度
  136.         {
  137.                 LcdWriteCom(0x80+0X40+12);
  138.                 LcdWriteCom(0x0f);//开启光标
  139.                 if(increase_temperature==0)//增加温度
  140.                 {
  141.                         delay_ms(5);
  142.                         if(increase_temperature==0)
  143.                         {
  144.                                 while(!increase_temperature);
  145.                                 down_limit_temp++;
  146.                                 if(down_limit_temp>=100)
  147.                                 {
  148.                                         down_limit_temp=0;
  149.                                 }
  150.                                 //写入新数据
  151.                                 LcdWriteCom(0x80+0X40+0x0d);
  152.                                 LcdWriteData('0'+down_limit_temp/10);
  153.                                 LcdWriteCom(0x80+0X40+0x0e);
  154.                                 LcdWriteData('0'+down_limit_temp%10);
  155.                                 LcdWriteCom(0x80+0X40+12);//光标回写
  156.                         }
  157.                 }
  158.                 if(reduce_temperature==0)//减少温度
  159.                 {
  160.                         delay_ms(5);
  161.                         if(reduce_temperature==0)
  162.                         {
  163.                                 while(!reduce_temperature);
  164.                                 down_limit_temp--;
  165.                                 if(down_limit_temp<0)
  166.                                 {
  167.                                         down_limit_temp=99;
  168.                                 }
  169.                                 //写入新数据
  170.                                 LcdWriteCom(0x80+0X40+0x0d);
  171.                                 LcdWriteData('0'+down_limit_temp/10);
  172.                                 LcdWriteCom(0x80+0X40+0x0e);
  173.                                 LcdWriteData('0'+down_limit_temp%10);
  174.                                 LcdWriteCom(0x80+0X40+12);//光标回写
  175.                         }
  176.                 }
  177.         }       
  178. }

  179. void unnormal_proccessing(uint temp,uint up_temp,uint down_temp)//恒温控制函数
  180. {
  181.         uchar datas[] = {0, 0, 0, 0}; //定义数组
  182.         uint temp1=0;

  183.         datas[0] = temp % 10000 / 1000;
  184.         datas[1] = temp % 1000 / 100;
  185.         datas[2] = temp % 100 / 10;
  186.         datas[3] = temp % 10;
  187.         temp1=datas[0]*1000+datas[1]*100+datas[2]*10+datas[3];//实际的温度乘以100

  188.         if(temp1 < down_temp*100)//升温函数
  189.         {
  190.                 heatting=0;//制热
  191.                 refrigerating=1;//不制冷
  192.                
  193.                 unnormal=0;//不正常温度指示灯显示
  194.                 normal=1;//正常温度指示灯不显示
  195.                
  196.                 //蜂鸣器报警
  197.                 warning=0;
  198.                 delay_ms(10);
  199.                 warning=1;
  200.         }
  201.         else if(temp1 > up_temp*100)//降温函数
  202.         {
  203.                 heatting=1;//不制热
  204.                 refrigerating=0;//制冷
  205.                
  206.                 unnormal=0;//不正常温度指示灯显示
  207.                 normal=1;//正常温度指示灯不显示
  208.                
  209.                 //蜂鸣器报警
  210.                 warning=0;
  211.                 delay_ms(10);
  212.                 warning=1;
  213.         }
  214.         else//正常
  215.         {
  216.                 heatting=1;//不制热
  217.                 refrigerating=1;//不制冷
  218.                
  219.                 unnormal=1;//不正常温度指示灯不显示
  220.                 normal=0;//正常温度指示灯显示
  221.                
  222.                 //蜂鸣器不报警
  223.                 warning=1;
  224.         }
  225. }




复制代码

作者: 聂小生    时间: 2016-3-4 12:30
楼主威武,学习了

作者: 罗程峰8200    时间: 2016-3-4 12:55
谢谢分享。
作者: 3263065307    时间: 2016-5-7 21:09
少函数呀
作者: tomko    时间: 2016-7-6 09:17
楼主威武,学习了
作者: Ysmooth    时间: 2016-9-7 11:18
不是很理解,不需要封闭吗,我想要做一个恒温箱,用制冷模块和加热模块
作者: fsdch    时间: 2016-9-11 07:47
学习了……
作者: 201401904050    时间: 2016-11-30 22:40
DS18B20测温
作者: wangyan9411    时间: 2017-4-1 23:06
可以啊谢谢楼主
作者: mslong    时间: 2017-4-2 07:41
很 好很需要,,51需要你
作者: zhangsan    时间: 2017-4-5 10:31
51黑tt 发表于 2016-3-4 00:02
很棒的制作。值得收藏以后有时间做一个.
下面是楼主的电路图和主程序:

刚想怎么下载呢,你都贴出来了。赞一个
作者: weichen    时间: 2017-4-5 11:49
51黑tt 发表于 2016-3-4 00:02
很棒的制作。值得收藏以后有时间做一个.
下面是楼主的电路图和主程序:

请问这是不是用PROTEL软件画的啊,用PROTUSE能画吗?
作者: 两袖清风    时间: 2017-4-5 16:18
多谢分享~学习一下!
作者: 两袖清风    时间: 2017-4-5 16:19
楼主威武~!!!
作者: admin    时间: 2017-4-5 16:57
weichen 发表于 2017-4-5 11:49
请问这是不是用PROTEL软件画的啊,用PROTUSE能画吗?

我刚看了 这个原理图是用ad画的 里面有ad的工程文件
作者: weichen    时间: 2017-4-6 10:07
admin 发表于 2017-4-5 16:57
我刚看了 这个原理图是用ad画的 里面有ad的工程文件

这样啊,谢谢!
作者: zhangsan    时间: 2017-4-10 11:26
问什么感觉程序上的端口和原理图上的端口对不上号么。有做出来的吗?原理图给看一下。谢谢了、、、
作者: xmch    时间: 2017-4-10 21:12
感谢分享,,,
作者: 谏言    时间: 2017-4-12 10:18
原理图是用AD画的
作者: 谏言    时间: 2017-4-12 10:19
weichen 发表于 2017-4-5 11:49
请问这是不是用PROTEL软件画的啊,用PROTUSE能画吗?

可以,这里是用AD画的,proteus一样可以
作者: 晓天狼星10    时间: 2017-4-12 20:25
希望全寄托在你身上了!试一试
作者: 晓天狼星10    时间: 2017-4-12 22:18
没有仿真图呢?只有原理图没有完整的工程文件没什么用啊,PCB图和元件封装呢
作者: 晓天狼星10    时间: 2017-4-13 22:05
谁有完整的工程文件分享给我,有现金酬谢
作者: lupinxjdl    时间: 2017-4-14 11:58
多谢分享~学习一下!
作者: lupinxjdl    时间: 2017-4-14 11:59
晓天狼星10 发表于 2017-4-13 22:05
谁有完整的工程文件分享给我,有现金酬谢

如何联系!
作者: 晓天狼星10    时间: 2017-4-15 22:18
lupinxjdl 发表于 2017-4-14 11:59
如何联系!

QQ 1337935880
作者: 晓天狼星10    时间: 2017-4-15 22:20
晓天狼星10 发表于 2017-4-15 22:18
QQ 1337935880

要全部的AD工程文件,包括原理图,PCB图,以及元器件封装
作者: xiaoheqingshui    时间: 2017-5-12 19:21
大拿就出来吧,看楼上说的多真诚,助人为乐,希望继续发扬。我也是初级水平,希望晓天狼星10也自力更生,自己多努力,才是硬道理,你有那么多黑必,多下载一些例子。看明白,适当改一下就行了。
作者: raymondau    时间: 2017-5-13 00:48
做得不错,我也想做一个,可以参考一下楼主做法
作者: raymondau    时间: 2017-5-16 22:47
你好,请问一下楼主你那电路图是不是有些地方没标好呀
这里J1是接哪里的?



下面两个R2接哪里的?另外两个8550都是要接上P0^8引脚吗?



这三个按钮接哪个引脚的?





我看了一下你的说明文件怎么和程序、电路有出入的?





程序里定义的引脚和说明文件不一样呀?说明文件和你电路应该是对应上的,但程序的PIN口定义不一样呀!哪个是对的?





作者: cagcxx    时间: 2017-5-20 06:07
raymondau 发表于 2017-5-16 22:47
你好,请问一下楼主你那电路图是不是有些地方没标好呀
这里J1是接哪里的?

贴出来的程序,少函数,用不了。
作者: 洁洁洁    时间: 2017-8-30 14:51
能用吗
作者: cjjcjj1    时间: 2017-8-30 17:01
提示: 作者被禁止或删除 内容自动屏蔽
作者: hnm372    时间: 2017-9-1 12:59
很好 很有收获
作者: lanrenyexuexue    时间: 2017-12-13 00:41
  内容我看不懂,但把洞洞板搞到那模样,实在是不得了。
作者: shenyibo    时间: 2017-12-27 15:54
谢谢分享。
作者: TXWS01    时间: 2017-12-27 16:24
不错的创意,学习了
作者: 飞天的猫    时间: 2018-3-19 10:42
这个太棒了!对于学习价值高啊
作者: wsad12366    时间: 2018-3-19 15:03
做得不错,我也想做一个,可以参考一下楼主做法
作者: whs123456    时间: 2018-4-13 13:07
我也想要元件啊
作者: 201730645473    时间: 2018-4-16 22:23
学习了!!
作者: yzh123    时间: 2018-4-24 08:48
谢谢分享,
作者: 斯可瑞木    时间: 2018-5-6 11:00
请问楼主用什么作为加热装置
作者: lucky梁    时间: 2018-5-20 14:59
很不错
作者: lx5204441    时间: 2018-7-5 16:34
有proteus图吗   能发一份嘛
作者: 看到弗拉克    时间: 2018-12-6 16:52
原理图有点看不懂啊,图上和程序有差异啊
作者: 17376585785    时间: 2018-12-6 22:06
楼主这款可以用485通讯么
作者: lfl680    时间: 2018-12-21 19:36
51黑tt 发表于 2016-3-4 00:02
很棒的制作。值得收藏以后有时间做一个.
下面是楼主的电路图和主程序:

666,十分感谢
作者: jifengjianwu    时间: 2018-12-24 20:10
谢谢分享
作者: 老河口    时间: 2018-12-28 13:12
好东西,感谢分享,正好需要
作者: 2423123026    时间: 2018-12-29 14:43
51黑tt 发表于 2016-3-4 00:02
很棒的制作。值得收藏以后有时间做一个.
下面是楼主的电路图和主程序:

谢谢。。。。。。。
作者: ysj_666    时间: 2019-1-5 19:41
那个加热的东西叫什么??
作者: 立即停电    时间: 2019-3-29 15:53
老板能发一份代码跟原理图到我邮箱吗?
2060001515@qq.com
作者: 874498724    时间: 2019-4-22 20:49
值得学习,楼主谢谢了
作者: tigerzq    时间: 2019-4-22 22:18
弄个标签打印机,打印后再贴电路板上比手写的要高级好看些
作者: 13175392    时间: 2019-4-24 23:42
怒赞!!!
作者: 我看看呀    时间: 2019-6-4 13:56
真是太棒了,学到了新的知识
作者: liuqingjun_51    时间: 2019-6-5 05:45
走线和焊功不错。
作者: StaryLL    时间: 2019-7-22 18:32
有做出来了的朋友吗?
作者: Scorpionx    时间: 2019-10-11 21:02
好东西,好好学习,不错的学习材料
作者: AngelaChicken    时间: 2020-10-4 14:07
能加入键盘输入吗?
作者: zydl123    时间: 2021-12-21 22:53
控制加温用来发豆芽菜应该不错
作者: qq603599910    时间: 2021-12-22 08:26
Ysmooth 发表于 2016-9-7 11:18
不是很理解,不需要封闭吗,我想要做一个恒温箱,用制冷模块和加热模块

可以做到,我设计的恒温箱温控做到0.5以内的温飘.
作者: luowz    时间: 2023-5-9 08:51
手工焊接很好!
作者: LQ2023    时间: 2025-4-3 11:05
先收藏,下来学习
作者: xt1973    时间: 2025-5-23 22:04
谢谢楼主无私分享!
作者: lll44    时间: 2025-6-21 20:07
感谢感谢感谢 好资料,51黑有你更精彩!!!





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1