找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于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, 下载次数: 448)

343087629296337574.jpg

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

407156072252723955.jpg

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

727834607737966332.jpg

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

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

代码+原理图

评分

参与人数 7黑币 +96 收起 理由
Cliff + 3 感谢分享,希望我能借鉴它完成末末的实习课.
15119714985 + 3 赞一个!
无证驾驶 + 5 共享资料的黑币奖励!
send + 10 很给力!
wxc19960311 + 10 很给力!
lizhuoxiao + 5 很给力!
admin + 60 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏43 分享淘帖 顶11 踩
回复

使用道具 举报

沙发
ID:107189 发表于 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. }




复制代码

评分

参与人数 2黑币 +13 收起 理由
天籁游子 + 10 很给力!
15119714985 + 3 很给力!

查看全部评分

回复

使用道具 举报

板凳
ID:104763 发表于 2016-3-4 12:30 | 只看该作者
楼主威武,学习了
回复

使用道具 举报

地板
ID:89217 发表于 2016-3-4 12:55 | 只看该作者
谢谢分享。
回复

使用道具 举报

5#
ID:114742 发表于 2016-5-7 21:09 | 只看该作者
少函数呀
回复

使用道具 举报

6#
ID:10075 发表于 2016-7-6 09:17 | 只看该作者
楼主威武,学习了
回复

使用道具 举报

7#
ID:137247 发表于 2016-9-7 11:18 | 只看该作者
不是很理解,不需要封闭吗,我想要做一个恒温箱,用制冷模块和加热模块
回复

使用道具 举报

8#
ID:70785 发表于 2016-9-11 07:47 | 只看该作者
学习了……
回复

使用道具 举报

9#
ID:151343 发表于 2016-11-30 22:40 | 只看该作者
DS18B20测温
回复

使用道具 举报

10#
ID:185484 发表于 2017-4-1 23:06 | 只看该作者
可以啊谢谢楼主
回复

使用道具 举报

11#
ID:104838 发表于 2017-4-2 07:41 | 只看该作者
很 好很需要,,51需要你
回复

使用道具 举报

12#
ID:186203 发表于 2017-4-5 10:31 | 只看该作者
51黑tt 发表于 2016-3-4 00:02
很棒的制作。值得收藏以后有时间做一个.
下面是楼主的电路图和主程序:

刚想怎么下载呢,你都贴出来了。赞一个
回复

使用道具 举报

13#
ID:186130 发表于 2017-4-5 11:49 | 只看该作者
51黑tt 发表于 2016-3-4 00:02
很棒的制作。值得收藏以后有时间做一个.
下面是楼主的电路图和主程序:

请问这是不是用PROTEL软件画的啊,用PROTUSE能画吗?
回复

使用道具 举报

14#
ID:186341 发表于 2017-4-5 16:18 | 只看该作者
多谢分享~学习一下!
回复

使用道具 举报

15#
ID:186341 发表于 2017-4-5 16:19 | 只看该作者
楼主威武~!!!
回复

使用道具 举报

16#
ID:1 发表于 2017-4-5 16:57 | 只看该作者
weichen 发表于 2017-4-5 11:49
请问这是不是用PROTEL软件画的啊,用PROTUSE能画吗?

我刚看了 这个原理图是用ad画的 里面有ad的工程文件
回复

使用道具 举报

17#
ID:186130 发表于 2017-4-6 10:07 | 只看该作者
admin 发表于 2017-4-5 16:57
我刚看了 这个原理图是用ad画的 里面有ad的工程文件

这样啊,谢谢!
回复

使用道具 举报

18#
ID:186203 发表于 2017-4-10 11:26 | 只看该作者
问什么感觉程序上的端口和原理图上的端口对不上号么。有做出来的吗?原理图给看一下。谢谢了、、、
回复

使用道具 举报

19#
ID:161033 发表于 2017-4-10 21:12 | 只看该作者
感谢分享,,,
回复

使用道具 举报

20#
ID:187129 发表于 2017-4-12 10:18 来自手机 | 只看该作者
原理图是用AD画的
回复

使用道具 举报

21#
ID:187129 发表于 2017-4-12 10:19 来自手机 | 只看该作者
weichen 发表于 2017-4-5 11:49
请问这是不是用PROTEL软件画的啊,用PROTUSE能画吗?

可以,这里是用AD画的,proteus一样可以
回复

使用道具 举报

22#
ID:185854 发表于 2017-4-12 20:25 | 只看该作者
希望全寄托在你身上了!试一试
回复

使用道具 举报

23#
ID:185854 发表于 2017-4-12 22:18 | 只看该作者
没有仿真图呢?只有原理图没有完整的工程文件没什么用啊,PCB图和元件封装呢
回复

使用道具 举报

24#
ID:185854 发表于 2017-4-13 22:05 | 只看该作者
谁有完整的工程文件分享给我,有现金酬谢
回复

使用道具 举报

25#
ID:189466 发表于 2017-4-14 11:58 | 只看该作者
多谢分享~学习一下!
回复

使用道具 举报

26#
ID:189466 发表于 2017-4-14 11:59 | 只看该作者
晓天狼星10 发表于 2017-4-13 22:05
谁有完整的工程文件分享给我,有现金酬谢

如何联系!
回复

使用道具 举报

27#
ID:185854 发表于 2017-4-15 22:18 | 只看该作者

QQ 1337935880
回复

使用道具 举报

28#
ID:185854 发表于 2017-4-15 22:20 | 只看该作者

要全部的AD工程文件,包括原理图,PCB图,以及元器件封装
回复

使用道具 举报

29#
ID:200048 发表于 2017-5-12 19:21 | 只看该作者
大拿就出来吧,看楼上说的多真诚,助人为乐,希望继续发扬。我也是初级水平,希望晓天狼星10也自力更生,自己多努力,才是硬道理,你有那么多黑必,多下载一些例子。看明白,适当改一下就行了。
回复

使用道具 举报

30#
ID:102702 发表于 2017-5-13 00:48 | 只看该作者
做得不错,我也想做一个,可以参考一下楼主做法
回复

使用道具 举报

31#
ID:102702 发表于 2017-5-16 22:47 | 只看该作者
你好,请问一下楼主你那电路图是不是有些地方没标好呀
这里J1是接哪里的?



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



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





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





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




回复

使用道具 举报

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

贴出来的程序,少函数,用不了。
回复

使用道具 举报

33#
ID:230054 发表于 2017-8-30 14:51 | 只看该作者
能用吗
回复

使用道具 举报

34#
ID:82765 发表于 2017-8-30 17:01 | 只看该作者

你好!如果不能用,也是可以修改的
回复

使用道具 举报

35#
ID:230177 发表于 2017-9-1 12:59 | 只看该作者
很好 很有收获
回复

使用道具 举报

36#
ID:253272 发表于 2017-12-13 00:41 | 只看该作者
  内容我看不懂,但把洞洞板搞到那模样,实在是不得了。
回复

使用道具 举报

37#
ID:267794 发表于 2017-12-27 15:54 | 只看该作者
谢谢分享。
回复

使用道具 举报

38#
ID:266106 发表于 2017-12-27 16:24 | 只看该作者
不错的创意,学习了
回复

使用道具 举报

39#
ID:287655 发表于 2018-3-19 10:42 | 只看该作者
这个太棒了!对于学习价值高啊
回复

使用道具 举报

40#
ID:294022 发表于 2018-3-19 15:03 | 只看该作者
做得不错,我也想做一个,可以参考一下楼主做法
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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