請高手幫忙改下這段程序(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]| 歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |