安曉莉
(西安思源學院 電子信息工程學院, 陜西 西安 710038)
本文采用52單片機設計了一款紙張計數裝置,該裝置前端的兩塊50 mm×50 mm的平行板分別通過導線a和導線b連接到測量顯示電路,它可測量并顯示置于極板間的紙張的數量。
從設計任務可知,前端的兩塊50 mm×50 mm的平行板構成平行板電容器。改變兩塊板之間的紙的張數(電容器極板中間的介質發生改變),就會引起電容容量改變[1]。如果將此電容接到555定時器上構成多諧振蕩器,電容量的改變就可以改變多諧振蕩器輸出脈沖的頻率。
如果采用52單片機的定時/計數器實現200 m/s時間內對555定時器輸出的振蕩脈沖進行計數,通過計算就可獲得振蕩脈沖的頻率。通過測試,將每增加一張紙所對應的振蕩脈沖的頻率記錄下來,列成表格,在程序中通過取表的辦法獲得紙的張數并顯示。
根據上述設計思路,得出設計框圖,如圖1所示。

圖1 系統設計框圖
單片機工作時鐘由晶振電路產生;復位電路完成單片機的初始化;555定時器用來輸出矩形波,該矩形波的寬度隨紙張數變化而變化;按鍵由啟動測量按鍵和較準按鍵組成;24C02存儲器用于存儲每增加一張紙所對應的矩形波的頻率值;數碼管顯示電路顯示紙張數;蜂鳴器用于電容兩極板短路時的報警和啟動鍵按下后,給出測量結果時的鳴叫提示。
2.2.1 555定時器構成的多諧振蕩器
平行板的一個極板接555定時器的2腳和6腳,另一個極板接地;555的7腳和6腳之間接200 K的電阻和二級管1N5817;8腳和4腳連在一起;8腳(4腳)經200 K電阻和7腳相連;1腳接地、5腳通過0.01 μF的電容接地;3腳輸出矩形波[2],如圖2所示。

圖2 多譜振蕩器示意圖

本設計選擇R1和R2為200 kΩ,原因是此時數碼管顯示的數不龐大,且能反映出紙張的變化。
2.2.2 24C02存儲器
24C02是容量為256個字節的串行EEPROM存儲器。本設計中紙張數所對應的頻率值為int型,在存儲時占兩個字節。除去兩極板短路時的頻率0外,可存儲127個頻率值,但是,隨著紙張數的增加,頻率的變化會越來越小,因此,本系統只能識別30張以內的紙的數量,誤差在一張以內。
2.2.3 數碼管顯示電路
數碼管采用動態顯示方式實現紙張數的顯示。由PO口輸出的字段數據經74LS245后驅動數碼8個字段;P2.2、P2.3、P2.4接74LS138譯碼器A、B、C端,74LS138譯碼器的八路輸出作為選通信號接8位數碼管的公共端。采用“逐位點亮,輪流顯示”的方法實現穩定顯示紙張數[3]。
本系統采用單片機的定時/計數器0定時200 m/s,在此期間,啟動定時/計數器1對矩形波個數計數,當200 m/s定時時間到,停止定時/計數器1計數。計數值除以200 m/s即為頻率值。
為了使測量更準確,采用一秒鐘采集5次頻率(每200 m/s采集一個頻率數據),把5個頻率數據加權平均,將其作為當前紙張所對應的頻率值。
主函數流程圖如圖3所示。

圖3 主函數流程圖
要能根據頻率范圍得出紙張數,需事先將每增加一張紙所對應的頻率值存儲進24C02,在這里把這個過程叫校準 。校準按鍵接在P3.3引腳上,該鍵按下時,CPU跳轉到外部中斷1中斷服務程序。在中服程序中,將頻率的高八位存入低位地址中,頻率的低八位存入高位地址中,每存完一個頻率,地址值加2。
程序代碼如下。
首先定義按鍵,聲明紙張計數變量。
sbit KeySure=P3^3; //定義按鍵
u16 NumOfTest = 0;//計數起始位
//外部中斷1的中斷函數
void Int1() interrupt 2
{
delay(3 000); //延時消抖
if(KeySure==0)
{
At24c02Write(NumOfTest,Freq_array[5]/255);
NumOfTest++;
delay(2 000);
At24c02Write(NumOfTest,Freq_array[5]%255);
NumOfTest++;
delay(2 000);
}
}
啟動測量按鍵接在P3.2上,按下該鍵后,CPU跳轉到外部中斷0中斷服務程序,在該中服程序中調用一個計算紙張數函數,實現根據頻率值計算出紙張數,并將結果送數碼管顯示,啟動蜂鳴器報警,提示一次測量結束[4]。
程序代碼如下。
//外部中斷0中斷函數
void Int0() interrupt 0
{
delay(1 000); //延時消抖
if(KeyAddNum==0)
{
Num = CalPNum(Freq_array[5]);
//數碼管顯示
DisplayData[7]=smgd[Num/10];
DisplayData[6]=smgd[Num%10];
//蜂鳴器報警
}
}
計算紙張數函數流程圖如圖4所示。

圖4 計數流程
程序代碼如下。
char Num = 0; //當前紙張數量
#define AllNUM 60 //30張紙,需要60個字節存儲空間
sbit KeyAddNum=P3^2; //定義按鍵K
張數計算函數
unsigned char CalPNum(u16 frequence)
{
char i;
int freq1,num11,num12;//n-1 張紙時的頻率
int freq2,num21,num22;//n 張紙時的頻率
int freq3,num31,num32;//n+1 張紙時的頻率
unsigned char PNum;
for(i=2; i { num11 = At24c02Read(i-2); delay(1000); num12 = At24c02Read(i-1); delay(1000); freq1 = num11*255 + num12; //取出n-1張紙的頻率 num21 = At24c02Read(i); delay(1000); num22 = At24c02Read(i+1); delay(1000); freq2 = num21*255 + num22; //取出n張紙的頻率 num31 = At24c02Read(i+2); delay(1000); num32 = At24c02Read(i+3); delay(1000); freq3 = num31*255 + num32; //取出n+1張紙的頻率 //在頻率表內查該頻率對照的紙張數 if( (freq2 -(0.4) * (freq2 - freq1) <= frequence) && (frequence < freq2 + (0.6)*(freq3 - freq2)) ) { PNum = i/2; return PNum; } } return 0; } 由于本設計只能識別30張紙,即對應的頻率只占60字節,在判斷框中設置上限為60-3,是為了防止n+1張紙對應的頻率超出地址上限而出錯[5]。 頻率落在n張紙對應得頻率范圍是依據試驗得來的公式如下。 freq2-0.4(freq2-freq1)≤f≤freq2+0.6(freq3-freq2) 本設計能夠完成30張以內的紙的張數的測量與顯示,具有校準、啟動測量和蜂鳴器提示報警功能。不足之處是測試的紙張數較少,原因主要是52單片機運算能力不夠。如果將52單片機更換為STM32,則測量速度和測量張數將會大幅度提高。4 總結