社区导航

 

搜索
查看: 312|回复: 0

[求助] 基于STM8S003K3的业务逻辑代码中两个互斥的标志位都要执行同一块功能该如何

[复制链接]

10

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-12-1 13:33 | 显示全部楼层 |阅读模式

首先这是一段由水龙头控制的程序,主控板通过串口上报数据给ht1621b驱动的显示屏,显示屏只有收到串口的数据后会根据串口显示不同的图标,有问题的程序附在下面,首先在开机后,显示屏上面附带有一个触摸IC按键,显示屏上面的图标轮流闪烁(此过程是水龙头排气过程),直到按键长按10s退出排气,退出排气后可以一档二档出水由STM8S控制增压泵IO口输出(一档为PWM控制的半压输出,二档为全压输出)。在增压泵xmin 后无工作(x表示分钟数)进入自动冲洗状态,这个状态是增压泵可以为一档出水的方式工作清洗水箱中的水,退出的条件有两个:一个是缺水,一个是水泵空转5s,现在缺水时时可以退出的,但是水泵空转5s是通过AD电流采集数据,但是水泵空转5s和缺水退出的条件不一样,而且SystemStatus.work_mode (工作模式:一档和二档出水)和SystemStatus.auto_clean(自清洗模式标志位)是互斥的关系,SystemStatus.zyb_mode(增压泵是PWM半压输出还是全压输出)属于SystemStatus.work_mode的一个子集,要让这两个条件都执行不知道怎么做,但是执行的功能是类似的,有问题的代码都写在下面了,就是不知道该怎么解?

  1. * 主控板状态信息 */
  2. typedef struct waterbox_info
  3. {
  4.   uint8_t tds;
  5.   uint16_t temperature;
  6.   uint8_t out;//出水  
  7.   uint8_t fullwater;
  8.   uint8_t makewater;
  9.   uint8_t uv;
  10.   uint8_t work_mode;
  11.   uint8_t auto_clean;
  12.   uint8_t err_code;     /*错误码:漏水*/
  13.   uint8_t crc_code;
  14.   uint8_t outair;//自排气
  15.   uint8_t isEmpty;      //水箱无水
  16.   uint8_t zyb;
  17.   uint8_t liquid_level; //liquid level protect
  18.   uint8_t leakwater;  /*漏水*/
  19.   uint8_t jump_outair;//跳过排气
  20.   uint8_t zyb_mode;
  21. }System_t;
  22.  
  23. /* 结构体 */
  24. System_t SystemStatus = {0};
  25.  
  26. uint16_t Current_Aver_Buf[ZYB_BUF_LEN]={0};//增压泵平均值缓存区长度
  27. uint16_t temp = 0;
  28. uint16_t temp1 = 0;
  29.  
  30. #define ZYB_BUF_LEN    20
  31. uint16_t get_current_average_value(uint16_t *buf,uint16_t val)
  32. {
  33.     volatile uint16_t sum = 0,temp = 0;
  34.     volatile uint16_t average = 0;  
  35.         
  36.     int i = 0;
  37.     for (i = 0; i < ZYB_BUF_LEN - 1; ++i)
  38.     {
  39.         buf[i] = buf[i+1];
  40.     }
  41.     buf[ZYB_BUF_LEN - 1] = val;
  42.  
  43.     for (i = 0; i < ZYB_BUF_LEN; ++i)
  44.     {
  45.         sum += buf[i];
  46.     }
  47.     average = sum / ZYB_BUF_LEN;
  48.  
  49.     return average;
  50. }
  51. /*
  52. *@function:zyb_current_check(void)
  53. *@brief:电流检测
  54. *@param:None
  55. *@retval:None
  56. */
  57. void zyb_current_check(void)
  58. {
  59.     
  60.     if(SystemStatus.zyb_mode != 0x00 || (SystemStatus.auto_clean))//2个条件:1:工作模式为1档或者二档出水 2:自清洗模式
  61.     {
  62.         if (TIMER_STOP == current_timer.timer_run_flag)
  63.         {
  64.             /* code */
  65.             current_timer.cnt = 0;
  66.             current_timer.timer_run_flag = TIMER_RUN;
  67.         }
  68.         else if (TIMER_END == current_timer.timer_run_flag)
  69.         {
  70.             current_timer.timer_run_flag = TIMER_STOP;
  71.  
  72.             temp = Get_ADC_Convertion(ZYB_CURRENT);//ADC通道转换
  73.             temp1 = get_current_average_value(Current_Aver_Buf,temp);//电流平均值
  74.         }
  75.         /*增压泵空转检测,增压泵空转时间超过5s停止工作*/
  76.         if(zyb_timer.cnt >= 5000)
  77.         {            
  78.             if((SystemStatus.zyb_mode == 0x01) && (temp1 < 10))//50  水泵一档出水PWM占空比为50%
  79.             {
  80.                 zyb_timer.timer_run_flag = TIMER_STOP;
  81.                 
  82.                 FSF_F2_OFF;
  83.                 JSF_F1_OFF;
  84.                 PSF_F3_OFF;
  85.                 
  86.                 Close_ZYB();
  87.                 
  88.                 SystemStatus.out = 0;
  89.                 SystemStatus.work_mode = 0;//0x00:停止出水  
  90.                 SystemStatus.zyb = 0;
  91.                 
  92.                 
  93.                 /*主控板部分如果增压泵空转5s则退出自清洗模式*/
  94.                 
  95.                 if(SystemStatus.auto_clean)
  96.                 {
  97.                   SystemStatus.auto_clean = 0x00;
  98.                 }
  99.             }
  100.             else if((SystemStatus.zyb_mode == 0x02)&&(temp1 < 30))//100 水泵二档出水PWM占空比为100%,即全压输出
  101.             {
  102.                 zyb_timer.timer_run_flag = TIMER_STOP;
  103.                 
  104.                 FSF_F2_OFF;
  105.                 JSF_F1_OFF;
  106.                 PSF_F3_OFF;
  107.  
  108.                 Close_ZYB();
  109.                 
  110.                 SystemStatus.out = 0;
  111.                 SystemStatus.work_mode = 0;
  112.                 SystemStatus.zyb = 0;
  113.                 
  114.                 /*主控板部分如果增压泵空转5s则退出自清洗模式,自清洗是二档出水*/
  115.                 if(SystemStatus.auto_clean)
  116.                 {
  117.                   SystemStatus.auto_clean = 0x00;
  118.                 }
  119.                 
  120.             }
  121.         }        
  122.     }   
  123. }
  124.  
  125.  
  126.  
  127. /**
  128. *函数:Auto_Clean_proc
  129. *功能:自清洗进程,48小时如果没有任何操作,开始自清洗,按键无效
  130. *参数:无
  131. *返回值:无
  132. */
  133.  
  134. void Auto_Clean_proc(void)
  135. {    
  136.     if(Auto_clean_timer.min >= 10)   //48小时自清洗,Auto_clean_timer.hour >= 48 改时间为30min
  137.     {     
  138.         SystemStatus.auto_clean = AUTO_CLEAN_STATUS;//自清洗为二档出水
  139.         
  140.         
  141.         
  142.        
  143.         
  144.     }        
  145.     if(SystemStatus.auto_clean && SystemStatus.outair)//自清洗中且不为自排气
  146.     {
  147.         static uint8_t old_status = 0;
  148.         
  149.         if(SystemStatus.auto_clean && old_status != SystemStatus.auto_clean)     //48小时自清洗
  150.         {       
  151.             PSF_F3_ON;  //排水阀-F3打开
  152.  
  153.             JSF_F1_OFF; //进水阀-F1关闭
  154.  
  155.             FSF_F2_OFF; //放水阀-F2关闭
  156.  
  157.             ///Open_two_mode();     //水泵二档出水
  158.             Open_one_mode();//测试用一档出水
  159.           
  160.  
  161.         }
  162.         SystemStatus.fullwater  = 0x00;
  163.         SystemStatus.makewater  = 0x00; 
  164.         SystemStatus.work_mode  = 0x00;
  165.         old_status = SystemStatus.auto_clean;
  166.         
  167.  
  168.         
  169.     }
  170.     if(TIMER_STOP == Auto_clean_timer.timer_run_flag)
  171.     {
  172.         Auto_clean_timer.timer_run_flag = TIMER_RUN;
  173.     }
  174.     if(SystemStatus.out || !SystemStatus.outair || SystemStatus.auto_clean)
  175.     {
  176.     //SystemStatus.auto_clean =0x00;
  177.         Auto_clean_timer.hour = 0 ;
  178.         Auto_clean_timer.min  = 0 ;
  179.         Auto_clean_timer.sec  = 0 ; 
  180.         Auto_clean_timer.cnt  = 0 ;
  181.     }
  182.     
  183.     
  184. }
  185.  
  186.  
  187.  
  188. /**
  189. *函数:HeartBeat_Send
  190. *功能:
  191. *参数:无
  192. *返回值:无
  193. */
  194. void HeartBeat_Send(void)
  195. {
  196.   
  197.     if(TIMER_STOP == HeartBeat_timer.timer_run_flag)
  198.     {
  199.         HeartBeat_timer.timer_run_flag = TIMER_RUN;
  200.         HeartBeat_timer.cnt = 1000;       //1s
  201.         
  202.         if(TIMER_RUN == HeartBeat_timer.timer_run_flag)
  203.         {
  204.             uint8_t buf[21] = "AA55";//
  205.             uint8_t crc_code = 0;
  206.             uint8_t i=0;
  207.             
  208.             buf[4] = (SystemStatus.tds / 16) ;       //tds
  209.             buf[4] = (buf[4] >= 0 &&buf[4]<=9)?buf[4]+'0':buf[4]+0x37;
  210.             buf[5] = (SystemStatus.tds % 16) ;
  211.             buf[5] = (buf[5] >= 0 &&buf[5]<=9)?buf[5]+'0':buf[5]+0x37;
  212.     
  213.             buf[6] = SystemStatus.out ? '1': '0';      //出水    
  214.             buf[7] = SystemStatus.fullwater&0x40? '1':'0';       //0x40缺水
  215.             buf[8] = SystemStatus.fullwater&0x20? '1':'0';        //0x20补水
  216.             buf[9] = SystemStatus.makewater ? '1': '0';         //制水模式
  217.             buf[10] = SystemStatus.uv ? '1': '0';               //uv         
  218.             buf[11] = SystemStatus.work_mode & 0x04 ? '1':'0';  //水泵工作模式:二档出水
  219.             buf[12] = SystemStatus.work_mode & 0x02 ? '1':'0';//水泵工作模式:一档出水       
  220.             buf[13] = SystemStatus.auto_clean ? '1': '0'; //
  221.             
  222.             //  buf[14] = 0;          //&#212;¤á&#244;&#206;&#187;
  223.             //  buf[15] = 0;
  224.             buf[14] = SystemStatus.liquid_level ? '1': '0';
  225.             buf[15] = !SystemStatus.outair ? '1': '0';
  226.             buf[16] = SystemStatus.err_code ? '1': '0'; //错误码
  227.             
  228.                     
  229.             for(i=0;i<=16;i++)
  230.             {
  231.                 crc_code += buf[i];
  232.             }
  233.             buf[17] = (crc_code / 16);
  234.             buf[17] = (buf[17] >= 0 &&buf[17]<=9)?buf[17]+'0':buf[17]+0x37;
  235.             buf[18] = (crc_code % 16);
  236.             buf[18] = (buf[18] >= 0 &&buf[18]<=9)?buf[18]+'0':buf[18]+0x37;
  237.             buf[19] = '\r';
  238.             buf[20] = '\n';
  239.  
  240.             //UART1_SendString(buf);
  241.             for(i=0;i<=20;i++)
  242.             {
  243.                 while((UART1->SR & UART1_FLAG_TXE)==RESET);
  244.                 UART1->DR = buf[i];
  245.                 while((UART1->SR & UART1_FLAG_TC)==RESET);
  246.             }
  247.         }
  248.     }
  249. }
此帖出自stm32/stm8论坛

回复

使用道具 举报

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

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-1-23 22:56 , Processed in 0.078435 second(s), 17 queries , Gzip On, MemCache On.

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