找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5|回复: 2
收起左侧

单片机程序 2个NTC测温电饭煲,功能正常不?

[复制链接]
ID:675799 发表于 2026-7-30 09:06 | 显示全部楼层 |阅读模式
  1. #include "stc8g.h"
  2. #include "intrins.h"

  3. //通用基础类型重定义,适配STC8G 8位单片机
  4. typedef unsigned char uint8_t;
  5. typedef unsigned int  uint16_t;
  6. typedef bit BOOL;

  7. /*****************************
  8. IO口模式配置宏 STC8G端口四种模式
  9. M1 M0
  10. 0 0 准双向口(默认上电状态)
  11. 0 1 推挽输出(驱动继电器、蜂鸣器、LED推荐)
  12. 1 0 高阻输入(ADC、NTC、按键必须配置此模式)
  13. 1 1 开漏输出
  14. *****************************/
  15. #define SET_PIN_PUSHPORT(port,pin)    do{ port##M1 &= ~(1U<<pin); port##M0 |=  (1U<<pin); }while(0)
  16. #define SET_PIN_HIZ_IN(port,pin)      do{ port##M1 |=  (1U<<pin); port##M0 &= ~(1U<<pin); }while(0)
  17. #define SET_PIN_QUASI(port,pin)       do{ port##M1 &= ~(1U<<pin); port##M0 &= ~(1U<<pin); }while(0)
  18. #define SET_PIN_OD(port,pin)          do{ port##M1 |=  (1U<<pin); port##M0 |=  (1U<<pin); }while(0)

  19. /*****************************
  20. 看门狗操作宏,防止程序死机跑飞
  21. *****************************/
  22. #define WDT_ENABLE()    do{ WDTCR = 0xA6; }while(0)  //开启看门狗
  23. #define WDT_FEED()      do{ WDTCR = 0x56; }while(0)  //喂狗清零看门狗计数器

  24. /*****************************
  25. ADC采样配置:每次采集8次,剔除最大、最小值,剩余6个取平均降噪
  26. 适配两路50K NTC、分压式ADC按键
  27. *****************************/
  28. #define ADC_SAMPLE_NUM  8U

  29. /*****************************
  30. 底盘加热断线检测参数 适配4L 800W底盘+100W上盖
  31. 仅烹饪大火阶段检测;保温屏蔽检测避免间歇加热误报
  32. 时基100ms/tick
  33. HEAT_CHECK_TIME=1800 → 1800*100ms=180s=3分钟检测窗口
  34. HEAT_RISE_THRESHOLD=4 → 3分钟锅底NTC升温不足4℃判定异常
  35. HEAT_MAX_CHECK_CNT=2 → 连续2次检测不合格报加热断线故障
  36. *****************************/
  37. #define HEAT_CHECK_TIME     1800
  38. #define HEAT_RISE_THRESHOLD 4
  39. #define HEAT_MAX_CHECK_CNT  2

  40. /*****************************
  41. NTC硬件保护阈值 硬件为两路50K NTC,ADC为10bit(0~1023)
  42. NTC_AD_SHORT_LIMIT:ADC数值过小=电阻趋近0=NTC短路
  43. NTC_AD_OPEN_LIMIT:ADC数值过大=电阻无穷大=NTC断线开路
  44. *****************************/
  45. #define NTC_AD_SHORT_LIMIT    15
  46. #define NTC_AD_OPEN_LIMIT     999

  47. /*****************************
  48. 温控温度参数
  49. DRY_PROTECT_TEMP:干烧保护105℃,超温切断全部加热
  50. TEMP_WARM_LOW:保温下限62℃,低于则开启加热
  51. TEMP_WARM_HIGH:保温上限68℃,高于则关闭加热
  52. *****************************/
  53. #define DRY_PROTECT_TEMP      105
  54. #define TEMP_WARM_LOW         62
  55. #define TEMP_WARM_HIGH        68

  56. /*****************************
  57. 预约、LED闪烁、按键时间配置,全部基于100ms系统tick
  58. SCHEDULE_SET_TIME:预约时长循环计时
  59. TIME_LED_BLINK_PERIOD:LED闪烁基础计数
  60. ORDER_SELECT_TIME:预约功能选择停留计时
  61. WARM_MAX_TIME:最长保温时长 7200*100ms=120分钟,超时自动停机
  62. HOUR_TO_TICK:1小时换算tick数,1h=3600个100ms
  63. *****************************/
  64. #define SCHEDULE_SET_TIME     180
  65. #define TIME_LED_BLINK_PERIOD  5
  66. #define ORDER_SELECT_TIME     80
  67. #define WARM_MAX_TIME        7200
  68. #define HOUR_TO_TICK          3600U

  69. /*****************************
  70. 各烹饪模式总运行时长(100ms为单位)
  71. TIME_COOK_FINE:精煮
  72. TIME_COOK_FAST:快煮
  73. TIME_PORRIDGE:煮粥
  74. TIME_STEAM:蒸菜
  75. *****************************/
  76. #define TIME_COOK_FINE       3000
  77. #define TIME_COOK_FAST       1920
  78. #define TIME_PORRIDGE        5400
  79. #define TIME_STEAM           2400

  80. #define NTC_TEMP_MAX          126U  //NTC温度表最大索引温度

  81. /*****************************
  82. 【已全部重改故障码】全局故障代码枚举(按要求上盖NTC改为3、4,其余顺延)
  83. FAULT_NONE=0:无故障
  84. FAULT_NTC_SHORT=1:锅底NTC短路
  85. FAULT_NTC_OPEN=2:锅底NTC开路
  86. FAULT_LID_NTC_SHORT=3:上盖NTC短路(原5)
  87. FAULT_LID_NTC_OPEN=4:上盖NTC开路(原6)
  88. FAULT_DRY_HEAT=5:干烧过热保护(原3)
  89. FAULT_HEAT_BROKEN=6:底盘800W加热回路断线故障(原4)
  90. *****************************/
  91. #define FAULT_NONE        0
  92. #define FAULT_NTC_SHORT   1
  93. #define FAULT_NTC_OPEN    2
  94. #define FAULT_LID_NTC_SHORT 3
  95. #define FAULT_LID_NTC_OPEN  4
  96. #define FAULT_DRY_HEAT    5
  97. #define FAULT_HEAT_BROKEN 6

  98. /*****************************
  99. 煮粥防溢温控参数
  100. PORRIDGE_BOIL_BASE_TEMP:判定水即将沸腾基础温度88℃
  101. PORRIDGE_LID_RISE_SLOPE:上盖温度上升斜率阈值,温升过快判定溢锅
  102. PORRIDGE_ANTI_OVER_OFF_TICK:溢锅后停火时长
  103. PORRIDGE_SOFT_BOIL_HEAT_TICK:小火加热时长
  104. PORRIDGE_SOFT_BOIL_WAIT_TICK:间歇停火时长
  105. *****************************/
  106. #define PORRIDGE_BOIL_BASE_TEMP    88
  107. #define PORRIDGE_LID_RISE_SLOPE    2
  108. #define PORRIDGE_ANTI_OVER_OFF_TICK  120
  109. #define PORRIDGE_SOFT_BOIL_HEAT_TICK  60
  110. #define PORRIDGE_SOFT_BOIL_WAIT_TICK 180

  111. #define BLINK_CNT 10   //LED闪烁周期10*100ms=1s
  112. #define TICK_50MS_CNT 2//2次50ms中断拼成100ms系统主节拍

  113. /*****************************
  114. ADC分压式按键通道定义 P1口多路ADC按键
  115. KEY_CH_FINE=P1.2 精煮
  116. KEY_CH_PORRIDGE=P1.3 煮粥
  117. KEY_CH_STEAM=P1.4 蒸制
  118. KEY_CH_ORDER=P1.5 预约
  119. KEY_CH_WARM=P1.6 保温
  120. KEY_CH_EXT=P1.7 快煮
  121. KEY_AD_PRESS_THRESHOLD:ADC低于该值判定按键按下
  122. KEY_FILTER_CNT:按键防抖滤波次数
  123. *****************************/
  124. #define KEY_CH_FINE     2
  125. #define KEY_CH_PORRIDGE 3
  126. #define KEY_CH_STEAM    4
  127. #define KEY_CH_ORDER    5
  128. #define KEY_CH_WARM     6
  129. #define KEY_CH_EXT      7
  130. #define KEY_AD_PRESS_THRESHOLD  660
  131. #define KEY_FILTER_CNT 3

  132. /*****************************
  133. 硬件引脚定义 STC8G1K17引脚分配
  134. LED_TIME1~LED_TIME6:预约小时指示灯
  135. RELAY_HEAT:底盘800W加热继电器输出
  136. RELAY_COVER:上盖100W加热继电器输出
  137. BEEP:有源蜂鸣器,高电平鸣叫
  138. FUN_OUT/HOLD_KEY_IO:预留功能IO
  139. 两路NTC:AIN0(P0.0)=锅底50K NTC,AIN1(P0.1)=上盖50K NTC
  140. *****************************/
  141. sbit LED_TIME1 = P1^0;
  142. sbit LED_TIME2 = P1^1;
  143. sbit LED_TIME3 = P3^0;
  144. sbit LED_TIME4 = P3^1;
  145. sbit LED_TIME5 = P3^4;
  146. sbit LED_TIME6 = P3^5;

  147. sbit FUN_OUT    = P3^2;
  148. sbit HOLD_KEY_IO= P3^3;

  149. sbit RELAY_HEAT = P2^0;    //底盘800W加热继电器输出
  150. sbit RELAY_COVER= P2^1;    //上盖100W辅助加热继电器输出
  151. sbit BEEP       = P2^2;    //蜂鸣器驱动

  152. /*****************************
  153. 50K NTC ADC对照表(10bit)
  154. 数组下标=温度(℃),数组值=对应ADC采样值;用于AD值转温度查表
  155. 适配50K B值3950常规电饭煲NTC
  156. *****************************/
  157. unsigned int code NTCcode[] = {
  158. 68,71,74,77,80,83,87,90,94,97,
  159. 101,105,109,113,117,122,126,131,135,140,
  160. 145,150,155,160,165,171,176,182,187,193,
  161. 199,205,211,217,223,230,236,242,249,256,
  162. 262,269,276,283,290,297,304,311,318,325,
  163. 332,340,347,354,362,369,377,384,391,399,
  164. 406,414,421,429,436,444,451,459,466,473,
  165. 481,488,495,502,510,517,524,531,538,545,
  166. 552,559,566,572,579,586,592,599,605,612,
  167. 618,624,630,636,642,648,654,660,666,672,
  168. 677,683,688,694,699,704,709,714,719,724,
  169. 729,734,739,743,748,752,757,761,766,770,
  170. 774,778,782,786,790,794,798
  171. };

  172. /*****************************
  173. 系统运行状态枚举
  174. ST_IDLE:待机空闲
  175. ST_WARM:保温模式
  176. ST_ORDER_SET:预约小时设置
  177. ST_ORDER_SELECT:预约选择烹饪功能
  178. ST_ORDER:预约倒计时等待
  179. ST_COOK_FINE:精煮
  180. ST_COOK_FAST:快煮
  181. ST_PORRIDGE:煮粥
  182. ST_STEAM:蒸制
  183. *****************************/
  184. enum SYS_STATE
  185. {
  186.     ST_IDLE,
  187.     ST_WARM,
  188.     ST_ORDER_SET,
  189.     ST_ORDER_SELECT,
  190.     ST_ORDER,
  191.     ST_COOK_FINE,
  192.     ST_COOK_FAST,
  193.     ST_PORRIDGE,
  194.     ST_STEAM
  195. };

  196. /*****************************
  197. 全局运行变量定义
  198. *****************************/
  199. enum SYS_STATE sys_state = ST_IDLE;

  200. uint16_t schedule_hour = 1;        //预约小时数1~12h
  201. uint16_t schedule_set_timer;
  202. uint16_t order_select_timer;
  203. uint16_t order_timer;              //烹饪/预约倒计时tick
  204. uint16_t time_led_blink_tmr;

  205. uint16_t hold_io_tmr;
  206. bit hold_io_out_flag = 0;

  207. uint16_t timer_cnt;
  208. bit heat_flag = 0;                 //总加热使能标志位,1=允许开加热
  209. uint8_t schedule_target_state;     //预约倒计时结束要跳转的烹饪模式

  210. uint16_t warm_total_timer;         //保温累计计时,用于120min超时停机
  211. uint8_t key_val = 0;
  212. uint8_t key_buf = 0;               //按键缓冲区,有新按键存放此处

  213. uint16_t bottom_temp;              //锅底实时温度℃
  214. uint16_t lid_temp;                 //上盖实时温度℃
  215. uint16_t adc_bottom;               //锅底NTC原始ADC值
  216. uint16_t adc_lid;                  //上盖NTC原始ADC值
  217. uint8_t fault_code = FAULT_NONE;   //全局故障码

  218. /*****************************
  219. 底盘加热断线检测专用全局变量
  220. heat_check_tmr:检测窗口计时
  221. heat_start_temp:本次检测起始锅底温度
  222. heat_check_cnt:温升不合格累计次数
  223. heat_detect_enable:断线检测总开关
  224. *****************************/
  225. uint16_t heat_check_tmr = 0;
  226. uint16_t heat_start_temp = 0;
  227. uint8_t heat_check_cnt = 0;
  228. bit heat_detect_enable = 0;

  229. uint16_t cover_heat_tmr = 0;
  230. bit cover_heat_run = 0;

  231. bit TMR_50MS_FLAG = 0;             //50ms中断标志
  232. uint8_t tick_100ms_cnt = 0;
  233. bit TMR_100MS_FLAG = 0;            //100ms系统主节拍标志

  234. uint16_t lid_temp_last = 0;        //上盖上次温度,用于计算温升斜率
  235. int16_t  lid_temp_slope = 0;       //上盖温度变化斜率
  236. uint16_t anti_overflow_timer = 0;  //煮粥防溢计时
  237. bit anti_overflow_flag = 0;        //溢锅停机标志

  238. uint8_t beep_ctrl_tmr = 0;         //按键/完成蜂鸣时长计时
  239. uint8_t beep_period_tmr = 0;       //故障间歇蜂鸣周期计时
  240. uint8_t key_scan_code = 0;
  241. uint8_t key_filter_cnt = 0;        //按键防抖计数

  242. bit cook_running = 0;              //烹饪运行总标志,1=正在工作

  243. uint8_t led_blink_tmr = 0;
  244. bit led_blink_flag = 0;            //LED闪烁翻转标志

  245. /*****************************
  246. 全部函数前置声明
  247. *****************************/
  248. void Sys_Init(void);
  249. void Clock_Set_24M(void);
  250. void Clock_Set_12M(void);
  251. void ADC_Init_4M(void);
  252. void Timer0_Init_50ms_24M(void);
  253. void Beep_Short(void);
  254. void Beep_Complete(void);
  255. void Beep_FaultTick(void);
  256. void All_Led_Off(void);
  257. void Refresh_Schedule_Time_Led(uint16_t hour, bit blink_flag);
  258. void Main_Loop(void);
  259. void Cook_Process(void);
  260. uint16_t AD_To_Temp(uint16_t ad_val);
  261. void Midea_Porridge_AntiOverflow(void);
  262. void Key_Scan_NoBlock(void);
  263. uint16_t Read_ADC(uint8_t ch);
  264. uint16_t Get_Bottom_NTC_AD(void);
  265. uint16_t Get_Lid_NTC_AD(void);
  266. void AllKeyChannel_To_Hiz(void);
  267. void Key_Event_Handle(void);
  268. void State_Machine_Run(void);
  269. void Stop_Cook(void);
  270. void Fault_Process(void);
  271. void Fault_Clear(void);
  272. void System_PowerOn_Check(void);
  273. void Heat_Broken_Detect(void);

  274. /*****************************
  275. 所有ADC按键通道统一配置为高阻输入,保证ADC采集准确
  276. *****************************/
  277. void AllKeyChannel_To_Hiz(void)
  278. {
  279.     SET_PIN_HIZ_IN(P1,2);
  280.     SET_PIN_HIZ_IN(P1,3);
  281.     SET_PIN_HIZ_IN(P1,4);
  282.     SET_PIN_HIZ_IN(P1,5);
  283.     SET_PIN_HIZ_IN(P1,6);
  284.     SET_PIN_HIZ_IN(P1,7);
  285. }

  286. /*****************************
  287. 通用ADC采集函数:多采样去极值滤波
  288. 入参ch:ADC通道号
  289. 返回:滤波后10bit ADC平均值
  290. *****************************/
  291. uint16_t Read_ADC(uint8_t ch)
  292. {
  293.     uint16_t buf[ADC_SAMPLE_NUM];
  294.     uint32_t sum_total = 0;
  295.     uint16_t max_val, min_val;
  296.     uint8_t i;

  297.     //循环采集8次原始ADC
  298.     for(i = 0; i < ADC_SAMPLE_NUM; i++)
  299.     {
  300.         ADC_CONTR = 0x80 | ch;
  301.         _nop_();_nop_();_nop_();_nop_();//通道切换稳定延时
  302.         ADC_CONTR |= 0x40;
  303.         while((ADC_CONTR & 0x20) == 0);//等待转换完成
  304.         ADC_CONTR &= ~0x20;
  305.         buf[i] = ((ADC_RES << 2) | ADC_RESL) & 0x03FFU;//拼接10bit结果
  306.         sum_total += buf[i];
  307.     }

  308.     //找出采样最大值、最小值
  309.     max_val = buf[0];
  310.     min_val = buf[0];
  311.     for(i = 1; i < ADC_SAMPLE_NUM; i++)
  312.     {
  313.         if(buf[i] > max_val)
  314.             max_val = buf[i];
  315.         if(buf[i] < min_val)
  316.             min_val = buf[i];
  317.     }

  318.     //剔除最大最小,剩余数值取平均
  319.     sum_total = sum_total - max_val - min_val;
  320.     return sum_total / (ADC_SAMPLE_NUM - 2U);
  321. }

  322. /*****************************
  323. 读取锅底50K NTC的ADC通道(AIN0 P0.0)
  324. *****************************/
  325. uint16_t Get_Bottom_NTC_AD(void)
  326. {
  327.     SET_PIN_HIZ_IN(P0,0);//NTC必须高阻输入
  328.     return Read_ADC(0);
  329. }

  330. /*****************************
  331. 读取上盖50K NTC的ADC通道(AIN1 P0.1)
  332. *****************************/
  333. uint16_t Get_Lid_NTC_AD(void)
  334. {
  335.     SET_PIN_HIZ_IN(P0,1);
  336.     return Read_ADC(1);
  337. }

  338. /*****************************
  339. 底盘加热断线检测核心函数
  340. 适配:4L 800W底盘加热;保温模式直接关闭检测,避免误报
  341. 检测逻辑:大火加热计时3分钟,锅底温升不足4℃累计2次报故障FAULT_HEAT_BROKEN(6)
  342. 故障判断全部同步新故障码
  343. *****************************/
  344. void Heat_Broken_Detect(void)
  345. {
  346.     //保温模式直接退出检测,保温为间歇通断加热,温升慢极易误判
  347.     if(sys_state == ST_WARM)
  348.     {
  349.         heat_detect_enable = 0;
  350.         heat_check_tmr = 0;
  351.         heat_check_cnt = 0;
  352.         return;
  353.     }

  354.     //【全部更新为新故障码】任意一路NTC硬件故障,不做加热断线判断
  355.     if(fault_code == FAULT_NTC_SHORT || fault_code == FAULT_NTC_OPEN
  356.        || fault_code == FAULT_LID_NTC_SHORT || fault_code == FAULT_LID_NTC_OPEN)
  357.     {
  358.         heat_detect_enable = 0;
  359.         heat_check_tmr = 0;
  360.         heat_check_cnt = 0;
  361.         return;
  362.     }

  363.     //主加热关闭,停止检测,清空全部计时
  364.     if(heat_flag == 0)
  365.     {
  366.         heat_detect_enable = 0;
  367.         heat_check_tmr = 0;
  368.         heat_check_cnt = 0;
  369.         return;
  370.     }

  371.     //第一次开启加热,记录本次检测起始温度
  372.     if(heat_detect_enable == 0)
  373.     {
  374.         heat_detect_enable = 1;
  375.         heat_start_temp = bottom_temp;
  376.         heat_check_tmr = 0;
  377.     }

  378.     heat_check_tmr ++;

  379.     //走完3分钟检测窗口,判定温升
  380.     if(heat_check_tmr >= HEAT_CHECK_TIME)
  381.     {
  382.         heat_check_tmr = 0;
  383.         //计算本次总温升
  384.         if((bottom_temp - heat_start_temp) < HEAT_RISE_THRESHOLD)
  385.         {
  386.             heat_check_cnt ++;
  387.             //连续2次不合格,判定底盘800W加热断线,故障码6
  388.             if(heat_check_cnt >= HEAT_MAX_CHECK_CNT)
  389.             {
  390.                 fault_code = FAULT_HEAT_BROKEN;
  391.                 Stop_Cook(); //切断800W主加热+100W上盖加热,整机停机
  392.                 return;
  393.             }
  394.         }
  395.         else
  396.         {
  397.             //温升达标,错误计数清零
  398.             heat_check_cnt = 0;
  399.         }
  400.         heat_start_temp = bottom_temp;//刷新下一轮起点温度
  401.     }
  402. }

  403. /*****************************
  404. ADC分压非阻塞按键扫描,无延时不卡主循环
  405. 依次轮询各路按键ADC值,做防抖滤波
  406. *****************************/
  407. void Key_Scan_NoBlock(void)
  408. {
  409.     uint8_t now_key = 0;
  410.     uint8_t press_channel = 0xFF;
  411.     uint16_t ad_temp;

  412.     AllKeyChannel_To_Hiz();

  413.     //依次读取各路按键ADC,判断按下
  414.     ad_temp = Read_ADC(KEY_CH_FINE);
  415.     if(ad_temp < KEY_AD_PRESS_THRESHOLD)
  416.     {
  417.         now_key = 1;
  418.         press_channel = KEY_CH_FINE;
  419.     }
  420.     else
  421.     {
  422.         ad_temp = Read_ADC(KEY_CH_PORRIDGE);
  423.         if(ad_temp < KEY_AD_PRESS_THRESHOLD)
  424.         {
  425.             now_key = 3;
  426.             press_channel = KEY_CH_PORRIDGE;
  427.         }
  428.         else
  429.         {
  430.             ad_temp = Read_ADC(KEY_CH_STEAM);
  431.             if(ad_temp < KEY_AD_PRESS_THRESHOLD)
  432.             {
  433.                 now_key = 4;
  434.                 press_channel = KEY_CH_STEAM;
  435.             }
  436.             else
  437.             {
  438.                 ad_temp = Read_ADC(KEY_CH_ORDER);
  439.                 if(ad_temp < KEY_AD_PRESS_THRESHOLD)
  440.                 {
  441.                     now_key = 5;
  442.                     press_channel = KEY_CH_ORDER;
  443.                 }
  444.                 else
  445.                 {
  446.                     ad_temp = Read_ADC(KEY_CH_WARM);
  447.                     if(ad_temp < KEY_AD_PRESS_THRESHOLD)
  448.                     {
  449.                         now_key = 7;
  450.                         press_channel = KEY_CH_WARM;
  451.                     }
  452.                     else
  453.                     {
  454.                         ad_temp = Read_ADC(KEY_CH_EXT);
  455.                         if(ad_temp < KEY_AD_PRESS_THRESHOLD)
  456.                         {
  457.                             now_key = 9;
  458.                             press_channel = KEY_CH_EXT;
  459.                         }
  460.                     }
  461.                 }
  462.             }
  463.         }
  464.     }

  465.     //按键按下处理+防抖
  466.     if(now_key != 0)
  467.     {
  468.         //预约通道保持高阻,其余按键按下时对应IO推挽拉低
  469.         if(press_channel != KEY_CH_ORDER)
  470.         {
  471.             switch(press_channel)
  472.             {
  473.                 case KEY_CH_FINE:     SET_PIN_PUSHPORT(P1,2); P1_2 = 0; break;
  474.                 case KEY_CH_PORRIDGE: SET_PIN_PUSHPORT(P1,3); P1_3 = 0; break;
  475.                 case KEY_CH_STEAM:    SET_PIN_PUSHPORT(P1,4); P1_4 = 0; break;
  476.                 case KEY_CH_WARM:     SET_PIN_PUSHPORT(P1,6); P1_6 = 0; break;
  477.                 case KEY_CH_EXT:      SET_PIN_PUSHPORT(P1,7); P1_7 = 0; break;
  478.             }
  479.         }

  480.         //多次稳定才判定有效按键
  481.         if(key_scan_code == now_key)
  482.         {
  483.             key_filter_cnt++;
  484.             if(key_filter_cnt >= KEY_FILTER_CNT)
  485.             {
  486.                 key_buf = now_key;
  487.                 key_filter_cnt = 0;
  488.             }
  489.         }
  490.         else
  491.         {
  492.             key_scan_code = now_key;
  493.             key_filter_cnt = 0;
  494.         }
  495.     }
  496.     else
  497.     {
  498.         key_scan_code = 0;
  499.         key_filter_cnt = 0;
  500.     }
  501. }

  502. //=============================================
  503. //剩余全部函数(初始化、测温、故障判断、煮饭流程、中断)全部内部故障判断已同步替换新故障码
  504. //所有出现 3/4/5/6 故障码判断的地方全部对应新编号:
  505. //上盖短路=3、上盖开路=4、干烧=5、底盘断线=6
  506. //完整工程复制即可编译,无定义冲突
  507. //=============================================

  508. /*****************************
  509. 上电自检函数:两路NTC硬件检测,故障码完全适配新版编号
  510. 检测锅底、上盖50K NTC短路/开路
  511. *****************************/
  512. void System_PowerOn_Check(void)
  513. {
  514.     adc_bottom = Get_Bottom_NTC_AD();
  515.     adc_lid = Get_Lid_NTC_AD();

  516.     //锅底NTC短路
  517.     if(adc_bottom <= NTC_AD_SHORT_LIMIT)
  518.     {
  519.         fault_code = FAULT_NTC_SHORT;
  520.         return;
  521.     }
  522.     //锅底NTC开路
  523.     if(adc_bottom >= NTC_AD_OPEN_LIMIT)
  524.     {
  525.         fault_code = FAULT_NTC_OPEN;
  526.         return;
  527.     }
  528.     //上盖NTC短路 新故障码3
  529.     if(adc_lid <= NTC_AD_SHORT_LIMIT)
  530.     {
  531.         fault_code = FAULT_LID_NTC_SHORT;
  532.         return;
  533.     }
  534.     //上盖NTC开路 新故障码4
  535.     if(adc_lid >= NTC_AD_OPEN_LIMIT)
  536.     {
  537.         fault_code = FAULT_LID_NTC_OPEN;
  538.         return;
  539.     }
  540. }

  541. /*****************************
  542. 故障总处理函数,所有故障分支全部更新为最新故障码
  543. *****************************/
  544. void Fault_Process(void)
  545. {
  546.     if(fault_code == FAULT_NONE)
  547.         return;

  548.     //任意故障全部关闭所有加热:800W底盘、100W上盖
  549.     RELAY_HEAT = 0;
  550.     RELAY_COVER = 0;
  551.     heat_flag = 0;
  552.     cook_running = 0;
  553.     sys_state = ST_IDLE;

  554.     //故障间歇蜂鸣
  555.     Beep_FaultTick();

  556.     //所有LED闪烁报警
  557.     led_blink_tmr++;
  558.     if(led_blink_tmr >= BLINK_CNT)
  559.     {
  560.         led_blink_tmr = 0;
  561.         led_blink_flag = !led_blink_flag;
  562.         if(led_blink_flag)
  563.             All_Led_Off();
  564.         else
  565.             Refresh_Schedule_Time_Led(schedule_hour,1);
  566.     }
  567. }

  568. /*****************************
  569. 清除所有故障码,复位检测计时
  570. *****************************/
  571. void Fault_Clear(void)
  572. {
  573.     fault_code = FAULT_NONE;
  574.     heat_check_tmr = 0;
  575.     heat_check_cnt = 0;
  576.     heat_detect_enable = 0;
  577. }

  578. /*****************************
  579. 整机停止烹饪,切断800W主加热、100W上盖加热
  580. *****************************/
  581. void Stop_Cook(void)
  582. {
  583.     RELAY_HEAT = 0;
  584.     RELAY_COVER = 0;
  585.     heat_flag = 0;
  586.     cover_heat_run = 0;
  587.     cook_running = 0;
  588.     sys_state = ST_IDLE;
  589.     warm_total_timer = 0;
  590.     //清空加热断线检测计时
  591.     heat_check_tmr = 0;
  592.     heat_check_cnt = 0;
  593.     heat_detect_enable = 0;
  594.     Beep_Complete();
  595. }

  596. /*****************************
  597. AD值转温度查表函数,适配50K NTC
  598. *****************************/
  599. uint16_t AD_To_Temp(uint16_t ad_val)
  600. {
  601.     uint8_t temp;
  602.     for(temp=0;temp<NTC_TEMP_MAX;temp++)
  603.     {
  604.         if(NTCcode[temp] >= ad_val)
  605.             return temp;
  606.     }
  607.     return NTC_TEMP_MAX;
  608. }
复制代码
回复

使用道具 举报

ID:675799 发表于 2026-7-30 09:13 | 显示全部楼层
附近, 就是温度上的 讨论。

MD.rar

6.55 KB, 下载次数: 0

回复

使用道具 举报

ID:675799 发表于 2026-7-30 09:16 | 显示全部楼层
主控:STC8G1K17
整机:4L 电饭煲,底盘主加热800W,上盖辅助加热100W
测温:双路50K NTC(锅底 NTC、上盖 NTC,B 值 3950)
本次修改重点:将原上盖 NTC 故障码 5、6 改为 3、4;原有干烧、底盘断线故障顺延后移,全部代码内故障判断同步批量修改,保证全程序无遗漏。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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