51单片机电子秤(HX711模块 + LCD1602)
51單片機(jī)電子秤(HX711模塊 + LCD1602)
(簡單易懂)
1.---------------序
2.HX711測重模塊
3.LCD1602顯示模塊
4.電子秤整體實現(xiàn)原理
5.模塊升級>>去皮與還原
6.源代碼
零.先來一個效果展示
這里可以看到3個20g砝碼加上去顯示60g的重量
5個20g砝碼加上去顯示100g的重量,精度是比較準(zhǔn)的
一.首先考慮如何把這樣一個項目設(shè)計出來
1.明確目標(biāo)
–做這樣一個東西,我們需要實現(xiàn)怎樣的效果–
2.思路清晰
–整個執(zhí)行過程我門需要設(shè)計哪些事–
–整個執(zhí)行過程我們要按照怎樣的一個邏輯–
3.確保執(zhí)行
–有效(花時間并不等于有效)的執(zhí)行力是成功所必不可缺的–
4.總結(jié)收獲
–在實現(xiàn)項目過程中我們學(xué)到了什么–
–以后應(yīng)對不同的項目有哪些想法是可以通用的–
二.HX711測重模塊原理
1.HX711模塊可以看成由三個部分組成>>壓力傳感器,電壓放大器,ad轉(zhuǎn)換芯片
壓力傳感器:感知物體重力,并轉(zhuǎn)化為電壓信號這里是0~5kg壓力傳感器,靈敏電壓為1mv,即1kg重力產(chǎn)生1mv電壓電壓放大器:由于壓力傳感器產(chǎn)生電壓太小,需要對電壓信號放大這里用的是128倍電壓增益ad轉(zhuǎn)換芯片(24位):將模擬信號(放大后的電壓值)轉(zhuǎn)化為數(shù)字信號(ad值)2.ad值轉(zhuǎn)化為重力大小
假設(shè)重力為x kg,ad = (x/5)*128*2^24*(5/5000),(滿量程為5kg,128倍放大,精度為2^24)(傳感器滿偏電壓5mv,單片機(jī)為5v)ad = 429496.7296x >> x = ad/429496.7296 (按g顯示再乘1000即可) //ad轉(zhuǎn)化為重力大小公式,(float)將整除轉(zhuǎn)化為小數(shù)運(yùn)算,再將運(yùn)算結(jié)果強(qiáng)制轉(zhuǎn)化為無符號整型數(shù)值 Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/423.15); //理論上是除以429.5,實際上存在誤差(傳感器曲線以及電壓的微小誤差),需要根據(jù)顯示情況來調(diào)整這一數(shù)值3.HX711時序圖 & ad取值代碼
sbit HX711_DOUT = P2^1; //聲明P2^1口接HX711數(shù)據(jù)線 sbit HX711_SCK = P2^0; //聲明P2^0口接HX711時鐘線 unsigned long HX711_Read(void) {unsigned long count; //存ad值unsigned char i; HX711_DOUT = 1; //數(shù)據(jù)端口拉高,參照時序圖寫_nop_(); //延時_nop_();HX711_SCK = 0; //時鐘端口拉低count = 0; //ad值初始化for(i=0; i<24; i++) //循環(huán)24次傳數(shù)據(jù),按位接收數(shù)據(jù){ HX711_SCK = 1; //準(zhǔn)備轉(zhuǎn)換數(shù)據(jù)count = count << 1; //向左移位,即向低位補(bǔ)0,空出最低位進(jìn)行傳值操作,如1<<1為10HX711_SCK = 0; //時鐘脈沖下降延,數(shù)據(jù)開始轉(zhuǎn)換if(HX711_DOUT)count++; //數(shù)據(jù)端為高則最低位+1,為1,數(shù)據(jù)端為低則最低位不變,為0(左移把最低位空出)} HX711_SCK = 1; //第25個脈沖延count = count^0x800000; //異或輸出原碼_nop_();_nop_();HX711_SCK = 0; //結(jié)束ad轉(zhuǎn)換return(count); //傳出ad值 }ad值以二進(jìn)制補(bǔ)碼輸出
這里用的是128倍增益A通道
三.LCD1602液晶顯示模塊原理
引腳說明
讀寫說明
寫指令/數(shù)據(jù)時序圖
1.寫指令(發(fā)送寫下的指令碼給LCD1602并執(zhí)行)
sbit LCD1602_RS = P3^5; //sbit LCD1602_RW = P2^5; //郭天祥51板LCDRW端直接接了地,故省略(就不能拉高不能讀指令/數(shù)據(jù)操作) sbit LCD1602_EN = P3^4; void LCD1602_write_com(unsigned char com) //聲明指令參數(shù) {LCD1602_RS = 0;Delay(10);LCD1602_EN = 1;P0 = com; //生成指令Delay(10);LCD1602_EN = 0; }lcd1602指令表
2.寫數(shù)據(jù)(把數(shù)據(jù)寫入LCD1602并顯示)
void LCD1602_write_data(unsigned char dat) //聲明數(shù)據(jù)參數(shù) {LCD1602_RS = 1;Delay(10); P0 = dat; //生成數(shù)據(jù)LCD1602_EN = 1;Delay(10);LCD1602_EN = 0; }3.寫連續(xù)字符(字符串)
void LCD1602_write_word(unsigned char *s) {while(*s>0){LCD1602_write_data(*s); //寫指針位置處字符數(shù)據(jù)s++; //指針++指向連續(xù)字符下一個位置} }4.LCD1602初始化
void Init_LCD1602() {LCD1602_EN = 0;//LCD1602_RW = 0; //設(shè)置為寫狀態(tài)LCD1602_write_com(0x38); //顯示模式設(shè)定LCD1602_write_com(0x0c); //開關(guān)顯示、光標(biāo)有無設(shè)置、光標(biāo)閃爍設(shè)置LCD1602_write_com(0x06); //寫一個字符后指針加一LCD1602_write_com(0x01); //清屏指令 }四.電子秤整體實現(xiàn)原理
1.HX711模塊與51單片機(jī)的通信(獲取到重量電壓信號ad值傳給單片機(jī))
2.51單片機(jī)與LCD1602的通信(在LCD1602上顯示ad值轉(zhuǎn)換為的實際重量)
以下是如何顯示重量值
/*0x80為移動光標(biāo)到顯示屏第一行首位,+0x40是光標(biāo)到第二行首位,再+0x09是光標(biāo)再往后挪九格,指令表中可查*/ LCD1602_write_com(0x80+0x49); /*取千位具體數(shù)字值,+0x30表示將該數(shù)字值轉(zhuǎn)為ASCII碼表地址,例int a=8,ASCII碼表中8的地址為0x38,即a+0x30*/ LCD1602_write_data(Weight_Shiwu%10000/1000 + 0X30); LCD1602_write_com(0x80+0x49); //光標(biāo)移動第二行第九個位置LCD1602_write_data(Weight_Shiwu%10000/1000 + 0X30); //千位LCD1602_write_data(Weight_Shiwu%1000/100 + 0X30); //百位LCD1602_write_data(Weight_Shiwu%100/10 + 0X30); //十位LCD1602_write_data(Weight_Shiwu%10 + 0X30); //個位LCD1602_write_word(" g"); //顯示單位克五.模塊升級>>去皮與還原
1.首先理解去皮的含義:
假如你有一個梨,你想知道它的重量,看看賣家有沒有坑你,以后能不能再到這買梨,
可你覺得秤太臟了,秤一下梨都沒有食欲不想吃了,靈光突然一閃想到可以用一個碗墊著秤,
想法不錯可問題就來了,碗的重量怎么辦呢,這時去皮的意義就出來了
先把碗放在秤盤上,這時顯示屏顯示的是碗的重量,小手一抖按一下去皮鍵,
碗的重量就沒有了,顯示屏顯示0,這下可以安心秤梨了
2.去皮如何實現(xiàn):
I/O口聲明&變量聲明 sbit key1 = P3^6; //聲明按鍵1(去皮鍵)具體I/O口和單片機(jī)型號有關(guān) sbit key2 = P3^7; //聲明按鍵2(還原鍵) unsigned long Weight_Shiwu = 0; //無符號長型變量存實物重量 unsigned long Weight_Maopi = 0; //毛皮重量(相當(dāng)于碗的重量)先判斷去皮鍵是否被按下
void Keyscan() {if(key1 == 0)Delay(10); //消抖if(key1 == 0){Get_Maopi(); //獲取毛皮重量(相當(dāng)于碗的重量)while(!key1); //松手檢測} }去皮鍵按下后,就可以獲取毛皮重量(碗重量)了
void Get_Maopi() {Weight_Maopi = HX711_Read(); //把a(bǔ)d值獲取到Weight_Maopi = (unsigned int)((float)Weight_Maopi/423.15); //換算成真正的毛皮重量 }將按鍵掃描放在主函數(shù)while(1)死循環(huán)的最開始,去皮鍵按下才執(zhí)行
去皮鍵未按下就直接稱重,跳過去皮環(huán)節(jié)
3.如何還原去皮:
在按鍵掃描函數(shù)中再加一個還原按鍵
如果還原鍵按下,毛皮重量被初始化(置0)
就實現(xiàn)了還原去皮的效果
六.源代碼及注釋
#include<reg52.h> #include <intrins.h>/*I/O口聲明*/ sbit LCD1602_RS = P3^5; //sbit LCD1602_RW = P2^5; sbit LCD1602_EN = P3^4; sbit HX711_DOUT = P2^1; sbit HX711_SCK = P2^0; sbit key1 = P3^6; sbit key2 = P3^7;/*全局變量定義*/ unsigned long Weight_Shiwu = 0; unsigned long Weight_Maopi = 0;/*函數(shù)聲明*/ void Delay(unsigned int n); void Init_LCD1602(); void LCD1602_write_com(unsigned char com); void LCD1602_write_word(unsigned char *s); void LCD1602_write_data(unsigned char dat); unsigned long HX711_Read(void); void Keyscan(); void Get_Maopi(); void Get_Weight();int main() { Init_LCD1602(); //LCD1602初始化LCD1602_write_com(0x80); //移動光標(biāo)到第一行首位LCD1602_write_word(" Dian Zi Cheng! "); //顯示 Dian Zi Cheng! LCD1602_write_com(0x80 + 0x40); //移動光標(biāo)到第二行首位LCD1602_write_word("Weight :"), //顯示W(wǎng)eight :Delay(1000); //1s延時while(1){Keyscan();Get_Weight(); LCD1602_write_com(0x80+0x49); //移動光標(biāo)到第二行第九位LCD1602_write_data(Weight_Shiwu%10000/1000 + 0X30); LCD1602_write_data(Weight_Shiwu%1000/100 + 0X30);LCD1602_write_data(Weight_Shiwu%100/10 + 0X30);LCD1602_write_data(Weight_Shiwu%10 + 0X30);LCD1602_write_word(" g");}return 0; }/*稱實物重*/ void Get_Weight() {Weight_Shiwu = HX711_Read();Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/423.15);Weight_Shiwu = Weight_Shiwu - Weight_Maopi; }/*延時子函數(shù)*/ void Delay(unsigned int n) {int i, j;for(i=0; i<n; i++)for(j=0; j<110; j++); }/*寫指令*/ void LCD1602_write_com(unsigned char com) {LCD1602_RS = 0;Delay(10);LCD1602_EN = 1;P0 = com;Delay(10);LCD1602_EN = 0; }/*寫數(shù)據(jù)*/ void LCD1602_write_data(unsigned char dat) {LCD1602_RS = 1;Delay(10); P0 = dat;LCD1602_EN = 1;Delay(10);LCD1602_EN = 0; }/*寫連續(xù)字符(字符串)*/ void LCD1602_write_word(unsigned char *s) {while(*s>0){LCD1602_write_data(*s);s++;} }/*初始化LCD1602*/ void Init_LCD1602() {LCD1602_EN = 0;//LCD1602_RW = 0;LCD1602_write_com(0x38);LCD1602_write_com(0x0c);LCD1602_write_com(0x06);LCD1602_write_com(0x01); }/*獲取ad值*/ unsigned long HX711_Read(void) {unsigned long count; unsigned char i; HX711_DOUT = 1; _nop_();_nop_();HX711_SCK = 0; count=0;for(i=0; i<24; i++){ HX711_SCK = 1; count = count << 1; HX711_SCK = 0; if(HX711_DOUT)count++; } HX711_SCK = 1; count = count^0x800000;_nop_();_nop_();HX711_SCK = 0; return(count); }/*稱毛皮重*/ void Get_Maopi() {Weight_Maopi = HX711_Read();Weight_Maopi = (unsigned int)((float)Weight_Maopi/423.15); }/*按鍵掃描*/ void Keyscan() {if(key1 == 0)Delay(10);if(key1 == 0){Get_Maopi();while(!key1);}if(key2 == 0)Delay(10);if(key2 == 0){Weight_Maopi = 0;while(!key2);} }總結(jié)
以上是生活随笔為你收集整理的51单片机电子秤(HX711模块 + LCD1602)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 视频教程-尹成老师带你学算法-Java
- 下一篇: 视频教程-清华-尹成老师-java基础-