找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机水温控制系统Proteus仿真程序 LCD1602显示

  [复制链接]
跳转到指定楼层
楼主
基于单片机的温度控制系统资料水温控制系统
1.采用液晶显示当前温度值,温度上限和温度下限;
2.采用DS18B20温度传感器测温;
3.按键可以设置报警值,当温度超过设定的上限或低于下限(显示比例:32%,双击查同时相应的继电器吸合
4.加键和减键。可设置上下限温度控制范围;
5.温度测量范围0到99.9摄氏度,精度为0.1摄氏度;

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg52.h>
  2. #include"1602.h"
  3. #include"ds18b20.h"
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. sbit speaker=P1^5;                  //定义蜂鸣器
  7. sbit red=P2^0;                          //定义报警灯
  8. //sbit green=P2^1;
  9. sbit key1=P3^0;                          //定义温度按键
  10. sbit key2=P3^1;                          //定义时间按键

  11. uint tem;                                  //定义采集温度
  12. int htem,time;                          //定义温度、时间
  13. int cnt1=1,cnt2=1;                  //定义计数变量
  14. int min,i;
  15. uchar mode=0;                          //定义模式变量
  16. uchar code t3[]={"high temp:     C"};
  17. uchar code t4[]={"time:        MIN"};


  18. //延时函数
  19. void delay1(uint i)
  20. {
  21.         while(i--);        
  22. }


  23. //显示函数1
  24. void display(uint dat,uchar add)
  25. {
  26. uchar bai,shi ,ge;
  27. bai=dat/100;
  28. shi=dat%100/10;
  29. ge=dat%10;                                                                                   
  30. writelcd_cmd(add);
  31. writelcd_dat(bai+0x30);
  32. writelcd_dat(shi+0x30);
  33. writelcd_cmd(add+3);
  34. writelcd_dat(ge+0x30);
  35. }


  36. //显示函数2
  37. void display2(uint dat,uchar add)
  38. {
  39. uchar bai,shi ;
  40. bai=dat/100;
  41. shi=dat%100/10;
  42. //ge=dat%10;                                                                                   
  43. writelcd_cmd(add);
  44. writelcd_dat(shi+0x30);
  45. writelcd_dat(bai+0x30);
  46. writelcd_cmd(add+3);
  47. //writelcd_dat(ge+0x30);
  48. }


  49. //显示函数3
  50. void display3(uint dat,uchar add)
  51. {
  52. uchar ge;
  53. //bai=dat/100;
  54. //shi=dat%100/10;
  55. ge=dat%10;                                                                                   
  56. writelcd_cmd(add);
  57. //writelcd_dat(shi+0x30);
  58. //writelcd_dat(bai+0x30);
  59. //writelcd_cmd(add+3);
  60. writelcd_dat(ge+0x30);
  61. }


  62. //按键扫描函数
  63. void keyscan()
  64. {  uchar i,j;
  65.    writelcd_cmd(0x80);
  66.    for(i=0;i<16;i++)
  67.    {writelcd_dat(t3[i]);}
  68.    writelcd_cmd(0xc0);
  69.    for(j=0;j<16;j++)
  70.    {writelcd_dat(t4[j]);}
  71.    
  72.    
  73.    while(mode!=0)
  74.    {
  75. display2(htem,0x8b);
  76. display3(time,0xca);
  77.    while(mode!=0)
  78.    {
  79.            switch(mode)
  80.            {
  81.            case 1:writelcd_cmd(0xc0+10);writelcd_cmd(0x0f);break;
  82.            case 2:writelcd_cmd(0x80+11);writelcd_cmd(0x0f);break;
  83.            default:mode=0;break;
  84.            }
  85.           if(key1==0&&mode==1)
  86.           {
  87.             
  88.                   delay(50);
  89.                   if(key1==0)
  90.                 {  
  91.                    cnt1++;
  92.                    while(key1==0);
  93.                    switch(cnt1%10)
  94.                    {
  95.                            case 1:time=1;min=1000;display3(time,0xca);writelcd_cmd(0xca+11);break;                         //1分钟
  96.                 case 2:time=2;min=2000;display3(time,0xca);writelcd_cmd(0xca+11);break;                         //2分钟
  97.                 case 3:time=3;min=3000;display3(time,0xca);writelcd_cmd(0xca+11);break;                         //3分钟
  98.                         case 4:time=4;min=4000;display3(time,0xca);writelcd_cmd(0xca+11);break;                         //4分钟
  99.                         case 5:time=5;min=5000;display3(time,0xca);writelcd_cmd(0xca+11);break;                         //5分钟
  100.                         case 6:time=6;min=6000;display3(time,0xca);writelcd_cmd(0xca+11);break;                         //6分钟
  101.                         case 7:time=7;min=7000;display3(time,0xca);writelcd_cmd(0xca+11);break;                         //7分钟
  102.                         case 8:time=8;min=8000;display3(time,0xca);writelcd_cmd(0xca+11);break;                         //8分钟
  103.                         case 9:time=9;min=9000;display3(time,0xca);writelcd_cmd(0xca+11);break;                         //9分钟
  104.                         
  105.                         default:break;        
  106.                    }        
  107.                 }
  108.           }

  109.          
  110.           if(key2==0&&mode==2)
  111.           {
  112.           delay(10);
  113.           if(key2==0)
  114.                   {
  115.                    cnt2++;
  116.                    while(key2==0);
  117.                    switch(cnt2%4)
  118.                    {
  119.                     case 1:htem=20;display2(htem,0x8b);writelcd_cmd(0x80+11);break;                  //20摄氏度
  120.                     case 2:htem=50;display2(htem,0x8b);writelcd_cmd(0x80+11);break;                  //50摄氏度
  121.                     case 3:htem=80;display2(htem,0x8b);writelcd_cmd(0x80+11);break;                  //80摄氏度
  122.                     default:break;
  123.                    }
  124.                   }
  125.           }
  126.    }
  127.   }
  128.   lcd_init();
  129. }


  130. //中断初始化函数
  131. void init()
  132. {
  133.   lcd_init();                   //lcd初始化
  134.    speaker=1;
  135.    red=0;
  136.    mode=0;
  137.    htem=20;
  138.    time=1;
  139.    EA=1;                                //总中断开启
  140.    EX0=1;                                //外部中断0允许
  141.    ET0=1;                                //定时器0允许
  142.    TMOD=0X01;                        //定时中断0,模式1
  143.    IT0=1;                                //下降沿触发
  144.    TH0=0Xee;                        //0.5us
  145.    TL0=0X00;
  146.    //TR0=0;
  147. }



  148. //主函数
  149. void main()
  150. {  
  151.     red=0;
  152.          init();                  //中断初始化
  153.         while(1)
  154.         {  
  155.                 if(mode!=0)
  156.                 {keyscan();}

  157.              else if(mode==0)
  158.                 {        
  159.                     delay(100);
  160.                     tmpchange();
  161.                         tem=tmp();                         //温度值获取

  162.                         if(tem>=(htem*10))                //高于设定温度
  163.                         {
  164.                           TR0=1;                                //中断开启
  165.                           red=1;                                  //报警灯亮                                            
  166.                         }
  167.                         else                                     //低于设定温度
  168.                         {
  169.                         TR0=0;                                        //中断关闭
  170.             red=0;                                //报警灯灭
  171.                         }
  172.                         
  173.                         delay(10);
  174.                     display(tem,0xca);
  175.                     delay(100);
  176.                         TR0=0;
  177.                           
  178.                 }
  179.         }
  180. }



  181. //外部中断服务函数
  182. void exter()interrupt 0
  183. {
  184. delay(50);                 //按键消抖
  185. if(P3^2==0)
  186. mode++;                        
  187. mode=mode%4 ;         //每按4次置0
  188. }


  189. //定时中断服务函数
  190. void timer0()interrupt 1
  191. {
  192. TH0=0Xee;                 //重装载
  193. TL0=0X00;
  194. min--;
  195. if(min<=0)                 //计时时间到
  196. {
  197.    red=1;         //报警灯闪烁
  198.    delay(200);
  199.    speaker=~speaker;delay1(1);          //蜂鸣器报警
  200.    TR0=0;                 //定时中断关闭
  201. }

  202. }
复制代码

所有资料51hei提供下载(求大神指点,如何加入pid啊):
PID温度控制.zip (126.37 KB, 下载次数: 294)

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

使用道具 举报

沙发
ID:754600 发表于 2020-5-31 10:37 来自手机 | 只看该作者
楼主把你这个继电器后面加一个OVEN,程序改一下,能够看出具体加热?
回复

使用道具 举报

板凳
ID:941784 发表于 2021-6-21 18:00 | 只看该作者
请问楼主有proteus运行代码吗?不是C语言的
回复

使用道具 举报

地板
ID:982706 发表于 2021-11-19 22:52 | 只看该作者
mzyyyds 发表于 2021-6-21 18:00
请问楼主有proteus运行代码吗?不是C语言的

用keil转换一下不就行了
回复

使用道具 举报

5#
ID:1026734 发表于 2022-5-16 10:27 来自手机 | 只看该作者
Proteus仿真是7.5版本的
回复

使用道具 举报

6#
ID:923472 发表于 2022-6-2 20:33 | 只看该作者
有人知道,这个时间设置的分钟数是用来干什么的吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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