数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 283|回复: 13

[C51] 简单测试压力传感器模块【有图、有源码】

[复制链接]
发表于 前天 12:12 | 显示全部楼层 |阅读模式
逛*宝拍了两个压力传感器模块,发现这货采集数据挺简单的,只是还不知道实际采集压力数据时这东西要怎样安装到管道上,它的核心元件就是一个HX710B芯片,是一个串口通讯的内含放大器的24位AD转换器,也是电子称类装置上常用的芯片,原本还想找店家要驱动资料后来发现这个芯片的应用资料网上有很多,再后来发现它的数据手册里就给出了数据读取函数,再配合AI编程使得这个模块玩的不要说太简单了、感觉索然无味了。
1.控制MCU:STC8H8K64U-20Pin
2.压力产生方法如下:
买模块时也拍了配套的硅胶管,剪一小截胶管绑扎到传感器的气嘴上,胶管的另一端封闭,我是用一个废弃的3.5mm耳机插头堵上的,弄好后只要按压胶管就可以得到压力变化值,而且非常的灵敏。
3.根据模块引脚名称连接引线就可以烧程序测试了。
4.烧录代码后打开串口助手,设置波特率115200,文本接收模式,可以看到间隔1S显示一个数据,不碰胶管时数据在88*****(7位数字),挤压胶管后最大值在167*****(8位数字)
5.测试到此为止,模块图片、程序源码如下:





  1. //2025/06/21:开始调试HX710B气压传感器模块
  2. //测试代码根据网上开源例程及AI编程改编
  3. //程序烧录时设定时钟频率22.1184MHz
  4. #include <STC8H.H>

  5. // 定义HX710B引脚
  6. #define HX710B_DAT P32 // 数据输入引脚
  7. #define HX710B_SCK P33 // 时钟输出引脚

  8. // 定义波特率
  9. #define MAIN_Fosc 22118400L //定义主时钟(烧录程序时设定)
  10. #define Baudrate 115200L
  11. #define TM (65536 -(MAIN_Fosc/Baudrate/4))
  12. #define FILTER_WINDOW_SIZE 15 // 定义滤波窗口大小

  13. u32 filterBuffer[FILTER_WINDOW_SIZE] = {0};
  14. u8 filterIndex = 0;

  15. // 函数声明
  16. void UartInit(void);
  17. void UART1_SendByte(unsigned char dat);
  18. void UART1_SendString(char *s);
  19. void HX710B_Init(void);
  20. u32 HX710B_Read(void);
  21. u32 MovingAverageFilter(u32 newValue);
  22. void delay_ms(unsigned int us);

  23. void main(void)
  24. {
  25. u32 adc_value = 0;
  26.         u32 filtered_value = 0;
  27. GPIO_set(); //预置所有I/O口全部为准双向口
  28. EAXSFR(); //允许访问扩展RAM区特殊功能寄存器( XFR)
  29. // 初始化
  30. HX710B_Init();
  31. UartInit();

  32. UART1_SendString("STC8H8K64U HX710B Test Program\r\n");
  33. UART1_SendString("Initialization completed\r\n");

  34. while(1)
  35. {
  36. adc_value = HX710B_Read();
  37.         filtered_value = MovingAverageFilter(adc_value);
  38. //通过串口发送ADC值,串口输出32位整数,文本形式
  39. UART1_SendByte(adc_value / 10000000 + 48);
  40. UART1_SendByte(adc_value % 10000000 / 1000000 + 48);
  41. UART1_SendByte(adc_value % 1000000 / 100000 + 48);
  42. UART1_SendByte(adc_value % 100000 / 10000 + 48);
  43. UART1_SendByte(adc_value % 10000 / 1000 + 48);
  44. UART1_SendByte(adc_value % 1000 / 100 + 48);
  45. UART1_SendByte(adc_value % 100 / 10 + 48);
  46. UART1_SendByte(adc_value % 10 + 48);


  47. UART1_SendString("\r\n");

  48. // 延时约1秒
  49. delay_ms(1000);
  50. }
  51. }

  52. // 初始化HX710B
  53. void HX710B_Init(void)
  54. {
  55. HX710B_SCK = 0; // 初始时钟线低电平
  56. HX710B_DAT = 1; // 设置为输入模式
  57. }
  58. //读取HX710B的AD采集结果
  59. u32 HX710B_Read(void)
  60. {
  61. u8 i;
  62. u32 value;
  63. HX710B_SCK = 0; // 初始化通讯端口
  64. HX710B_DAT = 1;
  65.         value = 0;
  66. //等待AD转换完成
  67. while(HX710B_DAT);

  68. for(i = 0; i < 24; i++)
  69. {
  70. HX710B_SCK = 1; // 上升沿
  71. _nop_();
  72. _nop_();
  73. value <<= 1; // 左移一位
  74. HX710B_SCK = 0; // 下降沿

  75. if(HX710B_DAT)
  76. {
  77. value++;
  78. }

  79. _nop_();
  80. _nop_();
  81. }

  82. HX710B_SCK = 1;
  83. _nop_();
  84. _nop_();
  85. value = value ^ 0x800000;//数据转换
  86. HX710B_SCK = 0;



  87. return value;
  88. }
  89. // 滑动平均滤波器
  90. u32 MovingAverageFilter(u32 newValue)
  91. {
  92. static u32 sum = 0;

  93. // 减去最旧的值
  94. sum -= filterBuffer[filterIndex];

  95. // 添加新值
  96. filterBuffer[filterIndex] = newValue;
  97. sum += newValue;

  98. // 更新索引
  99. filterIndex++;
  100. if(filterIndex >= FILTER_WINDOW_SIZE)
  101. {
  102. filterIndex = 0;
  103. }

  104. // 返回平均值
  105. return sum / FILTER_WINDOW_SIZE;
  106. }
  107. // 初始化串口1
  108. void UartInit()
  109. {

  110. SCON = (SCON & 0x3f) | 0x40;
  111. AUXR |= 0x40; //定时器时钟1T模式
  112. AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
  113. TL1 = TM;
  114. TH1 = TM >> 8;
  115. TR1 = 1; //定时器1开始计时
  116. }

  117. // 串口1发送一个字节
  118. void UART1_SendByte(unsigned char dat)
  119. {
  120. SBUF = dat;

  121. while(!TI);

  122. TI = 0;
  123. }

  124. // 串口1发送字符串
  125. void UART1_SendString(char *s)
  126. {
  127. while(*s)
  128. {
  129. UART1_SendByte(*s++);
  130. }
  131. }

  132. //毫秒级延时函数
  133. void delay_ms(u16 value) //@22.1184MHz
  134. {
  135. unsigned char i, j;

  136. while(value > 0)
  137. {
  138. i = 29;
  139. j = 183;

  140. do
  141. {
  142. while(--j);
  143. } while(--i);

  144. value--;
  145. }
  146. }
