找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的恒温控制系统电路与程序源码设计资料

  [复制链接]
跳转到指定楼层
楼主
基于stc89c52恒温控制系统电路原理图如下:


引脚分配    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 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.        
  22.         //LCD初始化显示
  23.         LcdWriteCom(0x80);//第一行显示
  24.         j=strlen(num1);
  25.         for(i=0; i<j; i++)
  26.         {
  27.                 LcdWriteData(num1[i]);       
  28.                 delay_ms(1);
  29.         }
  30.         LcdWriteCom(0x80+0x40);//第二行显示
  31.         j=strlen(num2);
  32.         for(i=0; i<j; i++)
  33.         {
  34.                 LcdWriteData(num2[i]);       
  35.                 delay_ms(1);
  36.         }
  37.         LcdWriteCom(0x04);  //关闭写一个指针加1
  38. }

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

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

  54.         datas[0] = temp % 10000 / 1000;
  55.         datas[1] = temp % 1000 / 100;
  56.         datas[2] = temp % 100 / 10;
  57.         datas[3] = temp % 10;

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

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

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

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

  66. }

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

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

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

  185.         if(temp1 < down_temp*100)//升温函数
  186.         {
  187.                 heatting=0;//制热       
  188.                 warning=0;
  189.                 delay_ms(10);
  190.                 warning=1;
  191.         }
  192.         else//正常
  193.         {
  194.                 heatting=1;//不制热
  195.                

  196. ……………………

  197. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
恒温箱.rar (175.84 KB, 下载次数: 85)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:310363 发表于 2018-4-26 22:02 | 只看该作者
好帖子,值得学习。。。
回复

使用道具 举报

板凳
ID:318451 发表于 2018-4-28 15:05 | 只看该作者
有实际应用意义的好帖。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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