凡亿教育-思敏
凡事用心,一起进步
打开APP
公司名片
凡亿问答 | 51单片机水温控制系统Proteus仿真程序 LCD1602显示
51单片机水温控制系统Proteus仿真程序 LCD1602显示

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

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
b76857085025d852b745dcf8f25d11.pngb8a01adfc7c20372a9cbfb8357cd18.pngb7e52308f851d961da54efc8363c23.pngb08ffc642e12b431d9b708b50ad0f6.png

单片机源程序如下:

  1. #include
  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. }

PID温度控制.zip (126.37 KB, 下载次数: )
2020-5-22 23:44 上传
点击文件名下载附件
下载积分: 黑币 -5


5个回答
楼主把你这个继电器后面加一个OVEN,程序改一下,能够看出具体加热?
请问楼主有proteus运行代码吗?不是C语言的

用keil转换一下不就行了
Proteus仿真是7.5版本的
有人知道,这个时间设置的分钟数是用来干什么的吗
热门问答
我来回答
首页
5
0
0