基于Proteus的自動撥號報警器仿真設(shè)計
2.2 中斷子程序設(shè)計
中斷子程序基本流程如圖3所示。首先建立一個整形數(shù)組numi[],將號碼位數(shù)k保存在numi[0]中,而電話號碼則保存在numi[1]~numi[k]中;然后將數(shù)組numi[]的前k+1位一次性發(fā)送至I2C芯片。讀取的時候,從讀取數(shù)據(jù)首地址一次性讀取出16位數(shù)據(jù)(電話號碼最多14位),將其保存在整形數(shù)組phn[]中,撥號的時候從phn[1]開始,一共讀phn[0]次,這樣不但可以準確的傳輸電話號碼并進行撥號,同時對I2C芯片的
讀/寫僅需1次,降低了讀寫過程中未知錯誤發(fā)生的概率。
該設(shè)計共有8路外部模擬報警信號輸入,其警報信號定義如表1所示。將長音視為1,短音視為0,則警報內(nèi)容可譯為報警信號源代碼的BCD碼低三位,以此作為報警類型標識。本文引用地址:http://www.ex-cimer.com/article/150595.htm
2.3 LCD顯示子程序
LCD顯示子程序包含有多個子函數(shù),包括:讀LCD狀態(tài)指令函數(shù)recom()、測試忙函數(shù)busytest()、寫LCD指令函數(shù)wrcomn()、LCD清屏函數(shù)clrscr()、初始化LCD函數(shù)initled()、光標定位函數(shù)setpos();寫單字節(jié)數(shù)據(jù)函數(shù)writedata();對于某一行的寫入字符串函數(shù)wrll()與wr21()。其中,讀/寫指令、測試忙、清屏、光標定位、寫單字數(shù)據(jù)均是按照LCD原理命令字進行操作。LCD的初始化包括復位設(shè)置、清除顯示、地址歸位、顯示開關(guān)、游標設(shè)置、讀/寫地址設(shè)置等,LCD中所有數(shù)字和字符都可以通過它的ASCII碼來訪問顯示。
2.4 撥號音頻模塊程序設(shè)計
在撥號程序設(shè)計中關(guān)鍵要控制好定時器以實現(xiàn)準確的占空比脈沖,程序編寫中,設(shè)置TMOD=0x11,定時器設(shè)置為操作模式1,當生成61.5 ms低電平脈沖時,TC=216-61.5 ms/1μs=4 036=0x0FC4,因此TH0=0x0F,TL0=0xC4;當生成38.5ms高電平脈沖時,TC=216-38.5ms/1μs= 27 036=0x699C,所以TH0=0x69,TL0=0x9C;當延時500 ms時,由于單片機定時器最大定時時間為61.5 ms(方式1),因此采取在一個循環(huán)次數(shù)為10的for循環(huán)中執(zhí)行定時時間為50 ms的程序,TC=216-50 ms/1μs=15 536=0x3CB0,因此TH0=0x3C,TL0=0xB0。
音頻模塊程序設(shè)計是通過設(shè)定特定頻率的正負脈沖序列,驅(qū)動擴音器播放出相應音調(diào)的聲音,例如若設(shè)置單片機定時器1TH0=0xFB,TL0= 0x44,則脈沖周期約為2.424 ms,所發(fā)出的聲音與音調(diào)“do”相似。在此不妨定義發(fā)長音時間為500 ms,發(fā)短音時間為100 ms。長短音信號相互組合成不同的警報信息可用來定義不同的報警類型。
3 調(diào)試與運行
在Proteus和Keil中進行相關(guān)的設(shè)置,可以讓兩者進行聯(lián)調(diào),聯(lián)調(diào)可以在同一臺計算機上進行,也可以在不同的計算機之間進行。通過Proteus與Keil的聯(lián)調(diào)可以輕易做到在不使用硬件的前提下直接在仿真平臺上進行實時仿真,對于系統(tǒng)的調(diào)試具有很大意義。實時仿真能降低調(diào)試的難度,更有利于設(shè)計中一些問題的解決以及BUG的發(fā)現(xiàn)。相比較于只能觀看運行結(jié)果的系統(tǒng)來說,聯(lián)調(diào)可以大大提高設(shè)計制作的效率。Pro-teus與Keil的聯(lián)調(diào)需要用到Proteus下的一個動態(tài)鏈接庫文件VDM51.DLL,用其作為Keil鏈接到Proteus的接口。
系統(tǒng)運行后,首先初始化系統(tǒng),并顯示系統(tǒng)信息,數(shù)秒鐘的延時之后LCD將顯示提示“是否輸入新號碼?”,若按“#”則進入號碼輸入界面。輸入完畢后按“#”結(jié)束輸入,如果輸入錯誤則按“*”重新輸入,若按“*”則進入等待狀態(tài),若報警開關(guān)未打開,則進入空閑狀態(tài),此時按“#”可以修改已存儲的電話號碼。若報警開關(guān)已經(jīng)打開,則進入監(jiān)控狀態(tài),此時按“#”依然可以修改之前存儲的電話號碼。若此時有外部報警信號進入,則進入中斷程序,開始撥號。同時,可用電壓探針探測到輸出的撥號脈沖序列,如圖4所示。根據(jù)脈沖撥號原理,數(shù)字1~9撥號脈沖個數(shù)與撥號數(shù)字相同,0的脈沖個數(shù)是10。
撥號完成會延時10 s,之后將會根據(jù)輸入報警信號類型判斷警報內(nèi)容,若打開第六路報警信號開關(guān),此時系統(tǒng)發(fā)出了長、長、短的警報信號。若將報警開關(guān)閉合,系統(tǒng)被掛起,解除報警信號,可模擬成報警器被人暫時關(guān)閉,并開始處理報警內(nèi)容,如:火災則滅火,毒氣則通
風,盜竊則檢查門窗物件等。報警信號解除后,程序跳出中斷循環(huán)程序,返回到主程序的監(jiān)控狀態(tài)。
4 結(jié)語
本文給出了使用Proteus軟件仿真自動撥號報警器實驗的具體設(shè)計過程,采用模塊程序設(shè)計,利用仿真軟件Proteus及Keil C51聯(lián)合調(diào)試程序。程序設(shè)計過程對每個模塊先進行獨立編程,調(diào)試通過之后再一起合并進行系統(tǒng)程序總調(diào)試。通過上述方式,學生完全可以通過Proteus軟件實現(xiàn)單片機實驗的仿真,并在較短的時間內(nèi)完成單片機系統(tǒng)的軟、硬件設(shè)計,形象生動地理解并掌握單片機技術(shù)。不僅彌補了硬件資源投入不足的弊端,還明顯克服了實驗箱教學中固定硬件資源導致實驗內(nèi)容固定的缺陷,極大地發(fā)揮了學生的主觀能動性和創(chuàng)造性。
評論