HX711压力检测装置,要实现的功能:实时监测当前压力并通过蓝牙串口将数据传输至手机,采用独立按键调节压力报警值,人机交互界面采用LCD12864控制内核为STC89C52RC;接下来我们来说说材料清单控制主板:STC89C52RC最小系统板 LCD12864 蜂鸣器 HC-05蓝牙模块 洞洞板 四个HX711芯片 四个HX711压力传感器在此之前我们还需要学习一下HX711的压力转换,计算相应线性系数以便获取高精度的重量;
HX711AD模块两个IO口, 分别对应SCK,DOUT。当DOUT=1, 说明ad转换器还没准备好输出数据。当DOUT=0,说明准备好了,然后就得对SCK输入脉冲,且输入一次脉冲,DOUT就输出一位数据(二进制,数据从最高位到最低位依次输出),24个脉冲后,再根据SCK的脉冲数对下次工作方式进行选择。我们选用A通道,128增益。
工作模式的选择HX711AD模块有上图三种工作模式,A通道128增益、B通道32增益、A通道64增益。对应不同的增益,其满额度差分输入信号幅值也不同。(还没学模电数电,不知道这是个什么东东)根据相关的文档以及网上的一些文章,不管选哪个通道的多少增益,其数据处理是类似的,只是不同的增益对应不同的放大倍数。具体到程序编写上,即为两处改动。
详细讲解程序计算原理:
步骤 1 :如何计算传感器供电电压
HX711 可以在产生 VAVDD 和 AGND 电压,即 711 模块上的 E+ 和 E- 电压。该电压通过 VAVDD=VBG(R1 +R2 )/R2 计算。VBG 为模块儿基准电压 1.25v,R1 = 20K,R2 = 8.2K。 因此得出 VAVDD = 4.3V
(为了降低功耗,该电压只在采样时刻才有输出, 因此用万用表读取的值可能低于 4.3v ,因为万用表测量的是有效值。 )
步骤 2 :如何计算 AD 输出最大值
在 4.3V 的供电电压下 5Kg 的传感器最大输出电压是 4.3v1mv/V = 4.3mV
经过 128 倍放大后,最大电压为 4.3mV128 = 550.4mV
经过 AD 转换后输出的24bit数字值最大为:550.4mV*2^ 24 /4.3V ≈ 2147483
步骤 3 :程序中数据如何转换
程序中通过HX711_Buffer = HX711_Read(); 获取当前采样的 AD 值,最大 2147483 ,存放在 long 型变量 HX711_Buffer 中,因 long 型变量计算速率和存放空间占用资源太多,固除以100 ,缩放为 int 型,便于后续计算。
Weight_Shiwu = HX711_Buffer/100;
Weight_Shiwu 最大为 21474 。
步骤 4 :如何将 AD 值反向转换为重力值。
假设重力为 A Kg ,( x<5Kg ) , 测量出来的 AD 值为 y
5Kg 传感器输出,发送给 AD 模块儿的电压为 A Kg * 4.3mV / 5Kg = 0.86A mV
经过 128 倍增益后为 128 * 0.86A = 110.08AmV
转换为 24bit 数字信号为 110.08A mV * 2 ^24 / 4.3V = 429496.7296A
所以 y = 429496.7296A /100 = 4294.967296 A
因此得出 A = (y / 4294.967296) Kg ≈ y / 4.30 g
所以得出程序中计算公式
Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/4.30+0.05);
//+0.05 是为了四舍五入百分位
特别注意:
因为不同的传感器斜率特性曲线不一样,因此,每一个传感器需要矫正这里的 4.30 这个除数。当发现测出来的重量偏大时,增加该数值。如果测试出来的重量偏小时,减小改数值。该数值一般在 4.0-5.0 之间。因传感器线性斜率不同而定。每个传感器都要校准。如果传感器测量值偏大,则需改大该数值,若传感器测量值偏小,则需改小该数值。
使用A通道的arduino程序如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | /////以下为函数声明 extern unsigned long HX711_Read(void); extern long Get_Weight(); ///变量定义 float Weight = 0; int HX711_SCK =2; /// 作为输出口 int HX711_DT= 3; /// 作为输入口 long HX711_Buffer = 0; long Weight_Maopi = 0, Weight_Shiwu = 0; #define GapValue 405 ///该值需校准 每个传感器都有所不同 void setup() { //初始化HX711的两个io口 pinMode(HX711_SCK, OUTPUT); ///SCK 为输出口 ---输出脉冲 pinMode(HX711_DT, INPUT); /// DT为输入口 ---读取数据 Serial.begin(9600); Serial.print("Welcome to use!\n"); delay(3000); ///延时3秒 //获取毛皮重量 Weight_Maopi = HX711_Read(); } void loop() /// 一直循环{}内容 ----- 同while(1){xxx} { Weight = Get_Weight(); //计算放在传感器上的重物重量 Serial.print(float(Weight/1000),3); //串口显示重量,3意为保留三位小数 Serial.print(" kg\n"); //显示单位 Serial.print("\n"); //显示单位 delay(2000); //延时2s 两秒读取一次传感器所受压力 } //称重函数 long Get_Weight() { HX711_Buffer = HX711_Read(); ///读取此时的传感器输出值 Weight_Shiwu = HX711_Buffer; ///将传感器的输出值储存 Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //获取实物的AD采样数值。 Weight_Shiwu = (long)((float)Weight_Shiwu/GapValue); //AD值转换为重量(g) return Weight_Shiwu; } unsigned long HX711_Read(void) //选择芯片工作方式并进行数据读取 { unsigned long count; ///储存输出值 unsigned char i; ////high--高电平 1 low--低电平 0 digitalWrite(HX711_DT, HIGH); //// digitalWrite作用: DT=1; delayMicroseconds(1); ////延时 1微秒 digitalWrite(HX711_SCK, LOW); //// digitalWrite作用: SCK=0; delayMicroseconds(1); ////延时 1微秒 count=0; while(digitalRead(HX711_DT)); //当DT的值为1时,开始ad转换 for(i=0;i<24;i++) ///24个脉冲,对应读取24位数值 { digitalWrite(HX711_SCK, HIGH); //// digitalWrite作用: SCK=0; /// 利用 SCK从0--1 ,发送一次脉冲,读取数值 delayMicroseconds(1); ////延时 1微秒 count=count<<1; ///用于移位存储24位二进制数值 digitalWrite(HX711_SCK, LOW); //// digitalWrite作用: SCK=0;为下次脉冲做准备 delayMicroseconds(1); if(digitalRead(HX711_DT)) ///若DT值为1,对应count输出值也为1 count++; } digitalWrite(HX711_SCK, HIGH); ///再来一次上升沿 选择工作方式 128增益 count ^= 0x800000; //按位异或 不同则为1 0^0=0; 1^0=1; ///对应二进制 1000 0000 0000 0000 0000 0000 作用为将最高位取反,其他位保留原值 delayMicroseconds(1); digitalWrite(HX711_SCK, LOW); /// SCK=0; delayMicroseconds(1); ////延时 1微秒 return(count); ///返回传感器读取值 } |
对于51、stm32等单片机的程序,只需做出简单修改就可。
HX711 AD 转换的计算详细可参考知乎
https://zhuanlan.zhihu.com/p/93838734?utm_source=qq&utm_medium=social&utm_oi=1000773993053503488
知乎,详细AD 转换讲解
接下来我们就进入正题,进行主函数的编程;此次工程用到串口通信、EEPROM存入数值、AD转换以及LCD12864并行通信;
所包含的库函数(自己建立的库函数)
#include <12864.h>
#include
#include
#include
#include
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 | #include<reg52.h> #include <intrins.h> #include <string.h> #include <stdio.h> #include <12864.h> #include <main.h> #include <HX711.h> #include <eeprom.h> #include <USART.h> /******************************************************************** *函数名: key_pros() * 功能 按键扫描 * ???? : ?? * ??? : ?? ***********************************************************************/ void key_pros { if(K1==0) { if(K1==0) //加 { delay1(100); if(K1==0) { I++; delay1(100); if(I>99999){I=50;beep=~beep;delay1(70);beep=1;} } while(!K1); } } if(K2==0) //减 { delay1(100); if(K2==0) { I--; delay1(100); if(I<0){I=50;beep=~beep;delay1(70);beep=1;} } while(!K2); } } /******************************************************************** * 函数名 : delay() * 功能 : 延迟100us *t子函数 * ???? : t * ??? : ?? ***********************************************************************/ void delay(unsigned int t) { unsigned int p,j; for(p=0; p<t; p++) for(j=0; j<10; j++); } /******************************************************************** * 函数名 : Timer0_ISR (void) interrupt 1 using 0() * 功能 : 定时器0中断 * ???? : ?? * ??? : ?? ***********************************************************************/ void Timer0_ISR (void) interrupt 1 using 0 { uchar Counter; TL0 = 0xb0; TH0 = 0x3c; //??????????? Counter ++;//?0.5??????????? if (Counter >= 10) { FlagTest = 1; Counter = 0; } } /******************把数据保存到eeprom******************/ void write_eeprom() { SectorErase(0x1000); GapValue1=GapValue&0x00ff; byte_write(0x2000, GapValue1); GapValue1=(GapValue&0xff00)>>8; byte_write(0x2001, GapValue1); byte_write(0x2060, a_a); } /******************读取数据从eeprom中*****************/ void read_eeprom() { GapValue = byte_read(0x2001); GapValue = (GapValue<<8)|byte_read(0x2000); a_a = byte_read(0x2060); } /***************开机自检初始化****************/ void init_eeprom() { read_eeprom(); //先读 if(a_a != 1) { GapValue = 210; a_a = 1; write_eeprom(); //保存 } } /******************************************************************** * 函数名 : keydat() * 功能 : 报警键值 * ???? : ?? * ??? : ?? ***********************************************************************/ void keydata() { int m; for(m=0;m<5;m++) { if(m==0) TX[7]=I/10000+0x30; //数据处理对应ASCII else if(m==1) TX[8]=I/10000%1000+0x30; else if(m==2) TX[9]=I%1000/100+0x30; else if(m==3) TX[10]=I%100/10+0x30; else TX[11]=I%10+0x30; } } /******************************************************************** * 函数名: Test() * 功能 : 显示子函数 * ???? : ?? * ??? : ?? ***********************************************************************/ void Test() { LCD12864_COM_Write(0x80); //设置指针 LCD12864_write_word(" PRESSURE"); //显示内容 LCD12864_COM_Write(0x90); //设置指针 LCD12864_write_word(pro1); //显示内容 LCD12864_COM_Write(0x88); //设置指针 LCD12864_write_word(pro); //显示内容 LCD12864_COM_Write(0x98); //设置指针 LCD12864_write_word(TX); //显示内容 } /******************************************************************** * 函数名: TEST1() * 功能 : 开机画面 * ???? : ?? * ??? : ?? ***********************************************************************/ void TEST1() { LCD12864_COM_Write(0x80); //设置指针 LCD12864_write_word(" PRESSURE"); //显示内容? LCD12864_COM_Write(0x90); //设置指针 LCD12864_write_word(" 压力检测"); //显示内容 LCD12864_COM_Write(0x88); //设置指针 LCD12864_write_word("Welcome to use"); //显示内容 LCD12864_COM_Write(0x98); //设置指针 LCD12864_write_word(" 欢迎使用"); //显示内容 } /******************************************************************** * 函数名: TEST1() * 功能 : 清屏函数 * ???? : ?? * ??? : ?? ***********************************************************************/ void TEST0() { LCD12864_COM_Write(0x80); //设置指针 LCD12864_write_word(" "); LCD12864_COM_Write(0x90); //设置指针 LCD12864_write_word(" "); LCD12864_COM_Write(0x88); //设置指针 LCD12864_write_word(" "); LCD12864_COM_Write(0x98); //设置指针 LCD12864_write_word(" "); } /******************************************************************** * 函数名: datat() * 功能 : 实际重量转换 存放数组 * ???? : ?? * ??? : ?? ***********************************************************************/ void datat() { pro1[2] = Weight_Shiwu1/10000 + 0X30; pro1[3] = Weight_Shiwu1/10000%1000 + 0X30; pro1[4] = Weight_Shiwu1%1000/100 + 0X30; pro1[5] = Weight_Shiwu1%100/10 + 0X30; pro1[6] = Weight_Shiwu1%10 + 0x30; pro1[7]='g'; pro1[10] = Weight_Shiwu2/10000 + 0X30; pro1[11] = Weight_Shiwu2/10000%1000 + 0X30; pro1[12] = Weight_Shiwu2%1000/100 + 0X30; pro1[13] = Weight_Shiwu2%100/10 + 0X30; pro1[14] = Weight_Shiwu2%10 + 0x30; pro1[15]='g'; pro[2] = Weight_Shiwu/10000 + 0X30; pro[3] = Weight_Shiwu/10000%1000 + 0X30; pro[4] = Weight_Shiwu%1000/100 + 0X30; pro[5] = Weight_Shiwu%100/10 + 0X30; pro[6] = Weight_Shiwu%10 + 0x30; pro[7]='g'; pro[10] = Weight_Shiwu3/10000 + 0X30;; pro[11] = Weight_Shiwu3/10000%1000 + 0X30; pro[12] = Weight_Shiwu3%1000/100 + 0X30; pro[13] = Weight_Shiwu3%100/10 + 0X30; pro[14] = Weight_Shiwu3%10 + 0X30; pro[15]='g'; pro[18]='\r'; pro[19]='\n'; //串口显示换行 } /******************************************************************** * 函数名: send() * 功能 : 串口发送函数 * ???? : ?? * ??? : ?? ***********************************************************************/ void send() { int G; for(G=0;G<16 ;G++) { SBUF=pro1[G]; delay1(20); //等待发送完毕 } for(G=0;G<20 ;G++) { SBUF=pro[G]; delay1(20); //等待发送完毕 } } /******************************************************************** *函数名: Main() * 功能 : 主函数 * ???? : ?? * ??? : ?? ***********************************************************************/ void Main() { init_eeprom(); //初始化eeprom Init(); LCD12864_Reset(); //液晶初始化 LCD12864_HAIZI_SET(); //设计为普通模式 TEST1(); //开机画面 Delay_ms1(1000); //等待 Get_Maopi(); //获取毛皮重量 Delay_ms1(100); //等待 Get_Maopi(); //获取毛皮重量 Delay_ms1(100); //等待 Get_Maopi(); //获取毛皮重量 Delay_ms1(100); //等待 Get_Maopi(); //获取毛皮重量多获取几次,数值更加精确 TEST0(); while(1) { key_pros(); //按键检测 keydata(); //键值处理 Delay_ms1(100); //等待 Get_Weight(); //和获取重量 datat(); //数据存放 send(); //发送至串口 Test(); //LCD12864显示 delay(30); //等待显示完全 } } /******************************************************************** * 函数名: Get_Weight() * 功能 :获取重量及报警 * ???? : ?? * ??? : ?? ***********************************************************************/ void Get_Weight() { Weight_Shiwu = HX711_Read00(); Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //获取1净重 Weight_Shiwu1 = HX711_Read01(); Weight_Shiwu1 = Weight_Shiwu1 - Weight_Maopi1; //获取2净重 Weight_Shiwu2 = HX711_Read02(); Weight_Shiwu2 = Weight_Shiwu2 - Weight_Maopi2; //获取3净重 Weight_Shiwu3 = HX711_Read03(); Weight_Shiwu3 = Weight_Shiwu3 - Weight_Maopi3; //获取4净重 if(Weight_Shiwu > 0||Weight_Shiwu1 > 0||Weight_Shiwu2 > 0||Weight_Shiwu3 > 0) { Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/GapValue); //计算实际重量1 Weight_Shiwu1 = (unsigned int)((float)Weight_Shiwu1/GapValue); //计算实际重量2 Weight_Shiwu2 = (unsigned int)((float)Weight_Shiwu2/GapValue); //计算实际重量3 Weight_Shiwu3 = (unsigned int)((float)Weight_Shiwu3/GapValue); //计算实际重量4 if(Weight_Shiwu > I||Weight_Shiwu1 > I||Weight_Shiwu2 > I||Weight_Shiwu3 > I) //判断是否超出键值 选择报警 { beep = 0; } else { beep = 1; } } else { Weight_Shiwu = 0; Weight_Shiwu1 = 0; Weight_Shiwu2 = 0; Weight_Shiwu3 = 0; } } /******************************************************************** * 函数名 : Get_Maopi() * 功能 : 获取毛皮 * ???? : ?? * ??? : ?? ***********************************************************************/ void Get_Maopi() { Weight_Maopi = HX711_Read00(); Weight_Maopi1 = HX711_Read01(); Weight_Maopi2 = HX711_Read02(); Weight_Maopi3 = HX711_Read03(); } /******************************************************************** * 函数名 : Delay_ms1(unsigned int n) * 功能 : MS延迟(12M晶振下) * ???? : ?? * ??? : ?? ***********************************************************************/ void Delay_ms1(unsigned int n) { unsigned int i,j; for(i=0;i<n;i++) for(j=0;j<123;j++); } |
MAIN.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #ifndef __MAIN_H__ #define __MAIN_H__ #include <reg52.h> #define uchar unsigned char #define uint unsigned int typedef unsigned char U8; typedef unsigned int U16; sbit beep=P1^0; sbit K1=P2^0; //+ sbit K2=P2^1; //- int I=50; unsigned char a=12; U8 pro[]={"3: 4:"}; U8 pro1[]={"1: 2:"}; U8 TX[]={"报警值 g"}; U8 count, count_r=0; uint GapValue,GapValue1; volatile bit ClearWeighFlag = 0; //????????????λ?????0? volatile bit FlagTest = 0; //????????????0.5????λ????????0 unsigned long Weight_Maopi = 0;// ???1??? unsigned long Weight_Maopi_0 = 0; unsigned long Weight_Maopi1 = 0;//???2??? unsigned long Weight_Maopi_1 = 0; unsigned long Weight_Maopi2 = 0;//???2??? unsigned long Weight_Maopi3 = 0;//???2??? unsigned int qupi=0; long Weight_Shiwu = 0; long Weight_Shiwu1 = 0; long Weight_Shiwu2 = 0; long Weight_Shiwu3= 0; extern void Delay_ms1(unsigned int n); extern void Get_Maopi(); //extern void Get_Maopi1(); extern void Get_Weight(); //extern void Get_Weight1(); void key_pros(); void Delay_ms1(unsigned int n); |
接下来展示一下自己编写的库函数,由于代码过多就不会展示.h文
件,只要在.h文件中
#ifndef HX711_H
#define _HX711_H_在这里定义自己的库函数名称,包含进去就行,就是套公式啦
…
…
… 在中间声明一下自己的写的函数就好
…
#endif 再来个结尾就结束啦 这大概就.h文件编写的要求,就类似于公式,套进去就好
蓝牙串口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include<USART.h> void delay1(int xms) { int m,n; for(m=xms;m>=0;m--) for(n=110;n>=0;n--); } void Init() { ES=0; SCON = 0x50; //工作方式1 设置波特率9600bps 允许接收 TMOD = 0x20; //定时器T1选择工作方式2 TH1=TL1=0xFD; PCON &= 0x7f; TR1 = 1; // 开启计时器 TI = 0; RI = 0; ES = 1; EA = 1; // 打开总中断 } void Timer0_Init() { ET0 = 1; //????????0?ж? TMOD = 1; //??????????????? TL0 = 0xb0; TH0 = 0x3c; //??????????? TR0 = 1; //???????? } |
12864.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | #include "12864.H" void LCD12864_WaitIdle() { unsigned char i; LCD12864_DA_PORT = 0xff; LCD12864_RS_PORT = 0; LCD12864_RW_PORT = 1; LCD12864_E_PORT = 1; while((LCD12864_DA_PORT&0x80)==1); /*???BF ???1*/ LCD12864_E_PORT = 0; for(i=0;i<5;i++); } void LCD12864_COM_Write( unsigned char com_da) { LCD12864_WaitIdle(); LCD12864_RS_PORT = 0; LCD12864_RW_PORT = 0; LCD12864_DA_PORT = com_da; LCD12864_E_PORT = 1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); LCD12864_E_PORT = 0; } void LCD12864_NoWaitIdle_COM_Write(unsigned char com_da) { LCD12864_RS_PORT = 0; LCD12864_RW_PORT = 0; LCD12864_DA_PORT = com_da; LCD12864_E_PORT = 1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); LCD12864_E_PORT = 0; } void LCD12864_Data_Write(unsigned char da) { LCD12864_WaitIdle(); /*???????*/ LCD12864_RS_PORT = 1; LCD12864_RW_PORT = 0; LCD12864_DA_PORT = da; LCD12864_E_PORT = 1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); LCD12864_E_PORT = 0; } void LCD12864_write_word(unsigned char *s) { while(*s>0) { LCD12864_Data_Write(*s); s++; } } void lcd_delay_ms(unsigned char x) { unsigned char j; while(x--){ for(j=0;j<125;j++) {;} } } void LCD12864_Reset() { lcd_delay_ms(100); /*????????LCD?????λ???*/ LCD12864_NoWaitIdle_COM_Write(0x30); /*???8λ??????*/ lcd_delay_ms(10); LCD12864_NoWaitIdle_COM_Write(0x30); /*???8λ??????*/ lcd_delay_ms(10); LCD12864_NoWaitIdle_COM_Write(0x0c); /*??????????????*/ lcd_delay_ms(10); LCD12864_NoWaitIdle_COM_Write(0x01); /*???????*/ lcd_delay_ms(30); LCD12864_NoWaitIdle_COM_Write(0x06); /*DDRAM????????????AC????1*/ lcd_delay_ms(30); } void LCD12864_HAIZI_SET() { LCD12864_COM_Write(0x30); lcd_delay_ms(10); LCD12864_COM_Write(0x30); lcd_delay_ms(10); } void Delay_ms(unsigned int n) { unsigned int i,j; for(i=0;i<n;i++) for(j=0;j<123;j++); } |
HX711.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | #include <HX711.h> void Delay__hx711_us(void) { _nop_(); _nop_(); } unsigned long HX711_Read00(void) //????128 { unsigned long count; unsigned char i; HX711_DOUT00=1; Delay__hx711_us(); HX711_SCK00=0; count=0; while(HX711_DOUT00); for(i=0;i<24;i++) { HX711_SCK00=1; count=count<<1; HX711_SCK00=0; if(HX711_DOUT00) count++; } HX711_SCK00=1; count=count^0x800000;//??25??????????????????????? Delay__hx711_us(); HX711_SCK00=0; return(count); } unsigned long HX711_Read01(void) //????128 { unsigned long count; unsigned char i; HX711_DOUT01=1; Delay__hx711_us(); HX711_SCK01=0; count=0; while(HX711_DOUT01); for(i=0;i<24;i++) { HX711_SCK01=1; count=count<<1; HX711_SCK01=0; if(HX711_DOUT01) count++; } HX711_SCK01=1; count=count^0x800000;//??25??????????????????????? Delay__hx711_us(); HX711_SCK01=0; return(count); } unsigned long HX711_Read02(void) //????128 { unsigned long count; unsigned char i; HX711_DOUT02=1; Delay__hx711_us(); HX711_SCK02=0; count=0; while(HX711_DOUT02); for(i=0;i<24;i++) { HX711_SCK02=1; count=count<<1; HX711_SCK02=0; if(HX711_DOUT02) count++; } HX711_SCK02=1; count=count^0x800000;//??25??????????????????????? Delay__hx711_us(); HX711_SCK02=0; return(count); } unsigned long HX711_Read03(void) //????128 { unsigned long count; unsigned char i; HX711_DOUT03=1; Delay__hx711_us(); HX711_SCK03=0; count=0; while(HX711_DOUT03); for(i=0;i<24;i++) { HX711_SCK03=1; count=count<<1; HX711_SCK03=0; if(HX711_DOUT03) count++; } HX711_SCK03=1; count=count^0x800000;//??25??????????????????????? Delay__hx711_us(); HX711_SCK03=0; return(count); } |
接下来要动动我们的小手来准备搭建电路啦;好了这篇文章就和大家分享到这里
谢谢 有不对的望大佬们指正
本次做的压力报警完工,代码以测试,运行平稳
![如图所示蓝牙界面](
https://img-blog.csdnimg.cn/20200516232939851.jpg?x-oss
-process=im
age/watermark,type_ZmFuZ3poZW5na澳景GVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTM2ODM5NA==,size_16,color_FFFFFF,t_70#pic_center)