找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机烧水壶程序设计+仿真+流程图+说明(防干烧)

  [复制链接]
跳转到指定楼层
楼主
  有朝一日闻惊鸟,花落一方水长流。
  前两天写的一个关于加热水壶的设计,只是一个原型,你们可以自己扩展设计。
一部分代码
一部分仿真

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




刚上电 进入初始化模式
依次按确认键  使用 + - 按键对需要的数值进行操作
设置完成后 自动进入工作

单片机源程序如下:
  1. #include "Stdfax.h"



  2. void main ()
  3. {

  4.     Init();
  5.            while(true)
  6.                                 {                                
  7.                   DS18B20();
  8.                                                                           System();                                
  9.                                                                                  Key();
  10.                                                      LCD_1602();
  11.                                               delay_ms(100);
  12.                                 }
  13. }




  14. /***********************************************************************************
  15.   函数介绍:系统定时器中断 Timer 0
  16.   函数说明:无
  17.   输入参数:无
  18.   输出参数:无
  19. ***********************************************************************************/
  20. void System_Timer_0_Isr (void)  interrupt 1
  21. {
  22.          LED_Timer_Flicker_Do();
  23.          Timer_Cold_Ok_Delay_Do();
  24.          System_Set_Flicker_Do();
  25.          System_Set_End_Delay_Do();
  26.          DS18B20_System_Timer_Count_Do();
  27.          TL0   = THE_SYSTEM_COUNT_LOW;                   // 设置定时初值
  28.   TH0   = THE_SYSTEM_COUNT_HIGH;                  // 设置定时初值
  29.          
  30. }
