一、系統方案
1、當電子稱開機時,單片機會進入一系列初始化,進入1602顯示模式設定,如開關顯示、光標有無設置、光標閃爍設置,定時器初始化,進入定時器模式,如初始值賦值。之后液晶會顯示Welcome To Use Electronic Scale,這是一個歡迎使用界面:
2、此電子秤是開機檢測托盤重量,并將托盤重量清零(即電子秤每次開機后檢測托盤重量,并程序中自動將托盤重量保存在一個變量中,稱量過程中每次都將獲得的重量減去托盤重量,而得到所要稱量物體的真正的重量),然后單片機進入等待稱重界面:WE代表貨物重量,PR代表貨物單價,MONEY代表貨物總價。
3、在支架上放上待稱重物體時,HX711會采集稱重傳感器的模量量,并將這個模擬量轉化數字量,發送給單片機,單片機通過計算,將重量顯示在1602上面,由于仿真里面沒有真實的貨物,就用兩個按鍵模量重量,連接HX711的2個按鍵就是模擬重量加減,一個按鍵按下,貨物重量加,另外一個按鍵,貨物重量就會減。
4、在支架上放上待稱重物體時,通過矩陣鍵盤設置好單價,單片機會根據重量乘以單價計算出總價。如果單價設置有錯,按清除按鍵,重新設置。如果重量有錯誤,可以按去皮按鍵清除,校準加,校準減按鍵可以對貨物重量進行微調。
5、在支架上放上待稱重物體總量超過10KG時,蜂鳴器是不停的報警,LED閃爍,1602上面顯示WE;-.---,直到重量少于10KG蜂鳴器停止報警,LED停止閃爍。
二、硬件設計
原理圖如下:
三、單片機軟件設計
1、首先是系統初始化
Init_LCD1602(); //初始化LCD1602
EA = 0;
Data_Init();
Timer0_Init();
//初中始化完成,開斷
EA = 1;
// Get_Maopi();
LCD1602_write_com(0x80); //指針設置
LCD1602_write_word(" Welcome To Use "); //
LCD1602_write_com(0x80+0x40); //指針設置
LCD1602_write_word("Wlectronic Scale");
// Delay_ms(2000);
Get_Maopi();
LCD1602_write_com(0x80); //指針設置
LCD1602_write_word("WE:0.000 PR:00.0");
LCD1602_write_com(0x80+0x40); //指針設置
LCD1602_write_word("MONEY: 0.00 ");
Display_Price();
// Get_Maopi(); //稱毛皮重量
2、液晶顯示程序
//****************************************************
//MS延時函數(12M晶振下測試)
//****************************************************
void LCD1602_delay_ms(unsigned int n)
{
unsigned int i,j;
for(i=0;ifor(j=0;j<123;j++);
};i++)
//****************************************************
//寫指令
//****************************************************
void LCD1602_write_com(unsigned char com)
{
LCD1602_RS = 0;
LCD1602_delay_ms(1);
LCD1602_EN = 1;
LCD1602_PORT = com;
LCD1602_delay_ms(1);
LCD1602_EN = 0;
}
//****************************************************
//寫數據
//****************************************************
void LCD1602_write_data(unsigned char dat)
{
LCD1602_RS = 1;
LCD1602_delay_ms(1);
LCD1602_PORT = dat;
LCD1602_EN = 1;
LCD1602_delay_ms(1);
LCD1602_EN = 0;
}
3、按鍵程序
unsigned char Getkeyboard(void)
{
unsigned char number = 0;
unsigned char i;
//行輸入低電平
ROW1=ROW2=ROW3=ROW4=0;
//如果列輸出不全為高,則說明有鍵按下
if ((COL1!=1)||(COL2!=1)||(COL3!=1)||(COL4!=1))
{
//輸入0111
ROW1=0;
ROW2=ROW3=ROW4=1;
for (i=0;i<20;i++);
if (COL1==0) return 1; // 7
else if (COL2==0) return 2; // 8
else if (COL3==0) return 3; // 9
else if (COL4==0) return 10; // 10
//輸入1011
ROW2=0;
ROW1=ROW3=ROW4=1;
for (i=0;i<20;i++);
if (COL1==0) return 4; //4
else if (COL2==0) return 5; // 5
else if (COL3==0) return 6; // 6
else if (COL4==0) return 11; // 11
//輸入1101
ROW3=0;
ROW1=ROW2=ROW4=1;
for (i=0;i<20;i++);
if (COL1==0) return 7; //1
else if (COL2==0) return 8; // 2
else if (COL3==0) return 9; // 3
else if (COL4==0) return 12; // 12
//輸入0111
ROW4=0;
ROW1=ROW2=ROW3=1;
for (i=0;i<20;i++);
if (COL1==0) return 14;
else if (COL2==0) return 0;
else if (COL3==0) return 15;
else if (COL4==0) return 13;
//沒有檢測到列低電平
return 99;
}
return 99;
}
4、核心算法程序
//****************************************************
//讀取HX711
//****************************************************
unsigned long HX711_Read(void) //增益128
{
unsigned long count;
unsigned char i;
HX711_DOUT=1;
Delay__hx711_us();
HX711_SCK=0;
count=0;
while(HX711_DOUT);
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個脈沖下降沿來時,轉換數據
Delay__hx711_us();
HX711_SCK=0;
return(count);
}
四、proteus仿真設計
Proteus軟件是一款應用比較廣泛的工具,它可以在沒有硬件平臺的基礎上通過自身的軟件仿真出硬件平臺的運行情況,這樣就可以通過軟件仿真來驗證我們設計的方案有沒有問題,如果有問題,可以重新選擇器件,連接器件,直到達到我們設定的目的,避免我們搭建實物的時候,如果當初選擇的方案有問題,我們器件都已經焊接好了,再去卸載下去,再去焊接新的方案的器件,測試,這樣會浪費人力和物力,也給開發者帶來一定困惑,Proteus仿真軟件就很好的解決這個問題,我們在設計之初,就使用該軟件進行模擬仿真,測試,選擇滿足我們設計的最優方案。最后根據測試沒問題的仿真圖紙,焊接實物,調試,最終完成本設計的作品。
-
led
+關注
關注
242文章
23336瀏覽量
662214 -
單片機
+關注
關注
6041文章
44615瀏覽量
637347 -
Proteus
+關注
關注
79文章
1692瀏覽量
106741 -
仿真
+關注
關注
50文章
4120瀏覽量
133844 -
電子秤
+關注
關注
23文章
214瀏覽量
44402
發布評論請先 登錄
相關推薦
評論