找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2963|回复: 0
打印 上一主题 下一主题
收起左侧

[求助]

[复制链接]
跳转到指定楼层
楼主
ID:40027 发表于 2012-5-10 19:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

请高手帮忙改下这段程序(hx711和1602的现实程序)现实不了总是乱码

#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=P1^0;
sbit ADSK=P1^1;
bit key_4z;

sbit rs=P2^5;
sbit rw=P2^6;
sbit e=P2^7;
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)
{
 e=0;
 rs=0;
 rw=0;
 P0=deman;
 delay(2);
 e=1;
 delay(5);
 e=0;
}
void write_dat(uchar dat)
{
 
 e=0;
 rs=1;
 rw=0;
 P0=dat;
 delay(2);
 e=1;
 delay(5);
 e=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);
   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=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;
    dat=temp;
  }
   
  for(i=3;i<5;i++)
  {
   yy=dat;
   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;

//用的A通道 
//A通道  信号线是S+,S-//A通道

if (Count > xx3)
{
 Count=(Count - xx3)/xx2;//值为正_根据 重量数值 计算出有多少个0.1g (十六进制)
 key_4z=0;      //正负标志复位,表示值为正
}
else
{
 Count=(xx3 - Count)/xx2;//值为负_根据 重量数值 计算出有多少个0.1g (十六进制)
 key_4z=1;    //正负标志置位,表示值为负
}

return(Count);

[upload=c,hx711.c]viewFile.asp?ID=1071[/upload]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表