做电子秤的时候遇到问题下请教下
时间: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--);
}
不知道哪里有问题,谢谢。
/*采集压力并在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. "};
这段是什么意思啊,就只定义了一个字符串?不是要分别定义显示的数字吗