徐 敏
(江蘇聯(lián)合職業(yè)技術(shù)學(xué)院 無錫旅游商貿(mào)分院 信息工程系,江蘇 無錫 214000)
單片機是智能制造和智能服務(wù)的基礎(chǔ)技術(shù),具有集成度高、可控力強、適應(yīng)度高、功耗低、擴展靈活等優(yōu)勢。蜂鳴器是傳感器的一種,它是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,在生活的方方面面都有應(yīng)用,例如在計算機、打印機、復(fù)印機、報警器、電子玩具、汽車電子設(shè)備、電話機、定時器等電子產(chǎn)品中作發(fā)聲器件。
本次設(shè)計中單片機選用STC89C52 型號,它是STC公司生產(chǎn)的一種低功耗、高性能CMOS八位微控制器,使用經(jīng)典的MCS-51內(nèi)核,同時也做了很多的改進,使得芯片具有傳統(tǒng)的51單片機不具備的功能,為嵌入式控制應(yīng)用系統(tǒng)提供高靈活有效的解決方案[1]。STC89C52單片機的最小系統(tǒng)有復(fù)位、時鐘、電源3部分電路組成:復(fù)位電路的作用是初始化,再次使用時可以重新開始;時鐘電路使單片機具有自我把控時間的功能,進而準(zhǔn)確地進行數(shù)據(jù)處理;電源電路主要起到為整體電路供電作用[2]。
STC89C52的時鐘機器周期有兩種,分別為:6時鐘/機器周期和12時鐘/機器周期;工作電壓為5.5 V~3.3 V或3.8 V~2.0 V;工作頻率范圍為0~40 MHz;用戶應(yīng)用程序空間為8 k字節(jié)Flash,512字節(jié)的RAM,32 位I/O口線;內(nèi)置4KB EEPROM,MAX810復(fù)位電路,3個16位定時器/計數(shù)器,4個外部中斷,下降沿中斷或低電平觸發(fā)電路,Power Down模式可由外部中斷低電平觸發(fā)中斷方式喚醒一個7向量4級中斷結(jié)構(gòu),兼容傳統(tǒng)51單片機的5向量2級中斷結(jié)構(gòu),全雙工串行口,可用定時器軟件實現(xiàn)多個UART。另外,STC89C52可降至0 Hz 靜態(tài)邏輯操作,支持可選擇節(jié)電模式。工作溫度范圍分為工業(yè)級和商業(yè)級,工業(yè)級為-40~85 ℃,商業(yè)級為0~75 ℃。最高運作頻率為35 MHz,6T/12T可選。系統(tǒng)可編程ISP與應(yīng)用可編程IAP可通過串口(RxD/P3.0,TxD/P3.1)直接下載用戶程序,數(shù)秒即可完成,無需專用編程器或?qū)S梅抡嫫?。封裝形式可采用LQFP-44,PDIP-40,PLCC-44,PQFP-44。
STC89C52RC單片機的工作模式有正常工作模式、掉電模式和空閑模式三種。其中正常工作模式下,單片機處于正常執(zhí)行程序的狀態(tài),典型功耗為4 mA~7 mA;掉電模式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機一切工作停止,直到下一個中斷或硬件復(fù)位為止,中斷返回后,繼續(xù)執(zhí)行源程序,掉電模式的典型功耗遠遠小于0.1 μA;空閑模式下,CPU停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作,典型功耗為2 mA[3]。
STC89C52串口有兩個物理上獨立的接收、發(fā)送緩沖器SBUF,它們占用同一地址99H;接收器是雙緩沖結(jié)構(gòu);發(fā)送緩沖器,因為發(fā)送時CPU是主動的,不會產(chǎn)生重疊錯誤。STC89C52串口結(jié)構(gòu),如圖1所示。
圖1 STC89C52串口結(jié)構(gòu)
Keil C51是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發(fā)系統(tǒng)。與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護性上有明顯的優(yōu)勢,因而易學(xué)易用。Keil提供了包括C編譯器、宏匯編、鏈接器、庫管理和一個功能強大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個集成開發(fā)環(huán)境μVision將這些部分組合在一起。Keil軟件可在WIN98,NT,WIN2000,WINXP等操作系統(tǒng)下運行。
STC-ISP燒錄軟件用于單片機下載編程燒錄程序,是針對STC系列單片機而設(shè)計的,可下載STC89系列、12C2052系列和12C5410等系列的STC單片機。
STC-ISP燒錄軟件有串口助手、Keil仿真設(shè)置、定時器計算器、波特率計算器等功能模塊。本項目中,主要運用串口助手對程序進行燒錄。通過選擇單片機型號、串口號及波特率將編譯程序下載,根據(jù)485通信協(xié)議,發(fā)送并接收指令及數(shù)據(jù)。
本設(shè)計由電磁式有源蜂鳴器,由振蕩器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源后,振蕩器產(chǎn)生的音頻信號電流通過電磁線圈,使電磁線圈產(chǎn)生磁場。振動膜片在電磁線圈和磁鐵的相互作用下,周期性地振動發(fā)聲。
蜂鳴器連接到了STC89C52的P05口,I/O口為低電平時打開,高電平時關(guān)閉。通過對 I/O 口取 0/1 電平來引發(fā)蜂鳴器電壓的通斷,就可讓蜂鳴器產(chǎn)生振動頻率。
本設(shè)計硬件采用STC89C52開發(fā)板、Micro數(shù)據(jù)線、485串口模塊、杜邦線和PC機。軟件包括Windows7及以上系統(tǒng)、KEIL C51開發(fā)環(huán)境、STC-ISP燒寫助手。
3.3.1 延時處理
傳感器在數(shù)據(jù)采集時,由于要和485串口服務(wù)器進行通信,所以需要一定的配置來滿足485串口采集器的實時采集功能。(1)定義延時處理函數(shù),設(shè)置280 ms,40 ms,50 ms,100 ms的延時。(2)設(shè)置配置系統(tǒng)標(biāo)志位為全局變量 glb_sts.system_flag = FALSE,它是主函數(shù)中是否進行數(shù)據(jù)處理的核心變量。(3)設(shè)置定時器文件,用來準(zhǔn)確計算時間,定時的時間達到了以后,glb_sts.system_flag = TRUE,相當(dāng)于告訴單片機可以去執(zhí)行要執(zhí)行的程序。
3.3.2 數(shù)據(jù)包接收與校驗方法
串口服務(wù)器通信的數(shù)據(jù)包接收與校驗方法中,定義最大包長為20,設(shè)置串口波特率為9 600,配置485 控制引腳為P43。定義串口初始化、串口發(fā)送字節(jié)、485發(fā)送字符串以及控制485芯片位發(fā)送模式4個函數(shù)。進行串口初始化:配置串口為模式1,清零T1的控制位,配置T1為模式2,計算T1重載值,當(dāng)初值等于重載值時,禁止T1中斷并使串口中斷,啟動T1。在串口發(fā)送字節(jié)函數(shù)中,置發(fā)送中斷標(biāo)志為1,然后發(fā)送數(shù)據(jù)并且等待數(shù)據(jù)發(fā)送完畢。485發(fā)送字符串函數(shù),檢查發(fā)送的數(shù)據(jù)是否正確,并發(fā)送數(shù)據(jù)包的數(shù)據(jù)??刂?85芯片位發(fā)送模式包括485芯片發(fā)送和讀寫模式。
串口中斷服務(wù)函數(shù)的程序設(shè)計,如圖2所示。(1)首先清除接收中斷;(2)當(dāng)數(shù)據(jù)已接收并未處理的情況下,則不再接收數(shù)據(jù);(3)當(dāng)讀取的數(shù)據(jù)超過數(shù)據(jù)包大小,接收數(shù)據(jù)計數(shù)清零,將讀取的數(shù)據(jù)儲存在數(shù)據(jù)包里;(4)校驗數(shù)據(jù)包頭是否正確,不正確則重新接收數(shù)據(jù);(5)將讀取的485數(shù)據(jù)存在數(shù)據(jù)包內(nèi);(6)清除發(fā)送中斷,清除串口發(fā)送標(biāo)志。
圖2 串口中斷服務(wù)函數(shù)流程
3.3.3 控制蜂鳴器的打開與關(guān)閉
首先進行外設(shè)初始化,包括定時器初始化、串口初始化、全局函數(shù)初始化,并將485總線設(shè)置為讀模式。當(dāng)系統(tǒng)標(biāo)志復(fù)位成功,表示10 ms的周期到了,清除標(biāo)志位。判斷串口數(shù)據(jù)是否讀取成功,清除串口讀取完成標(biāo)志位。數(shù)據(jù)包校驗,如果失敗則清除接收到的數(shù)據(jù);讀取addr位是不是蜂鳴器的標(biāo)志,如果讀取的字符為0,表示關(guān)閉蜂鳴器;如果讀取的字符為1,表示打開蜂鳴器;如果讀取的字符為0XFF,表示讀取當(dāng)前蜂鳴器的狀態(tài)。設(shè)置包尾為0XBB,發(fā)送485數(shù)據(jù)包。相關(guān)代碼如下:
……
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; //關(guān)閉蜂鳴器
TX_BUF[4]= 0; //將蜂鳴器狀態(tài)設(shè)置為0
}
elseif(uart_sts.recv_buf[4]== 1)
{
P05 = OPEN; //打開蜂鳴器
TX_BUF[4] = 1; //將蜂鳴器狀態(tài)設(shè)置為1
}
elseif(uart_sts.recv_buf[4] == 0xff)
{
if(P05 == 1 )
{
TX_BUF [4] = 0; //返回狀態(tài)-->關(guān)閉
}
else
{
TX_BUF [4] = 1; //返回狀態(tài)-->打開
}
}
}
……
3.3.4 按鍵控制
機械觸點式按鍵開關(guān),其主要功能是把機械上的通斷轉(zhuǎn)換為電氣上的邏輯關(guān)系。當(dāng)機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個按鍵開關(guān)在閉合時不會馬上穩(wěn)定地接通,在斷開時也不會一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動。為了不產(chǎn)生這種現(xiàn)象而做的措施就是按鍵消抖。按鍵消抖是指按鍵按下時刻抖動的波形,讀取這一時刻之后20 ms左右的按鍵信息,此時波形已平穩(wěn),這樣可以防止一次按鍵被誤讀多次。
根據(jù)上面的原理描述,即可對按鍵的輸入管腳進行邊沿檢測,當(dāng)檢測到輸入信號變化后,計數(shù)清零并開始計數(shù),計數(shù)到20 ms時進行采樣;再對每次采樣的值進行下降沿檢測,檢測的結(jié)果作為按鍵消抖的脈沖輸出,每次檢測到下降沿時讓狀態(tài)翻轉(zhuǎn)并輸出。
理想波形與實際波形之間是有區(qū)別的,實際波形在按下和釋放的瞬間都有抖動的現(xiàn)象,抖動時間的長短和按鍵的機械特性有關(guān),一般為5~10 ms,如圖3所示。通常采用手動按鍵然后釋放,這個動作中穩(wěn)定閉合的時間超過了20 ms。因此,單片機在檢測按鍵是否按下時都要加上去抖動操作,有專用的去抖動電路,也有專門的去抖動芯片,但通常采用軟件延時的方法解決抖動問題。
圖3 按鍵消抖
利用KEIL開發(fā)環(huán)境打開實驗例程,單擊option按鈕,勾選生成hex文件;打開stc-isp燒錄軟件選擇單片機型號STC89C/LE52RC。將MICRO-USB線插入電腦的USB口,查看并識別串口號。單擊打開程序文件按鈕,選擇剛剛生成的hex文件。插入485-USB串口給STC89C52供電,然后單擊下載/編程按鈕,再按下單片機的電源供電按鈕,等待單片機程序下載成功。
3.4.1 485通信協(xié)議
485通信協(xié)議是傳感器進行通信的一種合約,傳感器模塊在接收到485通信指令的時候進行數(shù)據(jù)的采集并返回結(jié)果。每次數(shù)據(jù)通信的數(shù)據(jù)包都由包頭+包體+包尾組成,如圖4所示。其中,包頭包括起始字節(jié)、地址編碼、指令值和包體長度;起始字節(jié)固定為0xaa,地址編碼為485地址編碼,不同的傳感器接入在固定的地址上。蜂鳴器被定義為0x44,指令值為0時,表示獲取傳感器狀態(tài);為1時表示設(shè)置狀態(tài)/開關(guān),長度是指數(shù)據(jù)包體的字節(jié)數(shù)。包尾固定為一個字節(jié),值為0xbb。
圖4 485通信協(xié)議指令與數(shù)據(jù)傳輸過程
打開串口調(diào)試助手,選擇16進制發(fā)送,分別輸入對應(yīng)的指令,觀察能否控制蜂鳴器的打開與關(guān)閉。根據(jù)485的協(xié)議包,控制并測試蜂鳴器打開、關(guān)閉以及查看蜂鳴器的當(dāng)前狀態(tài),實驗結(jié)果如表1所示。
表1 實驗結(jié)果
3.4.2 按鍵控制
置P40為開關(guān)鍵,當(dāng)P40為低電平時,蜂鳴器開;當(dāng)P40為高電平時,蜂鳴器關(guān)。
本設(shè)計采用的有源蜂鳴器只能發(fā)出一個調(diào),為了呈現(xiàn)的發(fā)音效果更豐富,可以采用無源蜂鳴器,只需要給其加上脈沖信號就會發(fā)出相應(yīng)的音調(diào)。蜂鳴器在日常生活的方方面面都有所應(yīng)用,例如:主板蜂鳴器、機箱蜂鳴器、打印機控制板蜂鳴器、警報蜂鳴器、電子玩具音樂蜂鳴器、汽車電子設(shè)備中的車載蜂鳴器、倒車蜂鳴器等,還可應(yīng)用于醫(yī)療設(shè)備、環(huán)境監(jiān)控等行業(yè)。
本設(shè)計中,蜂鳴器是一種執(zhí)行器,它屬于控制類型模塊,是根據(jù)指令來執(zhí)行控制命令的;除此之外,風(fēng)扇控制器、繼電器控制器、RGB燈控制器的設(shè)計也是運用相同的原理來實現(xiàn)的。