• 实现基于RS-485通信和Modbus协议的远程智能消防监测系统


    题目要求:

    • 监测端上电后LED1至LED8全部熄灭,LED9每隔2秒闪烁一次(亮0.5秒,灭1.5秒)。
    • 采集端测到火焰时,监测端LED1至LED4出现流水灯效果。
    • 采集端火焰消失后,监测端流水灯效果保持。
    • 按下一次监测端KEY1按键,能停止流水灯效果。

    使用2块M3主控模块、1个火焰传感器模块,选取一块M3主控模块作为监测端,另一块M3主控模块安装火焰传感器模块作为采集端。

    1、将“485采集端程序.hex”文件下载到采集端,使用“485节点配置工具.exe”配置采集端地址为0x01、传感器类型为火焰传感器。将监测端和采集端通过右上方485通信口(J5接口)进行通信连接。

    2、使用STM32CubeMX图形化配置工具为监测端生成KEIL开发工程,将STM32CubeMX自身项目和生成的工程保存到工程目录中。

    使用STM32CubeMX进行以下配置:

    •  (1)LED1-LED9和KEY1所在的GPIO的配置、串口
    • (2)USART2的设置为:波特率115200bps,8位数据位,1位停止位,无校验位。
    •  (3)PC9引脚控制485通信芯片收发转换(低电平接收,高电平发送)。
    •  (4)完成时钟树配置:主频72M
    •  (5)配置定时器的工作参数
    •    (6) 配置调试端口

     

     

     

     

     

     

    3、监测端通电后,板上LED1至LED8全部熄灭,LED9每隔2秒闪烁一次(亮0.5秒,灭1.5秒)。

    /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
            HAL_GPIO_WritePin(LED9_GPIO_Port,LED9_Pin,GPIO_PIN_RESET);
          HAL_Delay(500);
          HAL_GPIO_WritePin(LED9_GPIO_Port,LED9_Pin,GPIO_PIN_SET);
          HAL_Delay(1500);
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
      }
      /* USER CODE END 3 */

    4、监测端每隔2秒向采集端查询一次火情,当采集端出现火情时,监测端的LED1至LED4按指定流水灯方式显示。当采集端火情消失后,监测端的LED1至LED4应保持流水灯显示方式。具体流水灯显示方式为LED1亮起->LED2亮起->LED3亮起->LED4亮起->LED1至LED4全部熄灭->重复前述效果,各显示切换间隔为1秒。

    监测端每隔2秒向采集端查询一次火情,

     SendCmd()

    /* USER CODE BEGIN 0 */
    void SendCmd(void)
    {
        uint8_t cmd[8] = {0};
        cmd[0] = 0x01;
        cmd[1] = 0x04;
        cmd[2] = 0x00;
        cmd[3] = 0x02;
        cmd[4] = 0x00;
        cmd[5] = 0x01;
        cmd[6] = 0x90;
        cmd[7] = 0x0A;
        HAL_GPIO_WritePin(CONPIN_GPIO_Port,CONPIN_Pin,GPIO_PIN_SET);
        HAL_UART_Transmit(&huart2,cmd,8,0xffff);
        HAL_GPIO_WritePin(CONPIN_GPIO_Port,CONPIN_Pin,GPIO_PIN_RESET);
        HAL_UART_Receive_IT(&huart2,rxBuf,7);
    }
    
    /* USER CODE END 0 */
     /* USER CODE BEGIN 2 */
    //定时器6,7使能
      if(HAL_TIM_Base_Start_IT(&htim6) != HAL_OK)
      {
          Error_Handler();
      }
      if(HAL_TIM_Base_Start_IT(&htim7) != HAL_OK)
      {
          Error_Handler();
      }
    
      /* USER CODE END 2 */
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
        if(htim->Instance == TIM6)
        {
            if(flag_fire == 1)
            {
                ledState = ledState>>1;
                ledState |= 0x0080;
                if(ledState == 0x00f8)
                    ledState = 0;
                HAL_GPIO_WritePin(GPIOE,0xffff,GPIO_PIN_SET);
                HAL_GPIO_WritePin(GPIOE,ledState,GPIO_PIN_RESET);
            }
            
        }
        
        if(htim->Instance == TIM7)
        {
            SendCmd();        
        }
    }

    判断火情

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
        if(huart->Instance == USART2)
        {
            if((rxBuf[0] == 0x01) && (rxBuf[1] == 0x04))
            {
                uint16_t temp = 0;
                temp = ((uint16_t)rxBuf[3])<<8;
                temp = temp | rxBuf[4];
                if(temp > 100)
                {
                    flag_fire = 1;
                }
            }
        }
        
    }

    按键停止流水灯

    /* USER CODE BEGIN 4 */
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
        if(GPIO_Pin & GPIO_PIN_13)
        {
            if(flag_fire == 1)
            {
                flag_fire = 0;
                ledState = 0;
                HAL_GPIO_WritePin(GPIOE,0xffff,GPIO_PIN_SET);
            }
        }
    }
  • 相关阅读:
    课后作业07--二分法查找算法代码
    检索03 -- 二分法查找
    课堂随笔05--冒泡排序
    课后作业 06 -- 小数后几位精确判断并输出
    课后作业 05 -- 输出一段带字母与数字的随机数
    课后作业 04 --DateTime应用,判断多久后生日之类
    检索02--随机数种子的一些概念和理解
    课堂随笔04--关于string类的一些基本操作
    P1174 互素
    P1001 第K极值
  • 原文地址:https://www.cnblogs.com/jsit-dj-it/p/12112922.html
Copyright © 2020-2023  润新知