徐 敏
(江蘇聯合職業技術學院 無錫旅游商貿分院 信息工程系,江蘇 無錫 214000)
單片機是智能制造和智能服務的基礎技術,具有集成度高、可控力強、適應度高、功耗低、擴展靈活等優勢。蜂鳴器是傳感器的一種,它是一種一體化結構的電子訊響器,采用直流電壓供電,在生活的方方面面都有應用,例如在計算機、打印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發聲器件。
本次設計中單片機選用STC89C52 型號,它是STC公司生產的一種低功耗、高性能CMOS八位微控制器,使用經典的MCS-51內核,同時也做了很多的改進,使得芯片具有傳統的51單片機不具備的功能,為嵌入式控制應用系統提供高靈活有效的解決方案[1]。STC89C52單片機的最小系統有復位、時鐘、電源3部分電路組成:復位電路的作用是初始化,再次使用時可以重新開始;時鐘電路使單片機具有自我把控時間的功能,進而準確地進行數據處理;電源電路主要起到為整體電路供電作用[2]。
STC89C52的時鐘機器周期有兩種,分別為:6時鐘/機器周期和12時鐘/機器周期;工作電壓為5.5 V~3.3 V或3.8 V~2.0 V;工作頻率范圍為0~40 MHz;用戶應用程序空間為8 k字節Flash,512字節的RAM,32 位I/O口線;內置4KB EEPROM,MAX810復位電路,3個16位定時器/計數器,4個外部中斷,下降沿中斷或低電平觸發電路,Power Down模式可由外部中斷低電平觸發中斷方式喚醒一個7向量4級中斷結構,兼容傳統51單片機的5向量2級中斷結構,全雙工串行口,可用定時器軟件實現多個UART。另外,STC89C52可降至0 Hz 靜態邏輯操作,支持可選擇節電模式。工作溫度范圍分為工業級和商業級,工業級為-40~85 ℃,商業級為0~75 ℃。最高運作頻率為35 MHz,6T/12T可選。系統可編程ISP與應用可編程IAP可通過串口(RxD/P3.0,TxD/P3.1)直接下載用戶程序,數秒即可完成,無需專用編程器或專用仿真器。封裝形式可采用LQFP-44,PDIP-40,PLCC-44,PQFP-44。
STC89C52RC單片機的工作模式有正常工作模式、掉電模式和空閑模式三種。其中正常工作模式下,單片機處于正常執行程序的狀態,典型功耗為4 mA~7 mA;掉電模式下,RAM內容被保存,振蕩器被凍結,單片機一切工作停止,直到下一個中斷或硬件復位為止,中斷返回后,繼續執行源程序,掉電模式的典型功耗遠遠小于0.1 μA;空閑模式下,CPU停止工作,允許RAM、定時器/計數器、串口、中斷繼續工作,典型功耗為2 mA[3]。
STC89C52串口有兩個物理上獨立的接收、發送緩沖器SBUF,它們占用同一地址99H;接收器是雙緩沖結構;發送緩沖器,因為發送時CPU是主動的,不會產生重疊錯誤。STC89C52串口結構,如圖1所示。

