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