找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2903|回复: 1
收起左侧

STC12C5A60S2单片机接MAX485模块,读取485温湿度传感器的数据(MODBUS)OLED显示程序

  [复制链接]
ID:929006 发表于 2022-1-17 23:19 | 显示全部楼层 |阅读模式
STC12C5A60S2单片机接MAX485模块,读取485温湿度传感器的数据(MODBUS),并显示在OLED屏上
说明:主机发送数据帧:01 03 02 00 00 03 04 73


单片机源程序如下:

  1. /************************************************************************************
  2. 功能:单片机作为主机读取基于RS485的MODBUS协议的温湿度传感器数据测试
  3. **************************************************************************************/
  4. //头文件
  5. #include "main.h"

  6. int temp=2500;
  7. int humidity=3500;

  8. unsigned char code read_temp_hum_cmd[]={0x01,0x03,0x02,0x00,0x00,0x03,0x04,0x73};

  9. void main(void)
  10. {
  11.         Timer0Init();
  12.         UartInit();
  13.         OLED_Init();
  14.         OLED_Clear();
  15.         EA = 1;
  16.         printf("RS485 Modbus Test\r\n");
  17.         while(1)
  18.         {
  19.         if (sec_flag)
  20.         {
  21.         sec_flag=0;
  22.         uart_sendbuf(read_temp_hum_cmd,8);
  23.         }
  24.         if (rxd_flag)
  25.         {
  26.         rxd_flag=0;
  27.         uart_sendbuf(rxd_buf,rxd_index);
  28.         modbus_handle(rxd_buf,rxd_index);
  29.         rxd_index=0;
  30.         }
  31.         display_temp_hum(temp,humidity);
  32.         }
  33. }

  34. void display_temp_hum(int t,int h)
  35. {
  36.   unsigned char tempstr[8];
  37.   unsigned char humiditystr[8];
  38.   if(t<0)
  39.   {
  40.     IntegerToStr(t,tempstr);
  41.         OLED_ShowString(0,4,"TEMP:",16);
  42.         OLED_ShowString(48,4,tempstr,16);
  43.   }
  44.   else
  45.   {
  46.     IntegerToStr(t,tempstr);
  47.         OLED_ShowString(0,4,"TEMP:",16);
  48.         OLED_ShowString(56,4,tempstr,16);
  49.   }
  50.   IntegerToStr(h,humiditystr);
  51.   OLED_ShowString(0,6,"RH  :",16);
  52.   OLED_ShowString(56,6,humiditystr,16);
  53.   OLED_ShowChar(96,6,'%',16);
  54. }

  55. void modbus_handle(unsigned char *buf,unsigned char len)
  56. {
  57.   unsigned int crc;
  58.   unsigned char crch,crcl;

  59.   if (buf[0] != TEMP_HUM_ADDR)
  60.   {
  61.   return;
  62.   }
  63.   else if (buf[0] == TEMP_HUM_ADDR)
  64.   {
  65.        crc=GetCRC16(buf,len-2);
  66.        crch=crc>>8;
  67.        crcl=crc&0xff;
  68.       if((buf[len-2]!=crch)||(buf[len-1]!=crcl))
  69.       {
  70.       return;
  71.       }
  72.       temp=((int)buf[3]<<8) + buf[4];
  73.       humidity=((int)buf[5]<<8) + buf[6];
  74.   }
  75. }
复制代码

Keil代码下载:
RS485型MODBUS协议的温湿度传感器.zip (112.17 KB, 下载次数: 162)

评分

参与人数 1黑币 +20 收起 理由
admin + 20 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1103462 发表于 2023-12-9 19:36 | 显示全部楼层
#include "main.h"头文件是什么,是标准的库文件码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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