复制代码
  1. #include "Stdfax.h"


  2. struct SYSTEM_FLAG SYSTEM_DAT;
  3. unsigned long int Timer_Cold_Delay_Ms;
  4. unsigned long int Timer_Button_Delay_Ms;
  5. unsigned long int Timer_Set_Delay_MS;

  6. /***********************************************************************************
  7.   函数介绍:初始化
  8.   函数说明: 无
  9.   输入参数:
  10.   输出参数:无
  11. ***********************************************************************************/
  12. void Init()
  13. {
  14.                                 LCD1602_Init();
  15.            DS18B20_INIT();
  16.            System_Date_Init();
  17.            System_Sport_Init();
  18.     Timer_Init_0();     
  19.         
  20.            EA   = 1   ;        // 开启总中断
  21.            delay_ms(200);
  22. }




  23. /***********************************************************************************
  24.   函数介绍:定时器0 全局初始化
  25.   函数说明:使用定时器 0
  26.   输入函数:无
  27.   输出参数:无
  28. ***********************************************************************************/
  29. void Timer_Init_0 (void)
  30. {
  31.                  ET0   = 1   ;     // 定时中断
  32.           TMOD |= 0x01;     // 开启T0
  33.           TL0   = THE_SYSTEM_COUNT_LOW;                   // 设置定时初值
  34.           TH0   = THE_SYSTEM_COUNT_HIGH;                  // 设置定时初值
  35.           TR0   = 1;        // 开始计数
  36. }




  37. /***********************************************************************************
  38.   函数介绍:延时初始化
  39.   函数说明:制冷完成后等待3分钟才可开启压缩机
  40.   输入函数:无
  41.   输出参数:无
  42. ***********************************************************************************/
  43. void  Timer_Cold_Ok_Delay_Init(void)
  44. {
  45.                  Timer_Cold_Delay_Ms = LED_LINK_3M;
  46. }




  47. /***********************************************************************************
  48.   函数介绍:延时执行
  49.   函数说明:制冷完成后等待3分钟才可开启压缩机
  50.   输入函数:无
  51.   输出参数:无
  52. ***********************************************************************************/
  53. void  Timer_Cold_Ok_Delay_Do (void)
  54. {
  55.          if(Timer_Cold_Delay_Ms)
  56.                 {
  57.                          if(-- Timer_Cold_Delay_Ms == 0)
  58.                                 {   
  59.                                                                         SYSTEM_DAT.mode  = MODE_RUN;
  60.                                                                         SYSTEM_DAT.stuff = 0;
  61.                                 }
  62.                 }
  63. }




  64. /***********************************************************************************
  65.   函数介绍:系统参数函数
  66.   函数说明: 无
  67.   输入参数:
  68.   输出参数:无
  69. ***********************************************************************************/
  70. void System_Date_Init()
  71. {
  72.         SYSTEM_DAT.mode             = MODE_RUN;
  73.         
  74.         SYSTEM_DAT.stuff = 0;
  75.         
  76.         SYSTEM_DAT.temperature      = 0;
  77.         SYSTEM_DAT.Hot_temperature_high = HOT_TEMPERATURE_NORMAL;
  78.         SYSTEM_DAT.Hot_temperature_low  = HOT_TEMPERATURE_LOW;
  79.         
  80.         
  81. SYSTEM_DAT.Clod_temperature_high = CLOD_TEMPERATURE_NORMAL;
  82.         SYSTEM_DAT.Clod_temperature_low  = CLOD_TEMPERATURE_LOW;
  83. }




  84. /***********************************************************************************
  85.   函数介绍:系统端口函数
  86.   函数说明: 无
  87.   输入参数:
  88.   输出参数:无
  89. ***********************************************************************************/
  90. void System_Sport_Init()
  91. {
  92.         KEY0 = 1;
  93.         KEY1 = 1;
  94.         KEY2 = 1;
  95.         
  96.         LED_HEARTING = 1;
  97.         LED_REFRIGERATION = 1;
  98.         
  99.         AIR_CLOSE;
  100. NOZZLE_CLOSE;
  101. BEEP_CLOSE;
  102. }
  103.         
  104.         

  105. /***********************************************************************************
  106.   函数介绍:启动加热程序
  107.   函数说明: 无
  108.   输入参数:
  109.   输出参数:无
  110. ***********************************************************************************/
  111. void System_Hot_Run()
  112. {
  113.            if(SYSTEM_DAT.temperature < SYSTEM_DAT.Hot_temperature_high && SYSTEM_DAT.mode != MODE_TEMPERATURE_FRARETION && SYSTEM_DAT.mode != MODE_HUIDITY_BEEP && SYSTEM_DAT.mode != MODE_TEMPERATURE_FRARETION_OK)
  114.                                 {
  115.                                                 SYSTEM_DAT.mode  = MODE_TEMPERATURE_HEATING;  // 进入加热模式
  116.                                                 AIR_OPEN;
  117.                                                 LED_HEARTING = 0;
  118.                                                 SYSTEM_DAT.stuff = 0;
  119.                                                 LED_Timer_Flicker_Init(1);
  120.                                 }
  121. }
  122.         



  123. /***********************************************************************************
  124.   函数介绍:检测是否加热完成
  125.   函数说明: 无
  126.   输入参数:
  127.   输出参数:无
  128. ***********************************************************************************/
  129. void System_Hot_Dection()
  130. {
  131.            if(SYSTEM_DAT.temperature >= SYSTEM_DAT.Hot_temperature_high)  // 加热完成
  132.                                                 {
  133.                                                                         SYSTEM_DAT.mode = MODE_TEMPERATURE_OK;                                // 符号灯照常显示
  134.                                                                         SYSTEM_DAT.stuff = 0;
  135.                                                                         AIR_CLOSE;                                // 关闭加热
  136.                                                                         LED_Timer_Flicker_Init(0);        
  137.                                                           LED_HEARTING = 0;
  138.                                                         }
  139.                                        
  140.                                 System_Dry_Dection();
  141.                                                                                                                                                                                        
  142. }
  143.         
  144.         


  145. /***********************************************************************************
  146.   函数介绍:加热完成 等待确认函数据
  147.   函数说明: 无
  148.   输入参数:
  149.   输出参数:无
  150. ***********************************************************************************/
  151. char System_Hot_Dection_Ok()
  152. {
  153.                         if(SYSTEM_DAT.mode == MODE_TEMPERATURE_OK)
  154.            {   
  155.                                                 SYSTEM_DAT.mode  = MODE_RUN;
  156.                            SYSTEM_DAT.mode_stuff = 0;
  157.                            SYSTEM_DAT.stuff = 0;
  158.                            LED_HEARTING = 1;        
  159.       return true;                                       
  160.                                 }
  161.                                 return false;                        
  162. }
  163.         



  164. /***********************************************************************************
  165.   函数介绍:启动制冷程序
  166.   函数说明: 无
  167.   输入参数:
  168.   输出参数:无
  169. ***********************************************************************************/
  170. void System_Cold_Run()
  171. {
  172.   if(SYSTEM_DAT.mode != Timer_Cold_Ok_Delay_Do && SYSTEM_DAT.temperature > SYSTEM_DAT.Clod_temperature_high  && SYSTEM_DAT.mode != MODE_TEMPERATURE_HEATING && SYSTEM_DAT.mode != MODE_TEMPERATURE_BEEP && SYSTEM_DAT.mode != MODE_TEMPERATURE_OK &&  SYSTEM_DAT.mode != MODE_TEMPERATURE_FRARETION_DELAY)
  173.                 {
  174.                           SYSTEM_DAT.mode  = MODE_TEMPERATURE_FRARETION;  // 进入制冷模式
  175.                           NOZZLE_OPEN;
  176.                           LED_REFRIGERATION = 0;
  177.                                         SYSTEM_DAT.stuff  = 0;
  178.                           LED_Timer_Flicker_Init(2);
  179.                 };               
  180. }
  181.         



  182. /***********************************************************************************
  183.   函数介绍:检测是否制冷完成
  184.   函数说明: 无
  185.   输入参数:
  186.   输出参数:无
  187. ***********************************************************************************/
  188. void System_Cold_Dection()
  189. {
  190.                 if(SYSTEM_DAT.temperature <= SYSTEM_DAT.Clod_temperature_high)  // 制冷完成
  191.                 {
  192.                                         SYSTEM_DAT.mode = MODE_TEMPERATURE_FRARETION_OK;                                // 符号灯照常显示
  193.                                         SYSTEM_DAT.stuff = 0;
  194.                                         NOZZLE_CLOSE;                                       // 关闭制冷
  195.                                         LED_Timer_Flicker_Init(0);               
  196.                                  LED_REFRIGERATION = 0;
  197.                         }                                                                                                                                                
  198. }
  199.         
  200.         


  201. /***********************************************************************************
  202.   函数介绍:制冷完成 等待确认函数据
  203.   函数说明: 无
  204.   输入参数:
  205.   输出参数:无
  206. ***********************************************************************************/
  207. char System_Cold_Dection_Ok()
  208. {
  209.                         if(SYSTEM_DAT.mode == MODE_TEMPERATURE_FRARETION_OK)
  210.                                 {
  211.                                                                         SYSTEM_DAT.mode = MODE_TEMPERATURE_FRARETION_DELAY;
  212.                                                                         SYSTEM_DAT.mode_stuff = 0;
  213.                                                                         SYSTEM_DAT.stuff = 0;
  214.                                                                         LED_REFRIGERATION = 1;                        
  215.                                             Timer_Cold_Ok_Delay_Init();
  216.          return true;                                       
  217.                                 }
  218.                                 return false;                                
  219. }




  220. /***********************************************************************************
  221.   函数介绍:检测是否干烧
  222.   函数说明: 无
  223.   输入参数:
  224.   输出参数:无
  225. ***********************************************************************************/
  226. void System_Dry_Dection()
  227. {                                                                        
  228.           if(SYSTEM_DAT.temperature >= DRY_NORMAL)        // 确认干烧
  229.                                                 {
  230.                                                                                         SYSTEM_DAT.mode = MODE_SUN_BEEP_NORMAL;
  231.                                                                                         SYSTEM_DAT.stuff = 0;
  232.                                                                                         BEEP_OPEN;       // 打开蜂鸣器
  233.                                                                                         if(SYSTEM_DAT.temperature >= DRY_HIGH)  // 到达干烧最大值
  234.                                                                                         {
  235.                                                                                                                         SYSTEM_DAT.mode = MODE_SUN_BEEP;
  236.                                                                                                    System_Close(); // 关机
  237.                                                                                         }
  238.                                                 }               
  239.                                  else
  240.                                                 {
  241.                                                                                 BEEP_CLOSE;
  242.                                                 }
  243. }
  244.         



  245. /***********************************************************************************
  246.   函数介绍:设置结束初始化
  247.   函数说明: 无
  248.   输入参数:
  249.   输出参数:无
  250. ***********************************************************************************/
  251. void System_Set_End_Delay_Init()
  252. {
  253.   Timer_Button_Delay_Ms = LED_LINK_10S;
  254. }
  255.         
  256.         


  257.         /***********************************************************************************
  258.   函数介绍:检测是否设置结束
  259.   函数说明: 无
  260.   输入参数:
  261.   输出参数:无
  262. ***********************************************************************************/
  263. void System_Set_End_Delay_Do()
  264. {
  265.          if(Timer_Button_Delay_Ms)
  266.                 {
  267.                          if(-- Timer_Button_Delay_Ms == 0)
  268.                                 {
  269.                                                                         SYSTEM_DAT.mode  = MODE_RUN;
  270.                                             SYSTEM_DAT.mode_stuff = 0;                                // 关闭设置模式
  271.                                                                         SYSTEM_DAT.stuff = 0;
  272.                                             System_Set_Flicker_End();
  273.                                 }
  274.                 }         
  275. }




  276. /***********************************************************************************
  277.   函数介绍:自动关机
  278.   函数说明: 无
  279.   输入参数:
  280.   输出参数:无
  281. ***********************************************************************************/
  282. void System_Close()
  283. {
  284.   Switch = 0;
  285. }
  286.         



  287. /***********************************************************************************
  288.   函数介绍:设置时的数值闪烁  定时器初始化
  289.   函数说明: 无
  290.   输入参数:
  291.   输出参数:无
  292. ***********************************************************************************/
  293. void System_Set_Flicker_Init()
  294. {
  295.    Timer_Set_Delay_MS = LED_LINK_500MS;
  296. }
  297.         



  298. /***********************************************************************************
  299.   函数介绍:设置时的数值闪烁  定时器执行
  300.   函数说明: 无
  301.   输入参数:
  302.   输出参数:无
  303. ***********************************************************************************/
  304. void System_Set_Flicker_Do()
  305. {
  306.    if(Timer_Set_Delay_MS)
  307.                         {
  308.                            if(-- Timer_Set_Delay_MS == 0)
  309.                                                 {
  310.                                                           System_Set_Flicker();
  311.                 System_Set_Flicker_Init();
  312.                                                 }
  313.                         }
  314. }




  315. /***********************************************************************************
  316.   函数介绍:设置时的数值闪烁  定时器执行
  317.   函数说明: 无
  318.   输入参数:
  319.   输出参数:无
  320. ***********************************************************************************/
  321. void System_Set_Flicker_End()
  322. {
  323.    Timer_Set_Delay_MS = 0;
  324.           SYSTEM_DAT.mode_stuff = 0;
  325.           SYSTEM_DAT.mode = MODE_RUN;
  326.           SYSTEM_DAT.stuff = 0;
  327. }
  328.         



  329. /***********************************************************************************
  330.   函数介绍:设置时的数值闪烁
  331.   函数说明: 无
  332.   输入参数:
  333.   输出参数:无
  334. ***********************************************************************************/
  335. void System_Set_Flicker()
  336. {
  337.           static char i = 0;

  338.                         if(i)
  339.                         {
  340.                                                 
  341.                                                                         
  342.                                                                           LCD1602_Show_Float_Need_Address(6, 3, SYSTEM_DAT.temperature);
  343.                                                                                                                                   LCD1602_Show_Float_Need_Address(9,1, SYSTEM_DAT.Hot_temperature_low);
  344.                                                                                                                                   LCD1602_Show_Float_Need_Address(13,1, SYSTEM_DAT.Hot_temperature_high);

  345.                                                                                                                                   LCD1602_Show_Float_Need_Address(9,2, SYSTEM_DAT.Clod_temperature_low);
  346.                                                                                                                                   LCD1602_Show_Float_Need_Address(13,2, SYSTEM_DAT.Clod_temperature_high);
  347.                                         i = 0;
  348.                                 }
  349.                                 else
  350.                                 {
  351.                                                 switch(SYSTEM_DAT.mode_stuff)
  352.                                                                                                 {
  353.                                                                                                         
  354.                                                                                                                                 
  355.                                                                                                                                 case MODE_SET_HOT_TEMPERATURE_UP :                                 
  356.                                                                                                                                                                                                                                                                                                                                                                                                                         LCD1602_Show_String_Need_Address(13,1, "   ");                                                                                                                                                                                                                                       
  357.                                                                                                                                                                                                                                                                                                                                                                                                                         break;
  358.                                                                                                                                 
  359.                                                                                                                                 case MODE_SET_CLOD_TEMPERATURE_UP :  
  360.                                                                                                                                                                                                                                                                                                                                                                                                                         LCD1602_Show_String_Need_Address(13,2, "   ");
  361.                                                                                                                                                                                                                                                                                                                                                                                                                         break;
  362.                                                                                                                                 
  363.                                                                                                 }
  364.                                          i = 1;                                                                                                
  365.                                 }
  366. }





  367. /***********************************************************************************
  368.   函数介绍:系统主函数
  369.   函数说明: 无
  370.   输入参数:
  371.   输出参数:无
  372. ***********************************************************************************/
  373. void System()
  374. {
  375.                         if(SYSTEM_DAT.stuff == 0)                         // 无值改变
  376.                         {
  377.                                                 

  378.                                   switch(SYSTEM_DAT.mode)
  379.                                                  {
  380.                                                           case MODE_TEMPERATURE_HEATING:                  // 加热
  381.                                                                         case MODE_SUN_BEEP_NORMAL:
  382.                                                                         case MODE_TEMPERATURE_OK:
  383.                                                                                                                           System_Hot_Dection();    // 检测是否加热完成函数                                                                                                                                                                                                                                
  384.                                                                         break;
  385.                                                 
  386.                                                                                                                                                                                                                                                                                                                
  387.                                                           case MODE_TEMPERATURE_FRARETION:                      // 制冷
  388.                                                                                                                                                                                                                                                                                            System_Cold_Dection();   // 检测是否制冷完成函数                                                                                                                                                                                                                                
  389.                                                                                                             break;
  390.                                                                 }
  391.                                                                
  392.                                         }
  393. }
复制代码



所有资料51hei提供下载:
智能水壶.zip (468.52 KB, 下载次数: 121)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:689290 发表于 2020-2-1 21:57 | 只看该作者
怎么打开嘛=  =,下载之后一脸懵
回复

使用道具 举报

板凳
ID:689425 发表于 2020-2-2 21:21 | 只看该作者
收藏了,谢谢楼主
回复

使用道具 举报

地板
ID:432653 发表于 2020-2-21 16:10 | 只看该作者
沦落人 发表于 2020-2-1 21:57
怎么打开嘛=  =,下载之后一脸懵

按加热那个按键,我试过了,就是那个显示屏贵了点
回复

使用道具 举报

5#
ID:742168 发表于 2020-5-8 18:30 | 只看该作者
下载后运行发现led全部missing了,水平不够看不出问题在哪里。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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