复制代码








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 1家元 +24 收起 理由
飞向狙沙 + 24 謝謝分享

查看全部打赏

发表于 前天 12:36 | 显示全部楼层
大佬就是大佬 ,啥传感器拿起来也是手拿把掐
回复 支持 反对

使用道具 举报

发表于 前天 14:22 | 显示全部楼层
收到的数据如何转换为真实的压力值呢?
回复 支持 反对

使用道具 举报

发表于 前天 14:54 | 显示全部楼层
楼主这奉献工作做得细致噢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 15:21 | 显示全部楼层
xueyuking 发表于 2025-6-26 14:22
收到的数据如何转换为真实的压力值呢?

如果只是检测气体压力做数据转换的话是比较简单的,就是加断开胶管加入三通连接压力表,根据压力表来标定数据后在程序中加入相关的换算就可以用数码管显示压力值了,做一些粗糙的限压控制还是勉强可以的,如果做管道中液体的压力检测就比较困难了,涉及压力变送元件就不是手工DIY能实现的了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 15:25 | 显示全部楼层
行了吧 发表于 2025-6-26 14:54
楼主这奉献工作做得细致噢!

多谢,也无所谓奉献做自己感兴趣的东西分享出来而已。
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 15:29 | 显示全部楼层
confessor 发表于 2025-6-26 12:36
大佬就是大佬 ,啥传感器拿起来也是手拿把掐

有资料就没难度都是大神们玩过的东西了,另外我也只是简单的玩玩,太高级的程度我也搞不定。
回复 支持 反对

使用道具 举报

发表于 前天 23:25 | 显示全部楼层
压力范围0-40Kpa太小了
回复 支持 反对

使用道具 举报

发表于 昨天 10:23 | 显示全部楼层
看到这个忽然想到是不是变相的可以用来测温,密闭容器,压力只和温度相关,温度变化压力变化,采集压力值转换成温度值
回复 支持 反对

使用道具 举报

发表于 昨天 10:36 来自手机浏览器 | 显示全部楼层
飞向狙沙 发表于 2025-6-27 10:23
看到这个忽然想到是不是变相的可以用来测温,密闭容器,压力只和温度相关,温度变化压力变化,采集压力值转换成 ...

精度低吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 10:38 | 显示全部楼层
飞向狙沙 发表于 2025-6-27 10:23
看到这个忽然想到是不是变相的可以用来测温,密闭容器,压力只和温度相关,温度变化压力变化,采集压力值转换成 ...

你说的挺有道理的,但也存在压力变送的方法问题,如果只是这个塑料元件加乳胶管的密闭系统恐怕实现不了测量,如果这货做成金属结构、螺纹连接就方便了,有说这东西可以测量水位但还不知道还需要附加怎样的装置。
回复 支持 反对

使用道具 举报

发表于 昨天 11:03 | 显示全部楼层
STC8H8K64U 的应用,建议使用最新 AiCube@STC-ISP V6.95V 自动生成外设的程序和程序框架

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 昨天 11:04 | 显示全部楼层
慕名而来 发表于 2025-6-27 10:38
你说的挺有道理的,但也存在压力变送的方法问题,如果只是这个塑料元件加乳胶管的密闭系统恐怕实现不了测 ...

容器肯定要刚性的,刚想起来冰箱机械控温不就是这玩意么
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 14:17 | 显示全部楼层
本帖最后由 慕名而来 于 2025-6-27 14:18 编辑
飞向狙沙 发表于 2025-6-27 11:04
容器肯定要刚性的,刚想起来冰箱机械控温不就是这玩意么

确实是的,还有一种带毛细管的温控开关也是压控原理,只是这个传感器比较容易实现数显,另外,我方才做了实验,将连接的胶管外侧封堵去掉插入水杯中,插入水中的深度不同就会得到变化的数据而且数据变化貌似挺平滑的,看来用这东西测水位真的比较容易简单实现的。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-6-28 07:23 , Processed in 0.140401 second(s), 9 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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