各位大神!我用STC12LE5A60S2單片機和HX711編寫了一個電子秤程序,我想通過一只按鍵按一次鎖定數碼管顯示的重量,再按一次解除鎖定,進入正常顯示。我試了下,斷開hx711的DOUT或者PD_SCK或者同時斷開均可達到目的,但不知C程序如何編寫,試了很多方法均不行,敬請個位大神給點思路,謝謝!!下面是程序:請大家幫忙看看!謝謝指教!
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint Lheight;
uint compensate;
uchar discode[4]={0,0,0,0};
extern void LedDisplay(void);
sbit P10= P1^0; //按鍵
sbit hx711_dout=P3^6;
sbit hx711_sck=P3^7;
extern unsigned char discode[4];
uchar code Dis_7[10]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };//0,1,2,3,4,5,6,7,8,9
uchar code scan_con[4]= {0xfe,0xfd,0xfb,0xf7 };
unsigned int ReadCount(void);
// 延時 MS
void delay(uint x)
{
uchar j;
while(x--)
{
for(j=0;j<125;j++)
{;}
}
}
//延時 500US
void delay500us(void)
{
unsigned char a,b;
for(b=7l;b>0;b--)
for(a=2;a>0;a--);
}
//hx711 us延時
void delay_hx711_us(void)
{
_nop_();
_nop_();
}
//數碼管顯示
void LedDisplay(void)
{
uchar k;
for(k=0;k<4;k++)
{
P0=Dis_7[discode[k]];
P2=scan_con[k];
delay500us();
P2=0xff;
}
}
// 按鈕
void ButtonScan(void)
{
if(!P10)
{
delay(10);
}
if(!P10)
{
compensate=ReadCount();//
}
}
//讀重量值,并A/D轉換,返回 (hx711驅動程序)
unsigned int ReadCount(void)
{
unsigned long Count;
uint ADval;
uchar i;
hx711_dout=1;
delay_hx711_us();
hx711_sck=0;
Count=0;
while(hx711_dout)
LedDisplay();
for(i=0;i<24;i++)
{
hx711_sck=1;
Count=Count<<1;
hx711_sck=0;
if(hx711_dout)
Count++;
}
hx711_sck=1;
delay_hx711_us();
Count=Count^0x800000; //第25個脈沖下降沿來時轉換數據
hx711_sck=0;
ADval=(float)(Count>>8);
return(ADval);
}
//分解
void discode0(void)
{
discode[0]=Lheight%10;
discode[1]=(Lheight%100)/10;
discode[2]=(Lheight%1000)/100;
discode[3]=(Lheight%10000)/1000;
}
//讀取重量值
void WeighWork(void)
{
float Tempheight;
uint a;
a=ReadCount();
if(a<=compensate)
Lheight=0; //校0
else Lheight=a-compensate;
discode0(); //調用數值分解函數
Lheight=discode[3]*1000+discode[2]*100+discode[1]*10+discode[0];
Tempheight=(float)(Lheight/0.822);
Lheight=(float)(Tempheight); // 將Tempheight轉浮點型
discode0(); //調用數值分解函數
}
void main(void)
{
P10=1;
delay(1000);
compensate=ReadCount()+1;
while(1)
{
// ReadCount();
WeighWork();
LedDisplay();
ButtonScan();
}
}
|