詮解單片機(jī)鈴聲控制系統(tǒng)設(shè)計(jì)
時(shí)間:2022-07-21 06:08:00
導(dǎo)語:詮解單片機(jī)鈴聲控制系統(tǒng)設(shè)計(jì)一文來源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。
摘要:介紹一種以單片機(jī)為核心的鈴聲自動(dòng)控制系統(tǒng)。該系統(tǒng)由單片機(jī)AT89C51和時(shí)鐘芯片PCF8583組成,通過RS-485串口通信連接主機(jī)和各響鈴從機(jī),可完成時(shí)間的修改和定時(shí)響鈴等功能。
關(guān)鍵詞:單片機(jī)、時(shí)鐘、RS-485通信
1引言
當(dāng)今社會(huì),計(jì)算機(jī)的應(yīng)用已經(jīng)滲透到人們生產(chǎn)、生活的各個(gè)領(lǐng)域。尤其是以單片機(jī)為代表的微型計(jì)算機(jī)的應(yīng)用最為廣泛,它們憑借其體積小、價(jià)格低、功能強(qiáng)、性價(jià)比高等優(yōu)點(diǎn),占有了計(jì)算機(jī)應(yīng)用領(lǐng)域的半壁江山。本文筆者以單片微型計(jì)算機(jī)為核心,同時(shí)運(yùn)用RS-485遠(yuǎn)程通信協(xié)議,設(shè)計(jì)出一款鈴聲控制系統(tǒng),克服了以往打鈴鐘定時(shí)不準(zhǔn)確,電路復(fù)雜,可靠性低,成本高等缺點(diǎn),使用戶可以隨時(shí)對(duì)任意一點(diǎn)的鈴聲時(shí)刻進(jìn)行修改和設(shè)定,而不影響走時(shí),并且可以方便可靠的實(shí)現(xiàn)分布式遠(yuǎn)程控制。該鈴聲控制系統(tǒng)可以廣泛的適用于學(xué)校、工廠、車站等不同場合的實(shí)時(shí)報(bào)時(shí)控制。
2系統(tǒng)簡介
鈴聲控制系統(tǒng)整體由兩部分組成:主控中心和終端電鈴。主控中心以單片機(jī)為核心,包括控制電路、顯示電路、監(jiān)控電路和遠(yuǎn)程通信部分電路。用戶可以通過控制電路操作主控中心,對(duì)遠(yuǎn)程電鈴進(jìn)行控制。終端電鈴為響應(yīng)控制設(shè)備,通過其自身的控制系統(tǒng)可以獲得清晰、響亮的聲響,另外還可以實(shí)現(xiàn)不同的時(shí)刻發(fā)出的鈴聲不同。同時(shí)主控中心和終端電鈴都具有掉電保護(hù)的功能,極大的提高了整個(gè)系統(tǒng)的穩(wěn)定性和可靠性,它們之間通過RS-485異步串行通信完成遠(yuǎn)程(1200米)數(shù)據(jù)交換。系統(tǒng)整體框圖如圖1所示。
主機(jī)硬件設(shè)計(jì)
主機(jī)作為整個(gè)系統(tǒng)的主控中心按系統(tǒng)要求需要完成的功能有:實(shí)時(shí)時(shí)鐘的產(chǎn)生、用戶控制輸入、各類信息的顯示、數(shù)據(jù)的存取以及遠(yuǎn)程通信。其主要包括:MCU,時(shí)鐘產(chǎn)生模塊,控制輸入模塊,數(shù)據(jù)存儲(chǔ)模塊及通信模塊的選用。
3.1.1MCU的選用
按系統(tǒng)要求及現(xiàn)實(shí)條件,該系統(tǒng)選用的MCU是ATMEL公司的89C51,在實(shí)際設(shè)計(jì)中89C51主要完成智能化的控制、顯示和通信等功能。
3.1.2時(shí)鐘的產(chǎn)生
本系統(tǒng)采用外接時(shí)鐘芯片(選用PCF8583時(shí)鐘芯片),這樣單片機(jī)對(duì)其控制就可以以獲得穩(wěn)定的時(shí)鐘輸出。
3.1.3鍵盤及顯示電路
針對(duì)功能要求,本系統(tǒng)采用的是矩陣式鍵盤和普通的數(shù)碼管顯示電路。矩陣式鍵盤共設(shè)置了16個(gè)按鍵,由4*4矩陣式自制鍵盤構(gòu)成,包括0到9十個(gè)數(shù)字鍵,以及6個(gè)功能鍵。
3.1.4數(shù)據(jù)存儲(chǔ)
考慮到節(jié)省口線、穩(wěn)定性等方面,本系統(tǒng)采用串行數(shù)據(jù)傳輸存儲(chǔ)器。其容量計(jì)算如下:若以打鈴次數(shù)較多的校園為例,每天按12節(jié)課計(jì)算,每節(jié)課打鈴2次,再加上起床和熄燈的次數(shù),打鈴大約在30次左右。每次打鈴的信息格式如圖2。這樣每個(gè)信息單元占8個(gè)字節(jié),存儲(chǔ)時(shí)均按照非壓縮型BCD碼存儲(chǔ),則需要存儲(chǔ)空間大約在240個(gè)字節(jié)左右,選用256字節(jié)的存儲(chǔ)器就能夠滿足容量的要求,故采用了ATMEL公司的24C02。根據(jù)硬件電路的設(shè)計(jì)可得24C02的I2C硬件地址為:0A2H/0A3H。
3.1.5監(jiān)控電路
為保證系統(tǒng)的可靠性,本系統(tǒng)采用了看門狗芯片X5045,可直接與許多通用的微控制器的同步串行外設(shè)接口(SPI)連接。
3.1.6通信模塊
按中遠(yuǎn)距離(1200米)通信要求,本系統(tǒng)采用異步串行通信的方式。從距離及穩(wěn)定性方面考慮,本系統(tǒng)選用平衡傳輸方式的串行接口標(biāo)準(zhǔn)RS-485作為通信標(biāo)準(zhǔn),在具體設(shè)計(jì)中,采用的通信接口芯片是MAX485。
從機(jī)作為整個(gè)控制中心的響應(yīng)設(shè)備,主要完成的功能有:主機(jī)命令的接收、應(yīng)答和響鈴的控制。整個(gè)從機(jī)電路是以AT89C2051微處理器為核心,連接響鈴控制電路。其電路連接如圖所示。
3.3電源模塊
在設(shè)計(jì)中根據(jù)系統(tǒng)要求(當(dāng)突然斷電時(shí),系統(tǒng)整體仍能持續(xù)運(yùn)行)選用了一個(gè)較大的電解電容,斷電時(shí)其所放電量可以保證單片機(jī)及其外圍器件(PCF8583、X5045、24C02)正常工作。但在實(shí)際測試過程中,如果還需對(duì)顯示模塊供電,則單片機(jī)就會(huì)由于電力不足而復(fù)位。為了解決以上問題,可以在顯示供電部分的硬件電路中添加一個(gè)二極管,如圖4所示,通過它的單向?qū)щ娦詠肀WC單片機(jī)系統(tǒng)
在突然斷電時(shí)能夠持續(xù)的工作。
4軟件設(shè)計(jì)
該鈴聲控制系統(tǒng)的軟件設(shè)計(jì)分為主機(jī)軟件設(shè)計(jì)和從機(jī)軟件設(shè)計(jì)。對(duì)于整個(gè)軟件系統(tǒng)設(shè)計(jì)而言,系統(tǒng)監(jiān)控程序的設(shè)計(jì)是關(guān)鍵,是單片機(jī)系統(tǒng)程序的框架。因此本系統(tǒng)主、從機(jī)軟件設(shè)計(jì)都采用了一般結(jié)構(gòu)模式,并綜合考慮系統(tǒng)的結(jié)構(gòu)合理性及運(yùn)行穩(wěn)定性,主機(jī)系統(tǒng)采用了狀態(tài)順序編碼、監(jiān)控模塊在中斷子程序中的設(shè)計(jì)風(fēng)格,但鑒于該系統(tǒng)狀態(tài)單一性,從機(jī)系統(tǒng)并未采用狀態(tài)編碼方式,而是由主程序和串口中斷子程序構(gòu)成。
4.1主機(jī)軟件設(shè)計(jì)
主機(jī)軟件設(shè)計(jì)主要由自檢和初始化主程序、定時(shí)/計(jì)數(shù)器T0中斷服務(wù)程序,以及鍵盤掃描、顯示、狀態(tài)獲得、串口中斷和延時(shí)等子程序構(gòu)成。它實(shí)現(xiàn)了對(duì)硬件設(shè)備的檢測、整個(gè)系統(tǒng)運(yùn)行中的調(diào)度和實(shí)時(shí)監(jiān)控以及對(duì)硬件和軟件的初始化。
4.1.1主程序設(shè)計(jì)
系統(tǒng)通電復(fù)位后,程序隨即進(jìn)入主程序,完成對(duì)系統(tǒng)的自檢。接著對(duì)系統(tǒng)進(jìn)行正常的初始化,包括硬件和軟件初始化。初始化結(jié)束,主程序進(jìn)入等待方式。流程如圖5所示。
系統(tǒng)自檢包括按鍵、顯示檢測、時(shí)鐘芯片PCF8583檢測和E2PROM芯片24C02數(shù)據(jù)區(qū)檢測。(1)按鍵、顯示檢測:檢測前數(shù)碼管處于全滅狀態(tài),隨即顯示提示輸入按鍵(P)。若按下任意鍵,數(shù)碼管顯示該按鍵值,一秒后數(shù)碼管全滅退出檢測。按鍵功能與鍵值定義如下:數(shù)字鍵0-9,功能鍵A-F(A-修改時(shí)鐘,B-修改時(shí)間表,C-通信檢測,D-確定,E-取消,F(xiàn)-移位)。(2)時(shí)鐘芯片PCF8583檢測:首先初始化始終芯片為2003年12月31日,24時(shí)59分55秒。啟動(dòng)時(shí)鐘并顯示,直至?xí)r間顯示為2004年1月1日,0時(shí)0分5秒。隨后數(shù)碼管全滅,檢測退出。(3)E2PROM芯片24C02數(shù)據(jù)區(qū)檢測:顯示DATATEST,檢測開始。24C02有256個(gè)字節(jié)的E2PROM,程序依次對(duì)每個(gè)字節(jié)讀出保存數(shù)據(jù)。寫入0,讀出核對(duì),如正確再寫入0FFH,讀出核對(duì)。核對(duì)無誤把原數(shù)據(jù)恢復(fù)。若在檢測過程中發(fā)現(xiàn)數(shù)據(jù)核對(duì)有誤則顯示出錯(cuò)(ERROR),并把該出錯(cuò)數(shù)據(jù)區(qū)地址顯示出來。至此系統(tǒng)自檢結(jié)束。
系統(tǒng)初始化包括定時(shí)/計(jì)數(shù)器T0,時(shí)鐘時(shí)間表,串口相關(guān)硬件以及看門狗X5045初始化。(1)定時(shí)/計(jì)數(shù)器T0初始化:定時(shí)/計(jì)數(shù)器T0在該系統(tǒng)中作為監(jiān)控程序的載體,其初始值須多方面考慮。設(shè)定為定時(shí)器,定時(shí)50ms,采用方式1(16位定時(shí)/計(jì)數(shù)器)。因單片機(jī)所用晶振為12MHz,故初值X可用如下公式計(jì)算:
50ms=(65536-X)結(jié)果X=15536
定時(shí)器T0的初始化程序如下:
MOVTMOD,#21H;設(shè)置定時(shí)器T0方式1
MOVTH0,#HIGH(15536);填定時(shí)器初值高字節(jié)
MOVTL0,#LOW(15536);填定時(shí)器初值低字節(jié)
SETBTR0;開定時(shí)器T0
SETBET0;允許T0中斷
SETBEA;總中斷允許
(2)時(shí)鐘時(shí)間表的初始化:時(shí)鐘芯片PCF8583的設(shè)置在本系統(tǒng)中需要對(duì)其內(nèi)部9個(gè)寄存器進(jìn)行初始化:控制狀態(tài)寄存器(00H),計(jì)數(shù)寄存器百分之一秒單元(01H),秒單元(02H),分單元(03H),時(shí)單元(04H),年/日期單元(05H),星期和月份單元(06H),時(shí)鐘起鬧控制寄存器(08H),起鬧定時(shí)器(0FH)。其中控制狀態(tài)寄存器設(shè)置為32.768K計(jì)數(shù)方式。(3)串口初始化:包括波特率設(shè)置、串口方式設(shè)置和硬件MAX485設(shè)置。為了通信的穩(wěn)定性與正確性,串口方式設(shè)置為方式3(9位通用異步接收器/發(fā)送器),即對(duì)串口控制寄存器SCON設(shè)值為0D0H。波特率設(shè)置方式為方式2(具有自動(dòng)重裝初值的8位定時(shí)/計(jì)數(shù)器),用定時(shí)/計(jì)數(shù)器T1作為波特率發(fā)生器。設(shè)置波特率為2400。其計(jì)算公式如下:
波特率=得定時(shí)器初值X=230(即0E6H)
MAX485設(shè)置:因MAX485為半雙工方式,所以它的發(fā)送/接收需要對(duì)引腳/RE、DE按要求進(jìn)行置位/復(fù)位設(shè)置。
(3)看門狗初始化:本系統(tǒng)使用了硬件看門狗X5045,考慮程序的運(yùn)行時(shí)間選擇了600ms的復(fù)位時(shí)間。
程序?yàn)椋篗OVA,#10H;X5045方式,看門狗600mLCALLWRSR寫入
系統(tǒng)初始化結(jié)束后,主程序進(jìn)入節(jié)電等待方式。該方式下,送往CPU的時(shí)鐘信號(hào)被封鎖,CPU進(jìn)入等待狀態(tài),此時(shí)堆棧指針SP、程序計(jì)數(shù)器PC、程序狀態(tài)字PSW、累加器A的狀態(tài)均保持不變,I/O引腳保持以前的狀態(tài)。等待方式可由中斷或復(fù)位來退出。在本系統(tǒng)中主要是由定時(shí)中斷T0來喚醒,之后進(jìn)入監(jiān)控循環(huán)。
3.1.2定時(shí)中斷監(jiān)控程序設(shè)計(jì)
定時(shí)中斷服務(wù)程序是本系統(tǒng)程序的核心,由填定時(shí)器初值、喂狗模塊,時(shí)間標(biāo)志位、出錯(cuò)狀態(tài)判斷模塊,鍵盤處理模塊,顯示閃爍判斷及顯示等模塊構(gòu)成。流程圖如圖6所示。狀態(tài)0——初始狀態(tài),正常顯示時(shí)鐘;狀態(tài)1——修改時(shí)鐘狀態(tài);狀態(tài)2——修改時(shí)間表狀態(tài);狀態(tài)3——通信檢測狀態(tài)
(1)填定時(shí)器初值喂狗模塊:主要為監(jiān)控循環(huán)正常運(yùn)行而設(shè)置,看門狗定時(shí)器復(fù)位使其繼續(xù)監(jiān)控系統(tǒng)運(yùn)行。
(2)時(shí)間標(biāo)志位、出錯(cuò)狀態(tài)判斷模塊:為以下程序運(yùn)行中的一些時(shí)間要求而設(shè)置。包含1/2秒標(biāo)志和1秒標(biāo)志;出錯(cuò)狀態(tài)判斷模塊是為顯示定時(shí)間(1s)的出錯(cuò)信息而設(shè)置,包含時(shí)鐘輸入出錯(cuò)和時(shí)間表改動(dòng)出錯(cuò)兩種出錯(cuò)狀態(tài)。
(3)鍵盤處理模塊:它是監(jiān)控程序的主要組成部分,負(fù)責(zé)掃描鍵盤,解釋按鍵和調(diào)度執(zhí)行模塊。
(4)閃爍判斷及顯示模塊:按照硬件設(shè)計(jì),本系統(tǒng)的顯示為靜態(tài)模擬串口顯示。顯示不需要定時(shí)刷新,所以在鍵盤處理后對(duì)是否顯示及是否閃爍要進(jìn)行判斷,以便進(jìn)入正確的顯示模塊。設(shè)置了兩個(gè)標(biāo)志位:顯示標(biāo)志DISPF和閃爍標(biāo)志FLAHF。顯示判斷模塊流程可參照?qǐng)D7。若有閃爍位則該位由顯示1/4秒,滅1/4秒來造成閃爍效果。
3.1.3其他應(yīng)用子程序設(shè)計(jì)
本系統(tǒng)中的應(yīng)用子程序包括鍵盤掃描子程序、顯示子程序、狀態(tài)獲得子程序、串口中斷子程序、延時(shí)子程序以及I2C總線和SPI總線的兩個(gè)通用軟件包。部分子程序在上面已做過介紹了,下面只對(duì)串口中斷子程序、延時(shí)子程序和兩種總線的通用軟件包做說明。
(1)串口中斷子程序:在本系統(tǒng)的通信中應(yīng)用的是RS485串口通信,對(duì)于硬件可參照硬件設(shè)計(jì)的通信部分。因?yàn)樵撏ㄐ藕唵尾淮嬖诖罅繑?shù)據(jù)的通信,所以通信協(xié)議是自行定義的。格式有兩種:通常狀態(tài)下,通信為兩個(gè)字節(jié),首字節(jié)為地址(廣播地址0),尾字節(jié)為響鈴類型,該通信不需要從機(jī)回應(yīng)。檢測狀態(tài)下,通信為一個(gè)字節(jié),包括廣播檢測和單機(jī)檢測。廣播檢測地址為0FFH,單機(jī)地址為某從機(jī)號(hào)(01-99)。當(dāng)從機(jī)接收到0FFH或本機(jī)號(hào)時(shí)響鈴(類型0),否則不做任何響應(yīng)。接收到本機(jī)號(hào)時(shí)要向主機(jī)發(fā)送回應(yīng),主機(jī)接到回應(yīng)表示該從機(jī)運(yùn)行正常。串口中斷子程序只是通常狀態(tài)下調(diào)用的,主要是為了發(fā)送響鈴類型而設(shè)置的。
(2)延時(shí)子程序:本系統(tǒng)中設(shè)置了一個(gè)比較精確的1ms延時(shí)程序,其他延時(shí)程序都是在此基礎(chǔ)上調(diào)用多次實(shí)現(xiàn)的:
經(jīng)計(jì)算可知該程序執(zhí)行用993個(gè)機(jī)器周期,當(dāng)采用12MHz的晶振,1個(gè)機(jī)器周期=1μs,則執(zhí)行該程序要993μs,與1ms比較存在7μs誤差。
(3)I2C總線和SPI總線通用軟件包:本系統(tǒng)硬件設(shè)計(jì)中使用了兩個(gè)I2C總線器件:時(shí)鐘芯片PCF8583和E2PROM24C02,地址分配為PCF8583—0A0H/0A1H,24C02—0A2H/0A3H。本系統(tǒng)I2C模擬通用軟件包由信號(hào)模擬子程序STA、STOP、MACK、MNACK和通用子程序CACK、WRBYT、RDBYT、WRNBYT、RDNBYT共九個(gè)子程序組成??梢栽O(shè)置在程序存儲(chǔ)器的任何空間,占用的資源有R0(18H)、R1(19H)、F0、C。通用軟件包中的符號(hào)單元有:MTD—發(fā)送緩沖區(qū)首址,MRD—接收緩沖區(qū)首址,SLA—尋址字節(jié)(SLAW/R)存放單元,NUMBYT—傳送字節(jié)數(shù)n存放單元。本系統(tǒng)通用軟件包適用于以80C51系列為主控器的I2C總線應(yīng)用系統(tǒng),主控時(shí)鐘頻率為12MHz。如果時(shí)鐘頻率改變則應(yīng)適當(dāng)修改信號(hào)模擬子程序中的定時(shí)要求。通用軟件包中直接與應(yīng)用程序編寫有關(guān)的子程序?yàn)閃RNBYT和RDNBYT。相應(yīng)的I2C總線讀寫指令為:
4.2.1主程序設(shè)計(jì)
本鈴聲控制系統(tǒng)的從機(jī)軟件設(shè)計(jì),主要包含有主程序(自檢程序和初始化程序)、定時(shí)中斷服務(wù)程序及若干子程序設(shè)計(jì)。由于從機(jī)外圍硬件電路很少,故上電復(fù)位后,省去對(duì)外圍器件的檢測,立即進(jìn)入正常的初始化。從機(jī)完成的主要功能是對(duì)主機(jī)發(fā)送命令能夠及時(shí)準(zhǔn)確的接收并響應(yīng),所以初始化主要是串行口的設(shè)置。具體流程見圖8。串口通信要求通信雙方必須有相同的波特率,系統(tǒng)中設(shè)置波特率為2400,為了保證通信的穩(wěn)定性與正確性,設(shè)置為方式3(9位通用異步接收器/發(fā)送器),即對(duì)串口控制寄存器SCON設(shè)值為0D0H。初始化結(jié)束后,主程序即刻進(jìn)入空閑模式:
AT89C2051進(jìn)入等待模式,直到接收到主機(jī)命令。
4.2.2串口中斷子程序
為了讓通信更加穩(wěn)定,我們制定了自己的通信協(xié)議:把通信狀態(tài)分為兩種:正常通信狀態(tài)和檢測通信狀態(tài)。正常通信狀態(tài)主要完成定時(shí)通信打鈴的功能,命令格式為兩個(gè)字節(jié),第一字節(jié)為廣播地址:0;另一字節(jié)為響鈴類型。檢測通信狀態(tài)主要完成對(duì)從機(jī)的通信檢測,分為廣播檢測和單機(jī)檢測。命令格式是一個(gè)字節(jié)為地址字節(jié),其中廣播檢測地址為0,單機(jī)檢測地址為該從機(jī)號(hào)01-99。串行口中斷請(qǐng)求由接收所引起。串行接口接收到了一幀信息,便由硬件置RI=1,在CPU允許中斷請(qǐng)求的情況下,向CPU申請(qǐng)中斷,中斷響應(yīng)后,必須由軟件清楚RI。故在串行口中斷子程序開始,首先清除RI,然后由特殊功能寄存器SBUF讀取數(shù)據(jù)。如上流程圖示。讀取數(shù)據(jù)后,首先進(jìn)行數(shù)據(jù)的校驗(yàn),由于采用的是串行口工作方式3,所以將SCON中的位RB8作為一次校驗(yàn),同時(shí)也取PSW中的奇偶校驗(yàn)位P進(jìn)行二次校驗(yàn),最大可能的保證接收數(shù)據(jù)的正確性。校驗(yàn)程序段如下:
當(dāng)數(shù)據(jù)校驗(yàn)正確時(shí),進(jìn)入正常響應(yīng)階段。按照通信協(xié)議的約定,串口中斷子程序?qū)γ钸M(jìn)行解釋并按命令執(zhí)行相應(yīng)的操作。詳細(xì)命令解釋判斷見圖9。各標(biāo)志判斷結(jié)束后,系統(tǒng)進(jìn)入響鈴控制流程。按照要求,響鈴時(shí)間為10秒,系統(tǒng)中取定時(shí)器T0,配合一個(gè)記數(shù)單元構(gòu)成10秒的延時(shí)。不同時(shí)刻要求響鈴類型不同,在實(shí)際設(shè)計(jì)過程中,利用T0的中斷速率來控制產(chǎn)生聲音的脈沖頻率,通過一個(gè)音頻放大器做簡單的功率放大后產(chǎn)生不同的聲音(見從機(jī)硬件部分)。
程序中T0的初值TH、TL0用于頻率的控制,利用兩個(gè)中間單元DPH、DPL,不同的響鈴類型只需把需要的初值提前放置到DPH、DPL中,調(diào)用設(shè)置T0的以上子程序即可。
5結(jié)束語
在整個(gè)設(shè)計(jì)過程中,無論硬件還是軟件,始終以模塊化設(shè)計(jì)為指導(dǎo)思想,對(duì)整個(gè)系統(tǒng)細(xì)化,分成多個(gè)小模塊,保證每部分都能夠獨(dú)立、可靠的工作,然后把精力集中放在對(duì)各模塊之間的無縫接口上。最終采用TKS-58仿真器來完成了整個(gè)系統(tǒng)的調(diào)試。
- 上一篇:體育教育及價(jià)值詮釋
- 下一篇:小議農(nóng)合社的問題及策略