HX711 压力调试 51程序


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.3mV
128 = 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)