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