用的普通的那种桥式压力传感器,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--);
}
一周热门 更多>