zoukankan      html  css  js  c++  java
  • RS-485+modbus协议:远程消防检测系统

    前期准备

    1.cortex-M3主控模块2个

    2.火焰传感器1个

    实现现象

    M3采集端模块上的LED8S闪烁,M3主控模块监测端每两秒查询一次火情,LED9亮0.5秒,灭1.5秒,当有

    火情产生时监测端的LED1-LED4开始流水灯显示,按下监测端的按键1(KEY1)流水灯关闭。

    一、STM32CubeMX配置

    1.1 LED1-LED4(PE7,PE6,PE5,PE4)、KEY1(PC13)、LED9(PB8)所在GPIO的配置

     

     1.2 串口USART2的设置为波特率115200bps,8位数据位,1位停止位,无校验位

     1.3 PC9 引脚控制 485 通信芯片收发转换(低电平接收,高电平发送)

     1.4 时钟树配置,主频72M

     

     1.5  配置定时器的工作参数

     

     生成代码

    三、补充代码

    3.1定义变量

    /* USER CODE BEGIN PV */
    // LED灯的状态
    static uint16_t ledState = 0x0000;    
    // 着火标志,默认为0,不着火
    static uint8_t flag_fire = 0;
    // 接受的数据存放
    uint8_t rxBuf[20] = {0};
    /* USER CODE END PV */

    3.2监测端发送命令

    /* 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;
    // 设置PC9引脚为低电平,接受数据   
      HAL_GPIO_WritePin(CONPIN_GPIO_Port,CONPIN_Pin,GPIO_PIN_SET);
    // 发送数据 HAL_UART_Transmit(串口,内容,数据大小,延时时间) HAL_UART_Transmit(&huart2,cmd,8,0xffff); // 设置PC9引脚为低电平,接受数据 HAL_GPIO_WritePin(CONPIN_GPIO_Port,CONPIN_Pin,GPIO_PIN_RESET); // 接受数据HAL_UART_Receive_IT(串口,数据,大小) HAL_UART_Receive_IT(&huart2,rxBuf,7); } /* USER CODE END 0 */

    3.3启动定时器的中断

      /* USER CODE BEGIN 2 */
      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 */

    3.4实现监测端LED9 每隔 2 秒闪烁一 次(亮 0.5 秒,灭 1.5 秒)

     /* 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 */
      }

    3.5按键中断

    /* USER CODE BEGIN 4 */
    //
    实现按键中的回调函数 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { // 判断按键按下 if(GPIO_Pin & GPIO_PIN_13) { // 判断火情 if(flag_fire == 1) { // 存在火情,将标志位置0 flag_fire = 0; // LED灯置0 ledState = 0; // 所有引脚置于低电平 HAL_GPIO_WritePin(GPIOE,0xffff,GPIO_PIN_SET); } } }

    3.6定时器

    // 定时器回调函数
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
            // 定时器6产生
        if(htim->Instance == TIM6)
        {
                    // 发生火情
            if(flag_fire == 1)
            {
                // ledState=0x0000
                // 0x0000H=0000 0000B
                // 0000 0000B>>1=0000 0000B
                ledState = ledState>>1;
                // 0x0080H=1000 0000B
                // 1000 0000B | 0000 0000B->1000 0000B
    // LED1点亮
    ledState |= 0x0080 // 0x00f8H=1111 1000B if(ledState == 0x00f8) ledState = 0; HAL_GPIO_WritePin(GPIOE,0xffff,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE,ledState,GPIO_PIN_RESET); } }
    //定时器7,每2秒发送一次命令
    if(htim->Instance == TIM7) { SendCmd(); } }

     3.7串口接受函数

    485通信协议,比如

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
        if(huart->Instance == USART2)
        {
                    // 比对地址码和功能码
            if((rxBuf[0] == 0x01) && (rxBuf[1] == 0x04))
            {
                            // 定义无符号整型变量temp
                uint16_t temp = 0;
                            // rxBuf[3]为寄存器的值
                            // 例如:rxBuf[3]=0x00c8H=1100 1000B
                            // 1100 1000B<<8 ->0000 0000B
                temp = ((uint16_t)rxBuf[3])<<8;
                            // 0000 0000B | 1000 1011 1010 0110=0000 0000 0000 0000
                temp = temp | rxBuf[4];
                            // 当temp>100时发出报警(flag_fire = 1)
                if(temp > 100)
                {
                    flag_fire = 1;
                }
            }
        }
    }
    /* USER CODE END 4 */
  • 相关阅读:
    剑指OFFER之复杂链表的复制(九度OJ1524)
    剑指OFFER之二叉树中和为某一值的路径(九度OJ1368)
    剑指OFFER之从二叉搜索树的后序遍历序列(九度OJ1367)
    剑指OFFER之从上往下打印二叉树(九度OJ1523)
    剑指OFFER之栈的压入、弹出序列(九度OJ1366)
    剑指OFFER之包含min函数的栈(九度OJ1522)
    剑指OFFER之顺时针打印矩阵(九度OJ1391)
    剑指OFFER之树的子结构(九度OJ1520)
    剑指OFFER之二叉树的镜像(九度OJ1521)
    VM安装CentOs7虚拟机后无法上网之解决方法
  • 原文地址:https://www.cnblogs.com/jsit-dj-it/p/12002932.html
Copyright © 2011-2022 走看看