圖1 STC89C52串口結構
Keil C51是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發系統。與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。Keil提供了包括C編譯器、宏匯編、鏈接器、庫管理和一個功能強大的仿真調試器等在內的完整開發方案,通過一個集成開發環境μVision將這些部分組合在一起。Keil軟件可在WIN98,NT,WIN2000,WINXP等操作系統下運行。
STC-ISP燒錄軟件用于單片機下載編程燒錄程序,是針對STC系列單片機而設計的,可下載STC89系列、12C2052系列和12C5410等系列的STC單片機。
STC-ISP燒錄軟件有串口助手、Keil仿真設置、定時器計算器、波特率計算器等功能模塊。本項目中,主要運用串口助手對程序進行燒錄。通過選擇單片機型號、串口號及波特率將編譯程序下載,根據485通信協議,發送并接收指令及數據。
本設計由電磁式有源蜂鳴器,由振蕩器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源后,振蕩器產生的音頻信號電流通過電磁線圈,使電磁線圈產生磁場。振動膜片在電磁線圈和磁鐵的相互作用下,周期性地振動發聲。
蜂鳴器連接到了STC89C52的P05口,I/O口為低電平時打開,高電平時關閉。通過對 I/O 口取 0/1 電平來引發蜂鳴器電壓的通斷,就可讓蜂鳴器產生振動頻率。
本設計硬件采用STC89C52開發板、Micro數據線、485串口模塊、杜邦線和PC機。軟件包括Windows7及以上系統、KEIL C51開發環境、STC-ISP燒寫助手。
3.3.1 延時處理
傳感器在數據采集時,由于要和485串口服務器進行通信,所以需要一定的配置來滿足485串口采集器的實時采集功能。(1)定義延時處理函數,設置280 ms,40 ms,50 ms,100 ms的延時。(2)設置配置系統標志位為全局變量 glb_sts.system_flag = FALSE,它是主函數中是否進行數據處理的核心變量。(3)設置定時器文件,用來準確計算時間,定時的時間達到了以后,glb_sts.system_flag = TRUE,相當于告訴單片機可以去執行要執行的程序。
3.3.2 數據包接收與校驗方法
串口服務器通信的數據包接收與校驗方法中,定義最大包長為20,設置串口波特率為9 600,配置485 控制引腳為P43。定義串口初始化、串口發送字節、485發送字符串以及控制485芯片位發送模式4個函數。進行串口初始化:配置串口為模式1,清零T1的控制位,配置T1為模式2,計算T1重載值,當初值等于重載值時,禁止T1中斷并使串口中斷,啟動T1。在串口發送字節函數中,置發送中斷標志為1,然后發送數據并且等待數據發送完畢。485發送字符串函數,檢查發送的數據是否正確,并發送數據包的數據。控制485芯片位發送模式包括485芯片發送和讀寫模式。
串口中斷服務函數的程序設計,如圖2所示。(1)首先清除接收中斷;(2)當數據已接收并未處理的情況下,則不再接收數據;(3)當讀取的數據超過數據包大小,接收數據計數清零,將讀取的數據儲存在數據包里;(4)校驗數據包頭是否正確,不正確則重新接收數據;(5)將讀取的485數據存在數據包內;(6)清除發送中斷,清除串口發送標志。

