做电子秤的时候遇到问题下请教下

2019-07-15 12:28发布

用的普通的那种桥式压力传感器,AD转换器是HX711模块,显示屏是1602,单片机是郭天祥开发板89C52RC单片机,按要求连好线之后,1602不显示,什么都没有,用力按压力传感器也没有显示。我的思路是压力传感器感受压力,把信号发给AD, AD把它转化成count变量,然后ad_change()函数把count转化成重量值,然后display()函数在1602上显示。 write_com(uchar),  write_data(uchar)函数是1602显示时候用到的。
不知道哪里有问题,谢谢。

/*采集压力并在1602上显示*/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long

/*管脚引用定义*/
sbit dula=P2^6;
sbit wela=P2^7;
sbit lcden=P3^5;
sbit lcdrs=P3^6;
sbit ADDO = P3^0;
sbit ADSK = P3^1;

/*全局变量*/          
ulong count; //AD值
ulong weight; //转化好的重量
ulong AD_Init_Value;//AD初始值为0

/*表*/
uchar code table[]={"0123456789. "};

/*函数原型*/
void delay(uint);
void init();
void write_com(uchar);
void write_data(uchar);
void HX711_Read();
void ad_change();
void display();

/*主函数*/
void main()
{
        while(1)
        {
                HX711_Read();          //本就是无参函数
                ad_change();
                display();
        }
}

/*桥式压力传感器采集压力*/
void HX711_Read(void)        //增益128
{         
             uchar i;  
            ADSK=0;       //使能AD(PD_SCK 置低)
            count=0;
            while(ADDO);    //AD转换未结束则等待,否则开始读取
                for (i=0;i<24;i++)
                {   
                        ADSK=1;     //PD_SCK 置高(发送脉冲)  
                    count=count<<1; //下降沿来时变量Count左移一位,右侧补零
                    ADSK=0;     //PD_SCK 置低  
                       if(ADDO) count++;
            }
                ADSK=1;
            count=count^0x800000;//第25个脉冲下降沿来时,转换数据
                ADSK=0;        
}

/*将AD值转化为重量        */
void ad_change(void)//原来是AD_VALUE       
{
        count=count/100;
        count=count-81650;
//        AD_VALUE=AD_VALUE-AD_Init_Value;  //减去AD初始值
        if(count+15<15) count=0;                 //排除AD_VALUE是负值的情况
        if(count<450)                                                //数据分段拟合
             count=(0.4766+0.2422*count);
        else if(count<850)
             count=(1.382+0.24*count);
        else if(count<1250)
             count=(1.1+0.2409*count);
        else if(count<1660)
         count=(2.405+0.2397*count);
        else if(count<2500)
             count=(1.045+0.2406*count);
        else
             count=888;
    weight=count;                   //仅仅是换个名称
}


/*1602显示重量*/
void display()     //显示程序        uint         temp
{
        ulong A1,A2,A3;   
        A1=weight/100;                          //temp
        A2=(weight%100)/10;
        A3=(weight%100)%10;

        init();                //1602初始化函数
        write_com(0x80);  //准备给1602第一行写入字符
        write_data(table[A1]);        //百位
        delay(10);
    write_data(table[A2]);        //十位
        delay(10);
    write_data(table[A3]);        //个位
        delay(10);
        write_data(table[1]);
        delay(10);         
/*        dula=1;
        P0=table[(uchar)A3];        
        dula=0;
        P0=0xff;       
        wela=1;
    P0=0x00;
        wela=0;       
          delay(5); */
}                               

/*1602初始化函数*/          
void init()
{
        dula=0;
        wela=0;
        lcden=0;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
}

/*1602需要用到的子函数1*/  
void write_com(uchar com)
{
        lcdrs=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}

/*1602需要用到的子函数2*/       
void write_data(uchar date)
{
        lcdrs=1;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}

/*延时函数*/
void delay(uint z)          
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。