我的电子称工作不起来,请大家指导一下

2019-07-16 05:56发布

我焊接的电路都是通的,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);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
akoosy
1楼-- · 2019-07-16 09:36
 精彩回答 2  元偷偷看……
djx462
2楼-- · 2019-07-16 13:15
顶顶
小康少
3楼-- · 2019-07-16 13:53
好长,不想看了,显示是没有错误的话,说明语句不是自己想要的

一周热门 更多>