圖2 串口中斷服務函數流程
3.3.3 控制蜂鳴器的打開與關閉
首先進行外設初始化,包括定時器初始化、串口初始化、全局函數初始化,并將485總線設置為讀模式。當系統標志復位成功,表示10 ms的周期到了,清除標志位。判斷串口數據是否讀取成功,清除串口讀取完成標志位。數據包校驗,如果失敗則清除接收到的數據;讀取addr位是不是蜂鳴器的標志,如果讀取的字符為0,表示關閉蜂鳴器;如果讀取的字符為1,表示打開蜂鳴器;如果讀取的字符為0XFF,表示讀取當前蜂鳴器的狀態。設置包尾為0XBB,發送485數據包。相關代碼如下:
……
if(uart_sts.recv_buf[1] ==ADDR)//485addr
{
P44 = !P44;
TX_BUF[0] =PACK_HEAD;
TX_BUF[1] =ADDR;
TX_BUF[2] = 0x00;
TX_BUF[3] = 1;
if(uart_sts.recv_buf[4] == 0)
{
P05 = CLOSE; //關閉蜂鳴器
TX_BUF[4]= 0; //將蜂鳴器狀態設置為0
}
elseif(uart_sts.recv_buf[4]== 1)
{
P05 = OPEN; //打開蜂鳴器
TX_BUF[4] = 1; //將蜂鳴器狀態設置為1
}
elseif(uart_sts.recv_buf[4] == 0xff)
{
if(P05 == 1 )
{
TX_BUF [4] = 0; //返回狀態-->關閉
}
else
{
TX_BUF [4] = 1; //返回狀態-->打開
}
}
}
……
3.3.4 按鍵控制
機械觸點式按鍵開關,其主要功能是把機械上的通斷轉換為電氣上的邏輯關系。當機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個按鍵開關在閉合時不會馬上穩定地接通,在斷開時也不會一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動。為了不產生這種現象而做的措施就是按鍵消抖。按鍵消抖是指按鍵按下時刻抖動的波形,讀取這一時刻之后20 ms左右的按鍵信息,此時波形已平穩,這樣可以防止一次按鍵被誤讀多次。
根據上面的原理描述,即可對按鍵的輸入管腳進行邊沿檢測,當檢測到輸入信號變化后,計數清零并開始計數,計數到20 ms時進行采樣;再對每次采樣的值進行下降沿檢測,檢測的結果作為按鍵消抖的脈沖輸出,每次檢測到下降沿時讓狀態翻轉并輸出。
理想波形與實際波形之間是有區別的,實際波形在按下和釋放的瞬間都有抖動的現象,抖動時間的長短和按鍵的機械特性有關,一般為5~10 ms,如圖3所示。通常采用手動按鍵然后釋放,這個動作中穩定閉合的時間超過了20 ms。因此,單片機在檢測按鍵是否按下時都要加上去抖動操作,有專用的去抖動電路,也有專門的去抖動芯片,但通常采用軟件延時的方法解決抖動問題。

圖3 按鍵消抖
利用KEIL開發環境打開實驗例程,單擊option按鈕,勾選生成hex文件;打開stc-isp燒錄軟件選擇單片機型號STC89C/LE52RC。將MICRO-USB線插入電腦的USB口,查看并識別串口號。單擊打開程序文件按鈕,選擇剛剛生成的hex文件。插入485-USB串口給STC89C52供電,然后單擊下載/編程按鈕,再按下單片機的電源供電按鈕,等待單片機程序下載成功。
3.4.1 485通信協議
485通信協議是傳感器進行通信的一種合約,傳感器模塊在接收到485通信指令的時候進行數據的采集并返回結果。每次數據通信的數據包都由包頭+包體+包尾組成,如圖4所示。其中,包頭包括起始字節、地址編碼、指令值和包體長度;起始字節固定為0xaa,地址編碼為485地址編碼,不同的傳感器接入在固定的地址上。蜂鳴器被定義為0x44,指令值為0時,表示獲取傳感器狀態;為1時表示設置狀態/開關,長度是指數據包體的字節數。包尾固定為一個字節,值為0xbb。

圖4 485通信協議指令與數據傳輸過程
打開串口調試助手,選擇16進制發送,分別輸入對應的指令,觀察能否控制蜂鳴器的打開與關閉。根據485的協議包,控制并測試蜂鳴器打開、關閉以及查看蜂鳴器的當前狀態,實驗結果如表1所示。

表1 實驗結果
3.4.2 按鍵控制
置P40為開關鍵,當P40為低電平時,蜂鳴器開;當P40為高電平時,蜂鳴器關。
本設計采用的有源蜂鳴器只能發出一個調,為了呈現的發音效果更豐富,可以采用無源蜂鳴器,只需要給其加上脈沖信號就會發出相應的音調。蜂鳴器在日常生活的方方面面都有所應用,例如:主板蜂鳴器、機箱蜂鳴器、打印機控制板蜂鳴器、警報蜂鳴器、電子玩具音樂蜂鳴器、汽車電子設備中的車載蜂鳴器、倒車蜂鳴器等,還可應用于醫療設備、環境監控等行業。
本設計中,蜂鳴器是一種執行器,它屬于控制類型模塊,是根據指令來執行控制命令的;除此之外,風扇控制器、繼電器控制器、RGB燈控制器的設計也是運用相同的原理來實現的。