|
本系統(tǒng)采用單片機(jī) + LCD1602液晶 + HX711AD模塊 + 5 kg電阻應(yīng)變式壓力傳感器 +蜂鳴器+矩陣鍵盤+WT588D語音模塊而成。
1.單片機(jī)型號(hào):STC89C52/51、AT89C52/51、AT89S52/51可以任選,都是51單片機(jī)。
2.稱重傳感器采用電子秤專用模擬/數(shù)字(A/D)轉(zhuǎn)換器芯片hx711對(duì)傳感器信號(hào)進(jìn)行調(diào)理轉(zhuǎn)換,提供更高的精度。
3.采用液晶LCD1602顯示屏顯示,第一行顯示當(dāng)前重量(單位為kg),第二行單價(jià)和總價(jià)(單位為元)。
4.按鍵具有提示聲,具有超量程報(bào)警功能當(dāng)超出壓力傳感器的量程時(shí)蜂鳴器會(huì)發(fā)出報(bào)警聲。
5.采用高精度電阻應(yīng)變式壓力傳感器,測(cè)量量程0 -5kg,測(cè)量精度可達(dá)3g。
6.采用4*4矩陣鍵盤進(jìn)行人機(jī)交互,可以實(shí)現(xiàn)直接輸入單價(jià)、刪除單價(jià)、去皮、清零等功能操作非常方便。
7.采用WT588D語音模塊實(shí)現(xiàn)語音播報(bào)功能。
4*4矩陣鍵盤定義如下
1 2 3 15(刪除鍵)
4 5 6 14(去皮或是清零)
7 8 9 13(清除單價(jià))
10(未定義) 0 11(未定義) 12(未定義)
鍵0—9為數(shù)字鍵,用于單價(jià)輸入。
鍵13為單價(jià)一鍵清零,按下該鍵則單價(jià)清為0。
鍵14為去皮鍵,按下后當(dāng)前重量清為0。
鍵15為刪除鍵,當(dāng)我們單價(jià)輸入錯(cuò)誤時(shí)可以逐位刪除輸錯(cuò)的單價(jià),刪除后可以繼續(xù)輸入單價(jià)。
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
單片機(jī)源程序如下:
- #include <reg52.h> //調(diào)用單片機(jī)頭文件
- #define uchar unsigned char //無符號(hào)字符型 宏定義 變量范圍0~255
- #define uint unsigned int //無符號(hào)整型 宏定義 變量范圍0~65535
- #define ulong unsigned long
-
- sbit rs=P1^0; //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器 L:指令寄存器
- sbit rw=P1^1; //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器 L:指令寄存器
- sbit e =P1^2; //片選信號(hào) 下降沿觸發(fā)
-
- sbit hx711_dout = P2^1; //hx711 IO口定義
- sbit hx711_sck = P2^0; //hx711 IO口定義
- sbit beep = P2^7; //蜂鳴器 IO口定義
- long weight; //重量變量
- unsigned long Weight_Maopi; //皮重變量
-
- #define GapValue 437.0
- uchar flag_300ms ; //300毫秒的變量
- ulong price,z_price; //單價(jià) 總價(jià)
- uchar flag_p;
- uchar menu_1,menu_2; //設(shè)置不同參數(shù)的變量
-
- /***********************語音模塊控制IO口的定義************************/
- sbit VRST = P1^3; //復(fù)位腳
- sbit VBUSY = P1^4; //忙腳
- sbit VDATA = P1^5; //數(shù)據(jù)輸入腳
- sbit VCS = P1^6; //片選腳
- sbit VCLK = P1^7; //時(shí)鐘腳
-
- /******1ms延時(shí)函數(shù)***12M晶振**************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
- /***********************語音模塊子程序************************/
- void Send_threelines(unsigned char addr)
- {
- unsigned char i;
- VRST=0; //復(fù)位腳 低電平
- VRST=1; //復(fù)位腳 高電平
- VCS=0; //片選腳 低電平
- for(i=0;i<8;i++) //8位的數(shù)據(jù) 要循環(huán)8次1位1位的寫入
- {
- VCLK=0; //時(shí)鐘腳 低電平
- if(addr&0x01 == 0x01)
- {
- VDATA=1; //數(shù)據(jù)輸入腳 寫數(shù)據(jù)1
- }
- else
- VDATA=0; //數(shù)據(jù)輸入腳 寫數(shù)據(jù)0
- addr>>=1; //數(shù)據(jù)左移一位
- VCLK=1; //時(shí)鐘腳 高電平
- }
- VCS=1; //片選腳 高電平
- while(VBUSY == 0); //忙等待
- }
- /********************************************************************
- * 名稱 : delay_uint()
- * 功能 : 小延時(shí)。
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void delay_uint(uint q)
- {
- while(q--);
- }
- /********************************************************************
- * 名稱 : write_com(uchar com)
- * 功能 : 1602指令函數(shù)
- * 輸入 : 輸入的指令值
- * 輸出 : 無
- ***********************************************************************/
- void write_com(uchar com)
- {
- rs=0; //寫指令
- rw=0; //對(duì)1602寫操作
- P0=com; //P0口對(duì)1602寫指令數(shù)據(jù)
- delay_uint(25);
- e=1; //e=1使能信號(hào)
- delay_uint(100); //延時(shí)一下等1602完成操作
- e=0;
- }
- /********************************************************************
- * 名稱 : write_data(uchar dat)
- * 功能 : 1602寫數(shù)據(jù)函數(shù)
- * 輸入 : 需要寫入1602的數(shù)據(jù)
- * 輸出 : 無
- ***********************************************************************/
- void write_data(uchar dat)
- {
- rs=1; //寫數(shù)據(jù)
- rw=0; //對(duì)1602寫操作
- P0=dat; //P0口對(duì)1602寫數(shù)據(jù)
- delay_uint(25);
- e=1; //e=1使能信號(hào)
- delay_uint(100); //延時(shí)一下等1602完成操作
- e=0;
- }
- /********************************************************************
- * 名稱 : write_string(uchar hang,uchar add,uchar *p)
- * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符開始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
- write_string(1,5,"ab cd ef;")
- * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
- * 輸出 : 無
- ***********************************************************************/
- void write_string(uchar hang,uchar add,uchar *p)
- {
- if(hang==1)
- write_com(0x80+add); //1602寫第一行的地址
- else
- write_com(0x80+0x40+add); //1602寫第二行的地址
- while(1)
- {
- if(*p == '\0') break; //\0字符串的結(jié)尾標(biāo)志 break結(jié)束while循環(huán) 結(jié)束寫字符
- write_data(*p); //寫數(shù)據(jù)
- p++; //指針地址加1
- }
- }
-
- ////////////////在指定位置顯示指定字符//////////
- void write_zifu(uchar hang,uchar add,uchar dat)
- {
- if(hang==1)
- write_com(0x80+add); //1602寫第一行的地址
- else
- write_com(0x80+0x40+add); //1602寫第二行的地址
- write_data(dat);
- }
- /********************************************************************
- * 名稱 : write_lcd4_price(uchar hang,uchar add,uchar date)
- * 功能 : 顯示價(jià)格
- * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
- * 輸出 : 無
- ***********************************************************************/
- void write_lcd4_price(uchar hang,uchar add,uint date)
- {
- if(hang==1)
- write_com(0x80+add); //1602寫第一行的地址
- else
- write_com(0x80+0x40+add); //1602寫第二行的地址
- write_data(0x30+date/1000%10); //顯示千位數(shù)
- write_data(0x30+date/100%10); //顯示百位數(shù)
- write_data('.'); //顯示小數(shù)點(diǎn)
- write_data(0x30+date/10%10); //顯示十位數(shù)
- write_data(0x30+date%10); //顯示個(gè)位數(shù)
- }
-
- /***********************lcd1602初始化設(shè)置************************/
- void init_1602() //lcd1602初始化設(shè)置
- {
- write_com(0x38); //
- write_com(0x0c);
- write_com(0x06);
- write_string(1,0," W:0.000kg "); //初始化1602顯示
- write_string(2,0,"P:00.00 Z:00.00"); //初始化1602顯示
- write_zifu(2,7,0x5c); //¥
- }
- /*******************重量顯示程序***********************/
- void write_1602_yl(uchar hang,uchar add,uint date)
- /*********************AD采集程序*********************/
- unsigned long HX711_Read(void) //增益128
- {
- unsigned long count;
- unsigned char i;
- hx711_dout=1;
- 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;//第25個(gè)脈沖下降沿來時(shí),轉(zhuǎn)換數(shù)據(jù)
- hx711_sck=0;
- return(count);
- }
- void get_pizhong() //獲取皮重,秤盤重量
- {
- Weight_Maopi = HX711_Read();
- }
- void get_weight() //獲取被測(cè)物體重量
- {
- weight = HX711_Read();
- weight = weight - Weight_Maopi; //獲取凈重
- if(weight > 0)
- {
- weight = (unsigned int)((float)weight/GapValue); //計(jì)算實(shí)物的實(shí)際重量
- }
- else
- {
- weight = 0;
- }
- }
-
- /*****************語音報(bào)價(jià)********************/
- void bojia() //語音報(bào)價(jià)
- {
- Send_threelines(z_price / 1000 % 10); //語音播放
- Send_threelines(10);
- Send_threelines(z_price / 100 % 10); //語音播放
- Send_threelines(11); //點(diǎn)
- Send_threelines(z_price / 10 % 10); //語音播放
- Send_threelines(z_price % 10); //語音播放
- Send_threelines(93); //元
- }
- /*****************語音函數(shù)********************/
- void yuying() //語音函數(shù)
- {
- long z_p;
- if(weight != 0)
- if(weight == z_p) //重量穩(wěn)定
- {
- bojia(); //語音報(bào)價(jià)
- }
- z_p = weight;
- }
- /********************獨(dú)立按鍵程序*****************/
- uchar key_can; //按鍵值
- void key() //獨(dú)立按鍵程序
- {
- static uchar key_new = 0, key_l;
- key_can = 20; //按鍵值還原
- P3 = 0x0f;
- if((P3 & 0x0f) != 0x0f) //按鍵按下
- {
- delay_1ms(1); //按鍵消抖動(dòng)
- if(((P3 & 0x0f) != 0x0f) && (key_new == 1))
- { //確認(rèn)是按鍵按下
- key_new = 0;
- key_l = P3 | 0xf0; //矩陣鍵盤掃描
- P3 = key_l;
- switch(P3)
- {
- case 0xee: key_can = 1; break; //得到按鍵值
- case 0x77: key_can = 12; break; //得到按鍵值
- }
- beep = 0; //蜂鳴器叫一聲
- delay_1ms(100);
- beep = 1;
- }
- }
- else
- key_new = 1;
- }
- /************按鍵控制函數(shù)*************/
- void key_with()
- {
- if(key_can <= 9) //數(shù)字鍵
- {
- if(flag_p >= 4)
- {
- flag_p = 0;
- }
- if(flag_p == 0)
- price = key_can;
- else
- {
- price = price * 10 + key_can;
- }
- write_lcd4_price(2,2,price); //顯示單價(jià)
- flag_p ++;
- }
- if(key_can == 15) //刪除鍵
- {
- if(price != 0 )
- {
- flag_p --;
- price /= 10; //刪除
- write_lcd4_price(2,2,price);//顯示單價(jià)
- }
- }
- if(key_can == 14) //去皮
- {
- get_pizhong(); //獲取皮重,秤盤重量
- }
- if(key_can == 13) //價(jià)格清零
- {
- flag_p = 0;
- price = 0;
- write_lcd4_price(2,2,price);//顯示單價(jià)
- }
- }
- /*****************主函數(shù)********************/
- void main()
- {
- beep = 0; //蜂鳴器叫一聲
- delay_1ms(100);
- P0 = P1 = P2 = P3 = 0xff; //單片機(jī)IO口初始化為1
- init_1602(); //lcd1602初始化
- get_pizhong(); //獲取皮重,秤盤重量
- while(1)
- {
- key(); //獨(dú)立按鍵程序
- if(key_can < 20)
- key_with();
- flag_300ms++;
- if(flag_300ms >= 300) //300毫秒執(zhí)行一次里面的程序
- {
- flag_300ms = 0;
- get_weight(); //獲取被測(cè)物體重量
- if(weight >= 0 )
- write_1602_yl(1,5,weight); //顯示重量
- z_price = weight * price / 1000; //總價(jià)等于重量*單價(jià)
- write_lcd4_price(2,11,z_price); //顯示總價(jià)
- if(weight >= 5000) //超重報(bào)警
- beep = ~beep; //蜂鳴器報(bào)警
- else
- beep = 1;
- yuying(); //語音函數(shù)
- }
- delay_1ms(1);
- }
- }
復(fù)制代碼
程序+原理圖+PCB 51hei附件下載:
電子秤.7z
(505.64 KB, 下載次數(shù): 61)
2024-3-6 23:09 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|