找回密码
 立即注册

QQ登录

只需一步,快速开始

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

利用ds18b20制作恒温水浴锅的单片机程序+Proteus仿真

[复制链接]
跳转到指定楼层
楼主
ds18b20测水温,利用三个继电器控制三个加热棒加热(这里用电灯代替加热棒仿真,暂设计控温温度为36度),三个加热棒功率为大中小三个。当低于30度时,三个加热棒同时工作,当温度在30~35度时,小中两个加热棒工作,到达35度时只有小功率加热棒工作,36度时加热棒全部不工作。
注意:继电器的选择,恒温控需考虑PID,防止继电器震荡而加热棒温度猛烈增高不受控制,实验时也请使用小功率的加热棒实验,防止发生意外,切记。道路千万条,安全第一条,行车不规范,亲人两行泪(特别是使用220v供电加热棒)。

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


单片机源程序如下:
  1. /*板子引脚说明
  2. X0  PC7
  3. X1  PC6
  4. X2  PB15
  5. X3  PA1
  6. X4  PA0
  7. X5  PC4
  8. X6  PB12
  9. X7  PB14

  10. Y0  PC9
  11. Y1  PA8
  12. Y2  PA11
  13. Y3  PA12
  14. Y4  PD2
  15. Y5  PC12

  16. AD0 PC1
  17. AD1 PC2
  18. */

  19. #include "system.h"
  20. #include "SysTick.h"
  21. #include "led.h"
  22. #include "pwm.h"
  23. #define TIME_1MS 1000
  24. #define TIME_3min 36000000
  25. #define TRUE  1
  26. #define FALSE 0
  27. volatile  u32  timer_tick_count = 0; //定时器节拍
  28. volatile u32  timer_tick_count1 = 0; //建立任务池
  29. volatile u32  timer_tick_count2 = 0; //建立任务池
  30. static u16 Key_Value=0;
  31. static u16 Key_Value1=0;
  32. static u8 light_FG= FALSE;
  33. static u8 P_FG= FALSE;
  34. u16 value=0;
  35. u8 a=0;
  36. u8 i ;
  37. float vol=0;               
  38. int  PWM_TAB[10]={0,                 //白天不工作
  39.                                    200,             //晚上无人20%亮度
  40.                               1000             //有人亮度100%
  41.                              };
  42. u8 pwm=0;
  43. u8 key_SCAN;
  44. #define X0    PCin(7)                                                           
  45. //程序入口
  46. int main()
  47. {       
  48.         Output_GPIO_Init();   //输出GPIO 初始化。
  49.     ADCx_Init();       //AD初始化
  50.         TimerInit();//定时器初始化
  51.         while(1)
  52.         {
  53.                 /*Y0  PC9 Y1  PA8 Y2  PA11 Y3  PA12 Y4  PD2  Y5  PC12*/
  54.             /*ADC转换*/
  55.                  value=Get_ADC_Value(ADC_Channel_11,30);     //光电传感器,在没有放书的情况下,不会触发,只要放到上面有书籍,就要触发。
  56.                    vol=(float)value*(3.3/4096);    //转换完成之后的值
  57.            i=(int)vol;    //数据类型需要强制转换         
  58.               if(i>=1) //天黑的情况
  59.                   {
  60.                       light_FG= TRUE;
  61.                           a=1;   //占空比20%
  62.                           if(P_FG==TRUE)
  63.                           { light_FG= FALSE;
  64.                                   a=2;
  65.                           }
  66.                                   
  67.                           if(timer_tick_count1>2000)      //设置天黑有人的情况   红外识别   可认为是按键检测
  68.                           {timer_tick_count1=0;
  69.                   if(X0==1)
  70.                                   {
  71.                                   Key_Value=1;
  72.                                   }
  73.                                     if(X0==0)
  74.                                   {
  75.                                   Key_Value=0;
  76.                                   }
  77.                                   
  78.                              if(Key_Value== Key_Value1)
  79.                                  {
  80.                                           if( Key_Value==0)     //边沿处理
  81.                                           {Key_Value1= Key_Value;
  82.                                            light_FG= FALSE;
  83.                                            P_FG=TRUE;
  84.                                                 timer_tick_count2=0;
  85.                                a=2;
  86.                                           }
  87.                                  }  
  88.                           }
  89.                   }
  90.                    else
  91.                  {
  92.              GPIO_SetBits(GPIOC,GPIO_Pin_9);     //高电平无效   PC9对应Y0
  93.         //                 GPIO_ResetBits(GPIOC,GPIO_Pin_9);
  94.                           light_FG= FALSE;
  95.                   }  
  96.                  if( light_FG==TRUE)  
  97.            {                
  98.                            //PWM波输出,调节灯光亮度
  99.                                 if( timer_tick_count>=TIME_1MS)     //频率为1K    产生PWM波形                       
  100.                                   {        timer_tick_count=0;                   //周期值清零                                   
  101.                                   }                  
  102.                                 if( timer_tick_count<PWM_TAB[a])     //调节占空比
  103. //                                   GPIO_SetBits(GPIOC,GPIO_Pin_9);     //高电平无效   PC9对应Y0
  104.                                  {         GPIO_ResetBits(GPIOC,GPIO_Pin_9);   //低电平有效   PC9对应Y0
  105.                                   }               
  106.                                   else
  107.                                   { GPIO_SetBits(GPIOC,GPIO_Pin_9);     //高电平无效   PC9对应Y0
  108.                                
  109.                                    }
  110.                    }                 
  111.                   
  112.          if( P_FG==TRUE)  
  113.            {                
  114.                            //PWM波输出,调节灯光亮度
  115.                                 if( timer_tick_count>=TIME_1MS)     //频率为1K    产生PWM波形                       
  116.                                   {        timer_tick_count=0;                   //周期值清零                                   
  117.                                   }                  
  118. ……………………

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

所有资料51hei提供下载:
完成版 - 副本.rar (235.3 KB, 下载次数: 47)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:65956 发表于 2019-5-22 08:16 | 只看该作者
如果按你画的PCB板去作成品,肯定危险太大,而且肯定老会死机,一是你的继电器设计控制接口没有进行强弱电隔离措施,二是你的单片机晶振离单片机太远,一干扰单片机就挂了,看来是个布板新手
回复

使用道具 举报

板凳
ID:488831 发表于 2019-5-22 20:25 | 只看该作者
aking991 发表于 2019-5-22 08:16
如果按你画的PCB板去作成品,肯定危险太大,而且肯定老会死机,一是你的继电器设计控制接口没有进行强弱电 ...

对的,pcb还不熟
回复

使用道具 举报

地板
ID:488831 发表于 2019-5-22 20:32 | 只看该作者
aking991 发表于 2019-5-22 08:16
如果按你画的PCB板去作成品,肯定危险太大,而且肯定老会死机,一是你的继电器设计控制接口没有进行强弱电 ...

谢谢指教。
回复

使用道具 举报

5#
ID:488831 发表于 2019-5-22 20:38 | 只看该作者
aking991 发表于 2019-5-22 08:16
如果按你画的PCB板去作成品,肯定危险太大,而且肯定老会死机,一是你的继电器设计控制接口没有进行强弱电 ...

强弱电隔离措只要把220v的独立一块和其他线几乎没有交集就可以了吧?
回复

使用道具 举报

6#
ID:543840 发表于 2019-6-23 09:50 | 只看该作者
请问这个的PCB图和原理图有吗,你发的文件里面貌似没有
回复

使用道具 举报

7#
ID:488831 发表于 2019-6-24 15:30 | 只看该作者
浮梦先森 发表于 2019-6-23 09:50
请问这个的PCB图和原理图有吗,你发的文件里面貌似没有

原理图按照Proteus仿真图照搬过来加上电源模块就行了,加一下封装就可以画pcb了,因为这个的pcb当时我是刚刚学,随便画的,不怎么好,还是自己画一个吧。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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