我焊接的
电路都是通的,1602能显示,
电子称的程序也下去,1602就有黑格子,不知道是不是AD转换模块自己焊的时候焊得不好,大家帮我看一下程序,谢谢
#include<reg52.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
uchar i,ms,p,s;
void Delay_us(unsigned char j);
void Delay_ms(unsigned char i);
unsigned long ReadAD(void);
unsigned long xx,x,y; //重量数值返回(十六进制)
unsigned char xx2=0x30; //多少单位重量数值 为0.1g
unsigned long xx3=0x82BD9A; //零点值(十六进制)
unsigned char xx4;
sbit ADDO=P2^2;
sbit ADSK=P3^6;
bit key_4z;
sbit rs=P3^5;
sbit rw=P3^4;
uchar c[];
uchar tab[]="0123456789";
unsigned long dat[];
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delayus(uint k)
{
for(;k>0;k--);
}
void write1602_com(uchar deman)
{
P0=deman;
rs=0;
rw=0;
delay(2);
rw=1;
delay(5);
rw=0;
}
void write_dat(uchar dat)
{
P0=dat;
rs=1;
rw=0;
delay(2);
rw=1;
delay(5);
rw=0;
}
void init(void)
{
delayus(15);
write1602_com(0x38);
delayus(5);
write1602_com(0x38);
delayus(5);
write1602_com(0x38);
write1602_com(0x38);
write1602_com(0x08);
write1602_com(0x01);
write1602_com(0x06);
write1602_com(0x0c);
}
void Delay_ms(unsigned char i)
{
do{
Delay_us(0);
i--;
}
while(i);
}
//--------------------------------------------------------------------------
//函数名称: Delay_us()
//函数功能: 延时( 2*J+2)微秒
//其他说明:
//--------------------------------------------------------------------------
void Delay_us(unsigned char j)
{
do{j--;}
while(j);
}
void delay_50ms(uint z)
{
uint x;
for(;z>0;z--)
for(x=6245;x>0;x--);
}
void delay_50us(uint k)
{
uint j;
for(;k>0;k--)
for(j=19;j>0;j--);
}
void display()
{
/*if(key_4z)
c[0]=tab[11]; */ //为负加"-"前缀(tab[xx/10000]); //串口发送ASCII码十进制千位
c[5]=tab[xx/10000];
//串口发送ASCII码十进制百位
xx=xx%10000;
c[6]=tab[xx/1000]; //串口发送ASCII码十进制十位
xx=xx%1000;
c[7]=tab[xx/100];
xx=xx%100;
xx=xx ;
c[8]=tab[xx/10];
/*
c //串口发送ASCII码十进制个位
c[4]=tab[10]; //小数点
c[5]=(tab[xx%10]);*/ //串口发送ASCII码十进制小数位
init();
write1602_com(0x80);
for(i=0;i<16;i++)
{
write_dat(c[i]);
delay(5);
}
}
void main()
{
uchar i;
delay_50ms(4);
for(i=0;i<5;i++)
{
xx4=xx2; //备份g换算值
xx2=1; //取消g换算
xx3=0; //零点值置零
xx3=ReadAD(); //取得新的零点值
xx2=xx4;
delay_50ms(1);
}
delay_50ms(2);
while(1)
{
unsigned int temp,j,min;
unsigned long yy=0,yy1=0;
for(i=0;i<6;i++)
{
dat[i]=ReadAD();delay_50ms(2);
}
for(i=0;i<6;i++)
{
min=i;
for(j=i+1;j<6;j++)
if(dat[j]<dat[min])
min=j;
temp=dat[min];
dat[min]=dat[i];
dat[i]=temp;
}
for(i=3;i<5;i++)
{
yy=dat[i];
yy1+=yy;
}
xx=yy1/2;
display();
delay_50ms(2);
}
}
unsigned long ReadAD(void)
{
unsigned long Count;
unsigned char j;
ADSK=0; // 使能AD(PD_SCK 置低)
ADDO=1; //51CPU 准双向I/0 输入使能
Count=0;
//在这里一直等待有数据程序才会向下执行,即ADDO为低电平
while(ADDO); // 判断AD转换是否结束,若未结束则等待否则开始读取
for(j=24;j>0;j--)
{
ADSK=1; //PD_SCK 置高(发送脉冲)
Count=Count<<1; //每个高电平到低电平的下降沿来时,变量count左移一位,右侧补零
ADSK=0; //PD_SCK 置低
if(ADDO)Count++;
}
ADSK=1;
Count=Count^0x800000; //第25个脉冲下降沿来时,转化数据。Count与0x800000按位做xor运算。
ADSK=0;
//我是用的B通道
//B通道 信号线是B+,B- A通道 信号线是S+,S-
//A通道 把下面这句删了Delay_us(1);ADSK=1;Delay_us(1);ADSK=0;
//
//
if (Count > xx3)
{
Count=(Count - xx3)/xx2;//值为正_根据 重量数值 计算出有多少个0.1g (十六进制)
key_4z=0; //正负标志复位,表示值为正
}
else
{
Count=(xx3 - Count)/xx2;//值为负_根据 重量数值 计算出有多少个0.1g (十六进制)
key_4z=1; //正负标志置位,表示值为负
}
return(Count);
}
一周热门 更多>