|
有朝一日闻惊鸟,花落一方水长流。
前两天写的一个关于加热水壶的设计,只是一个原型,你们可以自己扩展设计。
一部分代码
一部分仿真
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
刚上电 进入初始化模式
依次按确认键 使用 + - 按键对需要的数值进行操作
设置完成后 自动进入工作
单片机源程序如下:
- #include "Stdfax.h"
- void main ()
- {
- Init();
- while(true)
- {
- DS18B20();
- System();
- Key();
- LCD_1602();
- delay_ms(100);
- }
- }
- /***********************************************************************************
- 函数介绍:系统定时器中断 Timer 0
- 函数说明:无
- 输入参数:无
- 输出参数:无
- ***********************************************************************************/
- void System_Timer_0_Isr (void) interrupt 1
- {
- LED_Timer_Flicker_Do();
- Timer_Cold_Ok_Delay_Do();
- System_Set_Flicker_Do();
- System_Set_End_Delay_Do();
- DS18B20_System_Timer_Count_Do();
- TL0 = THE_SYSTEM_COUNT_LOW; // 设置定时初值
- TH0 = THE_SYSTEM_COUNT_HIGH; // 设置定时初值
-
- }
复制代码- #include "Stdfax.h"
- struct SYSTEM_FLAG SYSTEM_DAT;
- unsigned long int Timer_Cold_Delay_Ms;
- unsigned long int Timer_Button_Delay_Ms;
- unsigned long int Timer_Set_Delay_MS;
- /***********************************************************************************
- 函数介绍:初始化
- 函数说明: 无
- 输入参数:
- 输出参数:无
- ***********************************************************************************/
- void Init()
- {
- LCD1602_Init();
- DS18B20_INIT();
- System_Date_Init();
- System_Sport_Init();
- Timer_Init_0();
-
- EA = 1 ; // 开启总中断
- delay_ms(200);
- }
- /***********************************************************************************
- 函数介绍:定时器0 全局初始化
- 函数说明:使用定时器 0
- 输入函数:无
- 输出参数:无
- ***********************************************************************************/
- void Timer_Init_0 (void)
- {
- ET0 = 1 ; // 定时中断
- TMOD |= 0x01; // 开启T0
- TL0 = THE_SYSTEM_COUNT_LOW; // 设置定时初值
- TH0 = THE_SYSTEM_COUNT_HIGH; // 设置定时初值
- TR0 = 1; // 开始计数
- }
- /***********************************************************************************
- 函数介绍:延时初始化
- 函数说明:制冷完成后等待3分钟才可开启压缩机
- 输入函数:无
- 输出参数:无
- ***********************************************************************************/
- void Timer_Cold_Ok_Delay_Init(void)
- {
- Timer_Cold_Delay_Ms = LED_LINK_3M;
- }
- /***********************************************************************************
- 函数介绍:延时执行
- 函数说明:制冷完成后等待3分钟才可开启压缩机
- 输入函数:无
- 输出参数:无
- ***********************************************************************************/
- void Timer_Cold_Ok_Delay_Do (void)
- {
- if(Timer_Cold_Delay_Ms)
- {
- if(-- Timer_Cold_Delay_Ms == 0)
- {
- SYSTEM_DAT.mode = MODE_RUN;
- SYSTEM_DAT.stuff = 0;
- }
- }
- }
- /***********************************************************************************
- 函数介绍:系统参数函数
- 函数说明: 无
- 输入参数:
- 输出参数:无
- ***********************************************************************************/
- void System_Date_Init()
- {
- SYSTEM_DAT.mode = MODE_RUN;
-
- SYSTEM_DAT.stuff = 0;
-
- SYSTEM_DAT.temperature = 0;
- SYSTEM_DAT.Hot_temperature_high = HOT_TEMPERATURE_NORMAL;
- SYSTEM_DAT.Hot_temperature_low = HOT_TEMPERATURE_LOW;
-
-
- SYSTEM_DAT.Clod_temperature_high = CLOD_TEMPERATURE_NORMAL;
- SYSTEM_DAT.Clod_temperature_low = CLOD_TEMPERATURE_LOW;
- }
- /***********************************************************************************
- 函数介绍:系统端口函数
- 函数说明: 无
- 输入参数:
- 输出参数:无
- ***********************************************************************************/
- void System_Sport_Init()
- {
- KEY0 = 1;
- KEY1 = 1;
- KEY2 = 1;
-
- LED_HEARTING = 1;
- LED_REFRIGERATION = 1;
-
- AIR_CLOSE;
- NOZZLE_CLOSE;
- BEEP_CLOSE;
- }
-
-
- /***********************************************************************************
- 函数介绍:启动加热程序
- 函数说明: 无
- 输入参数:
- 输出参数:无
- ***********************************************************************************/
- void System_Hot_Run()
- {
- 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)
- {
- SYSTEM_DAT.mode = MODE_TEMPERATURE_HEATING; // 进入加热模式
- AIR_OPEN;
- LED_HEARTING = 0;
- SYSTEM_DAT.stuff = 0;
- LED_Timer_Flicker_Init(1);
- }
- }
-
- /***********************************************************************************
- 函数介绍:检测是否加热完成
- 函数说明: 无
- 输入参数:
- 输出参数:无
- ***********************************************************************************/
- void System_Hot_Dection()
- {
- if(SYSTEM_DAT.temperature >= SYSTEM_DAT.Hot_temperature_high) // 加热完成
- {
- SYSTEM_DAT.mode = MODE_TEMPERATURE_OK; // 符号灯照常显示
- SYSTEM_DAT.stuff = 0;
- AIR_CLOSE; // 关闭加热
- LED_Timer_Flicker_Init(0);
- LED_HEARTING = 0;
- }
-
- System_Dry_Dection();
-
- }
-
-
- /***********************************************************************************
- 函数介绍:加热完成 等待确认函数据
- 函数说明: 无
- 输入参数:
- 输出参数:无
- ***********************************************************************************/
- char System_Hot_Dection_Ok()
- {
- if(SYSTEM_DAT.mode == MODE_TEMPERATURE_OK)
- {
- SYSTEM_DAT.mode = MODE_RUN;
- SYSTEM_DAT.mode_stuff = 0;
- SYSTEM_DAT.stuff = 0;
- LED_HEARTING = 1;
- return true;
- }
- return false;
- }
-
- /***********************************************************************************
- 函数介绍:启动制冷程序
- 函数说明: 无
- 输入参数:
- 输出参数:无
- ***********************************************************************************/
- void System_Cold_Run()
- {
- 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)
- {
- SYSTEM_DAT.mode = MODE_TEMPERATURE_FRARETION; // 进入制冷模式
- NOZZLE_OPEN;
- LED_REFRIGERATION = 0;
- SYSTEM_DAT.stuff = 0;
- LED_Timer_Flicker_Init(2);
- };
- }
-
- /***********************************************************************************
- 函数介绍:检测是否制冷完成
- 函数说明: 无
- 输入参数:
- 输出参数:无
- ***********************************************************************************/
- void System_Cold_Dection()
- {
- if(SYSTEM_DAT.temperature <= SYSTEM_DAT.Clod_temperature_high) // 制冷完成
- {
- SYSTEM_DAT.mode = MODE_TEMPERATURE_FRARETION_OK; // 符号灯照常显示
- SYSTEM_DAT.stuff = 0;
- NOZZLE_CLOSE; // 关闭制冷
- LED_Timer_Flicker_Init(0);
- LED_REFRIGERATION = 0;
- }
- }
-
-
- /***********************************************************************************
- 函数介绍:制冷完成 等待确认函数据
- 函数说明: 无
- 输入参数:
- 输出参数:无
- ***********************************************************************************/
- char System_Cold_Dection_Ok()
- {
- if(SYSTEM_DAT.mode == MODE_TEMPERATURE_FRARETION_OK)
- {
- SYSTEM_DAT.mode = MODE_TEMPERATURE_FRARETION_DELAY;
- SYSTEM_DAT.mode_stuff = 0;
- SYSTEM_DAT.stuff = 0;
- LED_REFRIGERATION = 1;
- Timer_Cold_Ok_Delay_Init();
- return true;
- }
- return false;
- }
- /***********************************************************************************
- 函数介绍:检测是否干烧
- 函数说明: 无
- 输入参数:
- 输出参数:无
- ***********************************************************************************/
- void System_Dry_Dection()
- {
- if(SYSTEM_DAT.temperature >= DRY_NORMAL) // 确认干烧
- {
- SYSTEM_DAT.mode = MODE_SUN_BEEP_NORMAL;
- SYSTEM_DAT.stuff = 0;
- BEEP_OPEN; // 打开蜂鸣器
- if(SYSTEM_DAT.temperature >= DRY_HIGH) // 到达干烧最大值
- {
- SYSTEM_DAT.mode = MODE_SUN_BEEP;
- System_Close(); // 关机
- }
- }
- else
- {
- BEEP_CLOSE;
- }
- }
-
- /***********************************************************************************
- 函数介绍:设置结束初始化
- 函数说明: 无
- 输入参数:
- 输出参数:无
- ***********************************************************************************/
- void System_Set_End_Delay_Init()
- {
- Timer_Button_Delay_Ms = LED_LINK_10S;
- }
-
-
- /***********************************************************************************
- 函数介绍:检测是否设置结束
- 函数说明: 无
- 输入参数:
- 输出参数:无
- ***********************************************************************************/
- void System_Set_End_Delay_Do()
- {
- if(Timer_Button_Delay_Ms)
- {
- if(-- Timer_Button_Delay_Ms == 0)
- {
- SYSTEM_DAT.mode = MODE_RUN;
- SYSTEM_DAT.mode_stuff = 0; // 关闭设置模式
- SYSTEM_DAT.stuff = 0;
- System_Set_Flicker_End();
- }
- }
- }
- /***********************************************************************************
- 函数介绍:自动关机
- 函数说明: 无
- 输入参数:
- 输出参数:无
- ***********************************************************************************/
- void System_Close()
- {
- Switch = 0;
- }
-
- /***********************************************************************************
- 函数介绍:设置时的数值闪烁 定时器初始化
- 函数说明: 无
- 输入参数:
- 输出参数:无
- ***********************************************************************************/
- void System_Set_Flicker_Init()
- {
- Timer_Set_Delay_MS = LED_LINK_500MS;
- }
-
- /***********************************************************************************
- 函数介绍:设置时的数值闪烁 定时器执行
- 函数说明: 无
- 输入参数:
- 输出参数:无
- ***********************************************************************************/
- void System_Set_Flicker_Do()
- {
- if(Timer_Set_Delay_MS)
- {
- if(-- Timer_Set_Delay_MS == 0)
- {
- System_Set_Flicker();
- System_Set_Flicker_Init();
- }
- }
- }
- /***********************************************************************************
- 函数介绍:设置时的数值闪烁 定时器执行
- 函数说明: 无
- 输入参数:
- 输出参数:无
- ***********************************************************************************/
- void System_Set_Flicker_End()
- {
- Timer_Set_Delay_MS = 0;
- SYSTEM_DAT.mode_stuff = 0;
- SYSTEM_DAT.mode = MODE_RUN;
- SYSTEM_DAT.stuff = 0;
- }
-
- /***********************************************************************************
- 函数介绍:设置时的数值闪烁
- 函数说明: 无
- 输入参数:
- 输出参数:无
- ***********************************************************************************/
- void System_Set_Flicker()
- {
- static char i = 0;
- if(i)
- {
-
-
- LCD1602_Show_Float_Need_Address(6, 3, SYSTEM_DAT.temperature);
- LCD1602_Show_Float_Need_Address(9,1, SYSTEM_DAT.Hot_temperature_low);
- LCD1602_Show_Float_Need_Address(13,1, SYSTEM_DAT.Hot_temperature_high);
- LCD1602_Show_Float_Need_Address(9,2, SYSTEM_DAT.Clod_temperature_low);
- LCD1602_Show_Float_Need_Address(13,2, SYSTEM_DAT.Clod_temperature_high);
- i = 0;
- }
- else
- {
- switch(SYSTEM_DAT.mode_stuff)
- {
-
-
- case MODE_SET_HOT_TEMPERATURE_UP :
- LCD1602_Show_String_Need_Address(13,1, " ");
- break;
-
- case MODE_SET_CLOD_TEMPERATURE_UP :
- LCD1602_Show_String_Need_Address(13,2, " ");
- break;
-
- }
- i = 1;
- }
- }
- /***********************************************************************************
- 函数介绍:系统主函数
- 函数说明: 无
- 输入参数:
- 输出参数:无
- ***********************************************************************************/
- void System()
- {
- if(SYSTEM_DAT.stuff == 0) // 无值改变
- {
-
- switch(SYSTEM_DAT.mode)
- {
- case MODE_TEMPERATURE_HEATING: // 加热
- case MODE_SUN_BEEP_NORMAL:
- case MODE_TEMPERATURE_OK:
- System_Hot_Dection(); // 检测是否加热完成函数
- break;
-
-
- case MODE_TEMPERATURE_FRARETION: // 制冷
- System_Cold_Dection(); // 检测是否制冷完成函数
- break;
- }
-
- }
- }
复制代码
所有资料51hei提供下载:
智能水壶.zip
(468.52 KB, 下载次数: 125)
|
评分
-
查看全部评分
|