電子稱設(shè)計,主要用于菜市場的電子稱,可以設(shè)置價格,根據(jù)價格和重量計算出金額,該設(shè)計采用了Proteus仿真軟件,采用AT89C51為主控,采用ADC0832芯片來進行ADC的轉(zhuǎn)換,采用LCD1602顯示屏顯示,同時設(shè)計了矩陣鍵盤用于輸入價格。設(shè)計難度3顆星(滿星為5顆)。
首先設(shè)計電路圖,由于模塊不多,所以接口可以隨意分配,電路仿真圖如下圖1。
設(shè)計時需要一步一步進行設(shè)計,一般設(shè)計開始盡量將人機交互的模塊優(yōu)先級調(diào)高。這里呢就優(yōu)先對LCD1602進行設(shè)計,驅(qū)動程序如下:
void wrc(uint8 c)
{
delay(1);
rs=0;
rw=0;
e=0;
P0=c;
e=1;
delay(1);
e=0;
}
void wrd(uint8 dat)
{
delay(1);
rs=1;
rw=0;
e=0;
P0=dat;
e=1;
delay(1);
e=0;
rs=0;
}
void init()
{
delay(1);
wrc(0x38);
wrc(0x38);
wrc(0x38);
wrc(0x06);
wrc(0x0c);
wrc(0x01);
}
屏幕顯示有了,就可以對其他模塊進行設(shè)計,按鍵和ADC優(yōu)先級差不多,所以可以隨意的選擇,這里優(yōu)先對ADC0832模塊進行設(shè)計,代碼如下:
unsigned char A_D(unsigned char CH) //AD函數(shù)
{
unsigned char i,adval,test; //定義局部變量并初始化
adval=0x00;
test=0x00;
Clk=0; //clk低電平
DI=1; //DI初始高電平在第一個時鐘脈沖的下降沿前保持高電平,表示啟動信號
_nop_();
CS=0; //片選
_nop_();
Clk=1; //clk上升沿,起始位寫入
_nop_();
if(CH==0x00) //選擇通道0
{
Clk=0; //clk低電平
DI=1;
_nop_();
Clk=1; //clk上升沿,通道0的第一位寫入
_nop_();
Clk=0;
DI=1;
_nop_();
Clk=1; //clk上升沿,通道0的第二位寫入
_nop_();
}
else
{
Clk=0;
DI=1;
_nop_();
Clk=1; //clk上升沿,通道1的第一位寫入
_nop_();
Clk=0;
DI=1;
_nop_(); //clk上升沿,通道1的第二位寫入
Clk=1;
_nop_();
}
Clk=0;
DI=1;
for(i=0;i<8;i++)? ? ? ? ? //從高位向低位讀取八位AD值
{
_nop_();
adval<<=1;
Clk=1;
_nop_();
Clk=0;
if(DO)
adval|=0x01;
else
adval|=0x00;
}
for(i=0;i<8;i++)
{
test>>=1; //從低位向高位讀取八位AD值
if(DO)
test|=0x80;
else
test|=0x00;
_nop_();
Clk=1;
_nop_();
Clk=0;
}
if(adval==test) dat=test; //判斷兩個讀取值是否相等相等就把讀取的數(shù)賦值給DAT
_nop_();
CS=1;
DO=1;
Clk=1;
return dat;
}
最后來對矩陣鍵盤進行設(shè)計,這個也是比較簡單的,一般學(xué)過單片機的都了解,代碼如下:
uint8 keyscan() //按鍵掃描程序
{
uint8 h,l,value;
P1=0x0f;
h=P1&0x0f;
if(h!=0x0f)
{
delay(1);
if(h!=0x0f)
{
h=P1&0x0f;
l=P1|0xf0;
P1=l;
l=P1&0xf0;
h=P1&0x0f;
value=h+l;
}
return value;
}
}
驅(qū)動都由了,最后就是實現(xiàn)邏輯了,由于邏輯代碼有點多,這里就不貼出來了,最后來看一看效果吧!
審核編輯:湯梓紅
-
AT89C51
+關(guān)注
關(guān)注
27文章
543瀏覽量
80868 -
電子稱
+關(guān)注
關(guān)注
1文章
25瀏覽量
12214 -
LCD1602
+關(guān)注
關(guān)注
14文章
606瀏覽量
52372 -
adc0832
+關(guān)注
關(guān)注
3文章
83瀏覽量
28315
發(fā)布評論請先 登錄
相關(guān)推薦
評論