C51+HX711 传感器读取过来的数据一直不会发生变化,大家有空帮忙看看,99课程.设计
#include <reg52.h>
#include <intrins.h>
//校准参数
//因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。
//当发现测试出来的重量偏大时,增加该数值。
//如果测试出来的重量偏小时,减小改数值。
//该值可以为小数
#define GapValue 400
/*I/O口声明*/
sbit HX711_DOUT = P2^1; //声明P2^1口接HX711数据线
sbit HX711_SCK = P2^0; //声明P2^0口接HX711时钟线
/*全局变量定义*/
unsigned long Weight_Shiwu = 0;
unsigned char num;
bit Flag_ERROR = 0;
/*函数声明*/
unsigned long HX711_Read();
void Get_Weight();
void UsartInit();
void Delay_ms(unsigned int n);
int main()
{
unsigned char i,y=0;
unsigned char Data_1[9]; //存放通信的数字
unsigned char Data_2[9]; //存放通信的数字对应的字符
unsigned long temp;
UsartInit();
Delay_ms(1000); //延时,等待传感器稳定
while(1)
{
Get_Weight();
temp = Weight_Shiwu;//1
num = 0;
while(temp!=0)
{
temp = temp/10;
num++;//4
}
temp = Weight_Shiwu;
SBUF=num;//将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
Delay_ms(1000);
//将压力总和的数字分别存放在Data_1数组内
for(i=0;i<num;i++)
{
y = temp%10;
temp = temp/10;
Data_1[i] = y;
}
//将压力综合的数字转换为字符存放在Data_2数组内并逐个串口通信发送出去
for(i=0;i<num;i++)
{
switch(Data_1[num-1])
{
case 0:Data_2[i]='0';break;
case 1:Data_2[i]='1';break;
case 2:Data_2[i]='2';break;
case 3:Data_2[i]='3';break;
case 4:Data_2[i]='4';break;
case 5:Data_2[i]='5';break;
case 6:Data_2[i]='6';break;
case 7:Data_2[i]='7';break;
case 8:Data_2[i]='8';break;
case 9:Data_2[i]='9';break;
}
SBUF=Data_2[i];//将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
}
SBUF='\n';//将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
Delay_ms(2000);
}
return 0;
}
unsigned long HX711_Read(void)
{
unsigned long count; //存ad值
unsigned char i;
HX711_DOUT = 1; //数据端口拉高,参照时序图写
_nop_(); //延时
_nop_();
HX711_SCK = 0; //时钟端口拉低
count = 0; //ad值初始化
EA = 1;
while(HX711_DOUT);
EA = 0;
for(i=0; i<24; i++) //循环24次传数据,按位接收数据
{
HX711_SCK = 1; //准备转换数据
count = count << 1; //向左移位,即向低位补0,空出最低位进行传值操作,如1<<1为10
HX711_SCK = 0; //时钟脉冲下降延,数据开始转换
if(HX711_DOUT)
count++; //数据端为高则最低位+1,为1,数据端为低则最低位不变,为0(左移把最低位空出)
}
HX711_SCK = 1; //第25个脉冲延
count = count^0x800000; //异或输出原码
_nop_();
_nop_();
HX711_SCK = 0; //结束ad转换
return(count); //传出ad值
}
/*称实物重*/
void Get_Weight()
{
Weight_Shiwu = HX711_Read();
if(Weight_Shiwu > 0)
{
Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/GapValue); //计算实物的实际重量
if(Weight_Shiwu > 5000) //超重报警
{
Flag_ERROR = 1;
}
else
{
Weight_Shiwu = 11;
Flag_ERROR = 0;
}
}
else
{
Weight_Shiwu = 0;
// Flag_ERROR = 1; //负重报警
}
}
//延迟函数
void Delay_ms(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
void UsartInit(void)
//{
// SCON =0x50; // SCON: 模式 1, 8-bit UART, 使能接收
// TMOD |= 0x20; // TMOD:timer 1, mode 2, 8-bit 重装
// TH1 =TL1= 0xFD; // TH1: 重装值9600 波特率 晶振 11.0592MHz
// TR1 =1; // TR1: timer 1 打开
// EA = 1; //打开总中断
// ES = 1; //打开串口中断
//}
{
SCON = 0X50; //UART方式1;8位UART
REN = 0; //不允许串行口接收数据
PCON = 0x00; //SMOD=0;波特率不加倍
TMOD = 0x21; //T1方式2,用于产生波特率
TH1 = 0xFD; //装初值
TL1 = 0xFD;
TR1 = 1; //启动定时器1
EA = 1; //打开全局中断控制
ES = 0; //串行口中断
}
```