找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机水温控制器设计(仿真图+程序,参考资料)

  [复制链接]
跳转到指定楼层
楼主
一升水在1kw电炉下加热,要求水温在一定范围内可由人工设定,并能在环境温度降低时自动调节,以保证设定的温度基本不变。设计一个可以驱动1kW加热负载的水温控制器,具体要求如下
(1)能够测量温度,温度用数字显示。
(2)测量温度范围0~100℃,测量精度为0.5℃。
(3)能够设置水温控制温度,设定范围40~90℃,且连续可调。
(4)水温控制精度≤ 2℃。
(5)当超过设定的温度20℃时,产生声、光报警。

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


单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include<wendu.h>

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. sbit key1=P3^0;
  7. sbit key2=P3^1;
  8. sbit key3=P3^2;
  9. sbit key4=P3^6;
  10. sbit led1=P3^7;
  11. sbit led=P3^3;
  12. sbit shenwen=P3^4;
  13. sbit baojing=P3^5;
  14.         
  15. uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xbf,0xc7,0x89};
  16. uchar code tab3[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x3f,0xff};

  17. uchar yi,er,san,si,san1;
  18. uint shangxian=90,xiaxian=40,flag=0,teding=20,ling=0,bai=100;

  19. void delay(int ma);
  20. void display1(uchar yi,uchar er,uchar san,uchar si);
  21. void display2(uchar yi,uchar er,uchar san1,uchar si);
  22. void keyscan();

  23. void main()
  24. {
  25.           float wendu=0;
  26.           int wenduzhen=0;

  27.           yi=11;er=11;san=11;si=11;
  28.           shenwen=1;//关闭继电器
  29.                
  30.           while(1)
  31.                 {
  32.                   keyscan();

  33.                   if(flag==0)//温度测试界面
  34.                   {
  35.                           wendu=temget();
  36.                                 
  37.                           if(wendu<xiaxian)//烧水
  38.                           {
  39.                                           shenwen=0;
  40.                           }
  41.                           else if(wendu>=xiaxian)
  42.                           {
  43.                                         shenwen=1;//烧水功能关闭
  44.                           }
  45.                            
  46.                           if(((wendu>=teding)&&(key4==0)))//报警开启
  47.                           {
  48.                                         baojing=0;
  49.                                                                         
  50.                           }
  51.                            else if((wendu<teding))//报警关闭
  52.                           {
  53.                                  baojing=1;
  54.                            
  55.                           }

  56.                           if(((wendu>=teding)))//报警开启
  57.                           {
  58.                                        
  59.                                         led1=1;                                                
  60.                           }
  61.                            else if((wendu<teding))//报警关闭
  62.                           {
  63.                                  
  64.                              led1=0;
  65.                           }

  66.                           wenduzhen=wendu*10;
  67.                       yi=wenduzhen/1000;
  68.                           er=wenduzhen%1000/100;
  69.                           san=wenduzhen%100/10;
  70.                           si=wenduzhen%10;         
  71.                           
  72.                           display1(yi,er,san,si);
  73.                   }
  74.                
  75.                   else         if(flag==1)//温度下限设置界面
  76.                    {
  77.                            yi=13;er=12;
  78.                       san1=xiaxian%100/10;
  79.                       si=xiaxian%10;
  80.                                  
  81.                           display2(yi,er,san1,si);
  82.                   }

  83.                   else         if(flag==2)//温度上限设置界面
  84.                    {
  85.                            yi=14;er=12;
  86.                       san1=shangxian%100/10;
  87.                       si=shangxian%10;
  88.                                  
  89.                           display2(yi,er,san1,si);
  90.                   }
  91.                  
  92.                   if((wendu>shangxian)||(wendu<xiaxian))//温度超过上限低于下限led亮
  93.                   {
  94.                   led=0;         
  95.                   }
  96.                   else if((wendu>=xiaxian)&&(wendu<=shangxian))
  97.                   {
  98.                   led=1;
  99.                   }
  100.                   

  101.                 }
  102. }

  103. void keyscan()
  104. {
  105.         if(key1==0)//设置界面
  106.         {
  107.                 delay(5);
  108.                 if(key1==0)
  109.                 {
  110.                   flag++;
  111.                   if(flag>2)flag=0;
  112.                 }
  113.                 while(!key1);        
  114.         }

  115.           if(key2==0)//加数值
  116.         {
  117.                 delay(5);
  118.                 if(key2==0)
  119.                 {
  120.                           if(flag==1)
  121.                         {
  122.                                 xiaxian++;
  123.                                 if(xiaxian>=89)xiaxian=89;
  124.                         }
  125.                         else if(flag==2)
  126.                         {
  127.                                 shangxian++;
  128.                                 if(shangxian>=90)shangxian=90;
  129.                         }
  130.                 }
  131.                 while(!key2);        
  132.         }

  133.         if(key3==0)//减数值
  134.         {
  135.                 delay(5);
  136.                 if(key3==0)
  137.                 {
  138.                           if(flag==1)
  139.                         {
  140.                                 xiaxian--;
  141.                                 if(xiaxian<0)xiaxian=0;
  142.                         }
  143.                         else if(flag==2)
  144.                         {
  145.                                 shangxian--;
  146.                                 if(shangxian<1)xiaxian=1;
  147.                         }
  148.                 }
  149.                 while(!key3);        
  150.         }
  151.         
  152.         
  153. }

  154. void display1(uchar yi,uchar er,uchar san,uchar si)
  155. {
  156.                 P2=0X01;
  157.                 P0=tab[yi];
  158.                 delay(1);
  159.         
  160.                 P2=0X02;
  161.                 P0=tab[er];
  162.                 delay(1);

  163.                 P2=0X04;
  164.                 P0=tab3[san];
  165.                 delay(1);
  166.         
  167.                 P2=0X08;
  168.                 P0=tab[si];
  169.                 delay(1);
  170. }

  171. void display2(uchar yi,uchar er,uchar san1,uchar si)
  172. {
  173.                 P2=0X01;
  174.                 P0=tab[yi];
  175.                 delay(1);
  176.         
  177.                 P2=0X02;
  178.                 P0=tab[er];
  179.                 delay(1);

  180.                 P2=0X04;
  181.                 P0=tab[san1];
  182.                 delay(1);
  183.         
  184.                 P2=0X08;
  185.                 P0=tab[si];
  186.                 delay(1);
  187. }

  188. void delay(int ms)
  189. {
  190.                 int i,a;
  191.                 for(i=ms;i>0;i--)
  192.                   for(a=125;a>0;a--);
  193. }
复制代码

所有资料51hei提供下载:
仿真图.zip (86.27 KB, 下载次数: 139)
参考资料.7z (1.44 MB, 下载次数: 138)


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

使用道具 举报

沙发
ID:502881 发表于 2020-3-25 13:50 | 只看该作者
很好,很喜欢,谢谢分享
回复

使用道具 举报

板凳
ID:718463 发表于 2020-3-30 10:53 | 只看该作者
proteus8.9闪退 报错  仿真不了
回复

使用道具 举报

地板
ID:786077 发表于 2020-6-22 15:54 | 只看该作者
这个闸刀开关是干嘛的
回复

使用道具 举报

5#
ID:786077 发表于 2020-6-22 15:54 | 只看该作者
这个闸刀开关是干嘛的
回复

使用道具 举报

6#
ID:786077 发表于 2020-6-22 16:34 | 只看该作者
要怎么设定温度,就上下限 如何确定啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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