微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 做电子秤的时候遇到问题下请教下

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

时间:10-02 整理:3721RD 点击:
用的普通的那种桥式压力传感器,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--);
}

首先要保证硬件没有错,软件一个功能一个功能的测试,不要急于求成。大家只能给你提供解决的思路,具体问题还要你自己慢慢调试查找。

量程准备做500g的


这是Hx711模块参考驱动程序


要显示的重量就3位,百,十,个,单位是g

额。没有人吗

不知道你要问什么问题

就是1602不显示,是哪里错了

作业?

这个是作业。

哪里不会点哪里,既然是1602有问题  就先调试1602显示 编程记得要模块化 方便调试!

一个模块一个模块的调试,效果应该比较好!

已發現 .....
1.主函数內未調用1602初始化函数 init()
2.lcdrw 未驅動 .....(除非 LCD 的接腳是固定接在 LOW )
修改後測試看看

好吧,,,,,我不是急,只是实在没看出来

好,我试试。

我的开发板上R/W非 端是恒接地的。住函数内也调用了1602初始化函数了,还是不行。不过有一会不知道为什么好像显示了539。再下载就不行了

是不是1602的引脚定义错了?最近也弄了个电子秤,1602也没显示,最后发现是引脚定义错了

唉。不是,,,

大侠,请教一个问题:
uchar code table[]={"0123456789. "};
这段是什么意思啊,就只定义了一个字符串?不是要分别定义显示的数字吗

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top