|
單片機(jī)STC89C52,做了一個(gè)HX711的稱重電子秤。
程序:
#include <reg52.h>
#include <intrins.h>
// 定義LCD1602相關(guān)引腳
sbit RS = P2^6; // RS引腳
sbit RW = P2^5; // RW引腳
sbit E = P2^7; // E引腳
sbit DATA = P0; // 數(shù)據(jù)線引腳
// 定義HX711相關(guān)引腳
sbit PD_SCK = P1^5; // 時(shí)鐘引腳
sbit DOUT = P1^6; // 數(shù)據(jù)引腳
// 定義獨(dú)立按鍵引腳
sbit KEY = P3^2;
// 定義全局變量
bit tareFlag = 0; // 去皮操作標(biāo)志位
long tareValue = 0; // 去皮值
// LCD1602寫命令
void LcdWriteCmd(unsigned char cmd) {
RS = 0;
RW = 0;
DATA = cmd;
_nop_();
E = 1;
_nop_();
E = 0;
_nop_();
}
// LCD1602寫數(shù)據(jù)
void LcdWriteData(unsigned char dat) {
RS = 1;
RW = 0;
DATA = dat;
_nop_();
E = 1;
_nop_();
E = 0;
_nop_();
}
// LCD1602初始化
void LcdInit() {
LcdWriteCmd(0x38); // 設(shè)置16x2顯示模式
LcdWriteCmd(0x0c); // 開啟光標(biāo)并關(guān)閉閃爍
LcdWriteCmd(0x06); // 光標(biāo)右移
LcdWriteCmd(0x01); // 清除顯示
LcdWriteCmd(0x80); // 設(shè)置顯示位置為第一行第一個(gè)字符
}
// HX711讀取數(shù)據(jù)
long Hx711Read() {
unsigned char i;
long value = 0;
while(DOUT);
for (i = 0; i < 24; i++) {
PD_SCK = 1;
value = value << 1;
_nop_();
if (DOUT) {
value++;
}
PD_SCK = 0;
_nop_();
}
for (i = 0; i < 1; i++) {
PD_SCK = 1;
_nop_();
PD_SCK = 0;
_nop_();
}
return value;
}
// 延時(shí)函數(shù)
void Delay(unsigned int n) {
unsigned int i, j;
for (i = n; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
// 顯示重量和去皮值
void DisplayWeight(long weight) {
unsigned char i;
unsigned long temp;
unsigned char str[] = "Weight:";
temp = weight;
for (i = 7; i >= 0; i--) {
str[7 - i + 7] = temp % 10 + '0';
temp /= 10;
}
for (i = 0; i < 8; i++) {
LcdWriteData(str[i]);
}
if (tareFlag) {
unsigned char strTare[] = " Tare:";
temp = tareValue;
for (i = 7; i >= 0; i--) {
strTare[7 - i + 6] = temp % 10 + '0';
temp /= 10;
}
for (i = 0; i < 7; i++) {
LcdWriteData(strTare[i]);
}
}
}
// 去皮操作
void Tare() {
tareFlag = 1;
tareValue = Hx711Read();
}
// 主函數(shù)
void main() {
long weight;
LcdInit(); // 初始化LCD1602
Delay(5);
while (1) {
weight = Hx711Read(); // 讀取重量
if (tareFlag) {
weight -= tareValue; // 計(jì)算凈重
}
DisplayWeight(weight); // 顯示重量
if (KEY == 0) {
Delay(50);
if (KEY == 0) {
Tare(); // 執(zhí)行去皮操作
while (!KEY);
Delay(10);
}
}
}
}
|
|