请高手帮忙改下这段程序(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]
|