請高手幫忙改下這段程序(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]
|