Joker_House 2021-12-30 00:06 采纳率: 50%
浏览 164
已结题

C51+HX711 传感器读取过来的数据一直不会发生变化

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;     //串行口中断    
}

```

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 已结题 (查看结题原因) 12月30日
    • 创建了问题 12月30日

    悬赏问题

    • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
    • ¥15 setInterval 页面闪烁,怎么解决
    • ¥15 如何让企业微信机器人实现消息汇总整合
    • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
    • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
    • ¥15 TLE9879QXA40 电机驱动
    • ¥20 对于工程问题的非线性数学模型进行线性化
    • ¥15 Mirare PLUS 进行密钥认证?(详解)
    • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
    • ¥20 想用ollama做一个自己的AI数据库