基于89C51設(shè)計的電話遠程控制開關(guān)
5.2.4 控制電器
控制電器這部分的外圍硬件電路很容易,在調(diào)試過程中很順利完成。在接仿真機時,使用的是P2口控制電器,實驗結(jié)果表明P2口無法正??刂泼總€電器,翻閱資料發(fā)現(xiàn)單片機89C51的P2口沒有數(shù)據(jù)鎖存功能,不能保持上一個狀態(tài)的數(shù)據(jù)。解決方法:把P2口控制電器改為P1口的低四位控制電器,改線之后控制正常,但是新的問題出現(xiàn)了,原來要求控制八路的端口,現(xiàn)在只能控制四個電器。
經(jīng)過市場實際分析,一般的控制電器只要求3~4路即可,為了實驗單片機擴展控制功能,提高本遙控裝置的潛在功能,我決定實驗使用3-8線譯碼器74LS138對P1口的低四位輸出數(shù)據(jù)進行譯碼擴展。具體電路詳見前面。在成功的擴展了控制電器的個數(shù)后,我又發(fā)現(xiàn)了一個新的問題:遙控器不能同時使兩路以及兩路以上的電器開,即在同一時刻,遙控器只能使一路電器開啟。
經(jīng)過仔細分析,我發(fā)現(xiàn)了問題原因之所在,那就是譯碼器的原理問題。通常情況下我們認為的譯碼器可以擴展所能控制的電器,其實譯碼器只能擴展位數(shù),而不能使狀態(tài)發(fā)生變化。例如:三位二進制000~111可以控制表示三個電器、八種狀態(tài),而經(jīng)過3-8線譯碼器譯碼后,可以控制八個電器,但是其狀態(tài)也只有八種,如下表所示。
A2 A1 A0 輸出D0~D7
0 0 0 0 1 1 1 1 1 1 1
0 0 1 1 0 1 1 1 1 1 1
0 1 0 1 1 0 1 1 1 1 1
0 1 1 1 1 1 0 1 1 1 1
1 0 0 1 1 1 1 0 1 1 1
1 0 1 1 1 1 1 1 0 1 1
1 1 0 1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 1 1 1 0
其解決方法是:使用D觸發(fā)器使繼電器保持上一個狀態(tài),這樣才能使八路電器可以控制28=256個狀態(tài)。
5.2.5 雙音頻檢測
雙音頻檢測是整體電路一個比較重要的過程,它的調(diào)試主要圍繞著雙音多頻解碼芯片8870展開的。在此部分的制作的前期,我采用的芯片是CM8870CPI。開始連接電路調(diào)試時,整體電路工作很正常,后來這塊芯片使用大約一個星期左右的時間,解碼電路經(jīng)常會出現(xiàn)解碼出錯的情況。經(jīng)過仔細檢查電路,仿真機單步執(zhí)行進行調(diào)試,確認硬件電路無誤,診斷為CM8870CPI的問題。根據(jù)我的初步分析認定可能是芯片老化的原因,后更換為MT8870DE發(fā)現(xiàn)本裝置工作很正常,而且換上MT8870DE工作了將近一個月,整體電路沒有發(fā)生任何解碼誤碼情況,MT8870DE在最后的聯(lián)機調(diào)試過程中也沒有出現(xiàn)任何問題。
5.3 軟件程序調(diào)試
5.3.1軟件系統(tǒng)設(shè)置
對于本系統(tǒng)而言,軟件程序所實現(xiàn)的功能比較多,所以軟件程序的調(diào)試顯得相當?shù)臒┈崱U麄€程序是使用匯編語言,在MBUG下編寫調(diào)試完成的。
首先我使用的是我自己的計算機聯(lián)接MCS-51仿真機,計算機的主頻為333MHz,但是出現(xiàn)了許多的問題。第一個問題就是:我所使用的MCS-51仿真機型號是ME-5103,聯(lián)入計算機的25針串行口來進行程序的讀入,但是我的計算機沒有25針串行口。觀察計算機的后面,主板上只有一個25針并行口,是用來連接打印機的;除了這個25針串行口外,還有兩個9針串行口。
我只有把MCS-51仿真機的25針接口變成9針串行接口,才能連接計算機。后來我找到一個25針-9針的轉(zhuǎn)換口,可以通過他使MCS-51仿真機和我的計算機聯(lián)接。
我使用的是Manley In-Circuit Emulator Debugger(MBUG)開發(fā)軟件,使用時發(fā)現(xiàn)此系統(tǒng)可以進行正常的Assemble(匯編),但是不能正常的進行Load Program,執(zhí)行時會出現(xiàn)divide overflow error的錯誤,然后就退出此編譯系統(tǒng),這就使得無法進行仿真機模擬實驗。
經(jīng)過實驗室多組同學(xué)的八臺計算機的嘗試,我們終于發(fā)現(xiàn)了問題之所在。實驗結(jié)果表明:主頻高于233MHz的計算機都不能正常聯(lián)接MCS-51仿真機,而主頻低于100MHz的計算機(有25針串行接口)均可以進行仿真實驗。后來經(jīng)過查閱有關(guān)技術(shù)資料,型號為ME-5103的MCS-51仿真機只能工作在IBM PC/XT/AT 286/386/486的環(huán)境下。
由于實驗室的低檔計算機(能聯(lián)接MCS-51仿真機)的不太多,所以我們只有把僅有的幾臺計算機進行優(yōu)化重組,以便合理利用有限的計算機資源。我的匯編語言程序相對來說還是比較多的,調(diào)試起來可能費時,所以我先在自己的計算機上對程序的語法錯誤(syntax error)進行調(diào)試修改,然后又對地址覆蓋(org address is less)的錯誤進行修改,既對每個子程序的開始地址進行仔細的調(diào)整。到此為止整個軟件程序調(diào)試環(huán)境就已經(jīng)配好了。
5.3.2提示音信號
在本單元的調(diào)試過程中,我認為此部分的結(jié)構(gòu)比較簡單,因此在整體程序中直接調(diào)試。首先Ctrl+F5單步執(zhí)行,發(fā)現(xiàn)此部分的RING1子程序正常,而其它的子程序在執(zhí)行時卻發(fā)生死循環(huán)。我把這幾個子程序單獨切出來進行分析,卻發(fā)現(xiàn)執(zhí)行正常,于是我推測并不是子程序本身的結(jié)構(gòu)問題。然后使用Ctrl+F8對整個程序單步執(zhí)行(兩種單步執(zhí)行的區(qū)別在于F5直接執(zhí)行子程序,即不單步執(zhí)行子程序,而F8對于整個程序都是單步執(zhí)行,包括子程序),發(fā)現(xiàn)RING2中的R5寄存器已經(jīng)在主程序中用作判斷標志位,程序已經(jīng)在外部完成對其賦值。這樣就導(dǎo)致重復(fù)賦值,因此無法跳出循環(huán)子程序,直接導(dǎo)致死循環(huán)。
程序代碼:
ORG 1150H
RING20:MOV R3,#03
RING21:MOV R6,#20 ;password wrong
RING22:MOV R5,#20 ;1600Hz
RING23:LCALL DL20 ;sound=3
CPL P3.0 ;delay=0.25s
DJNZ R5,RING23
DJNZ R6,RING22
CLR P3.0
MOV R5,#200
RING24:LCALL DL10
DJNZ R5,RING24
DJNZ R3,RING21
CLR P3.0
RET
后來我將子程序中的R5寄存器換成R7寄存器,子程序就正常了。
5.3.3密碼檢測
本部分的調(diào)試比較艱難,我是先調(diào)試一位密碼,然后再調(diào)試五位密碼。我先設(shè)定R5為一位,即先設(shè)定一位密碼作為測試。首先單步執(zhí)行,發(fā)現(xiàn)信號音無法正常輸入到單片機的38H地址處的存儲空間?,F(xiàn)象:計算機聯(lián)機單步執(zhí)行,接收振鈴信號,三次自動摘機,當程序執(zhí)行到等待INT0中斷(一個小的循環(huán)程序)時,既等待輸入密碼時,我按下“7”(事先設(shè)定的一位密碼),單片機能夠正常的響應(yīng)中斷信號,跳出循環(huán)程序,執(zhí)行中斷處理程序,單片機在比較比較密碼時,總是出錯。
在程序單步執(zhí)行時,我仔細觀察了每個寄存器和存儲器的內(nèi)容。地址為38H的存儲空間內(nèi)容始終為FFH,并沒有變化,而且無論輸入什么密碼,寄存器A的內(nèi)容總是恒定不變的。因為地址為38H的存儲空間內(nèi)放的是用戶輸入的密碼,累加器A放的是@30H減去@38H的值,即輸入密碼正確時應(yīng)該為0,所以我認為單片機并沒有把數(shù)據(jù)寫入地址為38H的存儲空間。
經(jīng)過反復(fù)調(diào)試我也沒有發(fā)現(xiàn)問題之所在,于是我抱著嘗試的想法用F9全部執(zhí)行一次。結(jié)果很驚人,程序居然能通過密碼檢測部分。我仔細的思考了單步執(zhí)行的每一個狀態(tài),終于發(fā)現(xiàn)了失敗的原因。
程序單步執(zhí)行到等待INT0中斷,即要求輸入密碼時,按下電話機的一個按鍵,程序就跳出循環(huán)程序,跳到中斷處理程序處處理雙音頻信號的輸入。因為單步執(zhí)行是一步一步的執(zhí)行,其執(zhí)行速度比較慢,等到把單片機的P1口高四位的雙音頻解碼信號寫入地址為38H的存儲空間時,信號早已過去,P1口高四位也恢復(fù)高電平,寫入P1口高四位的數(shù)據(jù)當然是FFH。而F9全程執(zhí)行速度非???,不是外部信號等待單片機的處理,而是單片機等待外部信號的輸入,當然不會漏掉數(shù)據(jù)。
原因找到了,解決方法也很簡單:在程序單步執(zhí)行時,到了等待INT0中斷時,我按下“7”鍵的時間特別長,直到看見程序執(zhí)行到寫入地址為38H的存儲空間后才松手。這樣數(shù)據(jù)就能正確寫入寄存器,當然能夠通過密碼檢測。
程序代碼:
HOKE1: LJMP HOKE
ORG 0090H
TT0: SETB 7DH
RETI
ORG 0150H
HOKE: CLR 7DH
SETB P3.1 ;open telephone
CLR TR0 ;close T0
MOV R2,#03H ;password wrong 3
LCALL RING10 ;input password
IN: CLR 7EH ;7EH=0
DTMF: MOV R7,#1H ;PASSWORD:5 R7
MOV R1,#38H ;sign
SETB P1.4
SETB P1.5
SETB P1.6
SETB P1.7
WAIT: JBC 7EH,CC ;wait INT0
LJMP WAIT
CC: MOV R7,#1H ;password 5***
MOV R0,#30H ;password top
MOV R1,#38H ;sign
CMP: MOV A,@R1
MOV R4,A
CLR C
MOV A,@R1
SUBB A,@R0 ;test
INC R0
INC R1
JZ AAA ;OK,pass one
LJMP QQ
AAA: DJNZ R7,CMP ;R7-1!=0
LJMP LL ;pass
QQ: DJNZ R2,IN1 ;password wrongR2!=0
LCALL RING20
LJMP STOP
IN1:LCALL RING20 ;password wrong,try!
LJMP IN
5.4 聯(lián)機在線調(diào)試
經(jīng)過前一階段硬件、軟件的分別調(diào)試,本裝置的制作也到了最后的沖刺階段,那就是聯(lián)機在線調(diào)試。
聯(lián)機在線調(diào)試所用到的設(shè)備:
1、 MCS-51仿真機一臺;
2、 TC-108H“多路通”實驗程控交換機一臺;
3、 HA8188(9)P/T雙音多頻電話機一臺;
4、 HA119(6)P/T雙音多頻電話機一臺;
5、 主頻為50MHz的微機一臺;
由于實驗室條件有限,只有兩臺交換機供十幾組使用,時間非常有限。本裝置的前期調(diào)試工作盡可能的完成在交換機外,例如:振鈴檢測的調(diào)試基本上就是在宿舍的電話上完成的。我是選擇了一個晚上從23點一直調(diào)試到了次日凌晨2點,在別人不使用交換機的時候調(diào)試基本完畢的。
聯(lián)機在線調(diào)試的第一步是振鈴音檢測,由于事先的調(diào)試,這一部分沒有花太多時間,只是在單步執(zhí)行的時候,有時會發(fā)生仿真機不正常結(jié)束程序的情況。經(jīng)過詢問老師和同學(xué),MCS-51仿真機不是太穩(wěn)定,這種情況經(jīng)常發(fā)生,在全速執(zhí)行或把程序燒錄片子之后就不會發(fā)生了。
雙音頻信號解碼在聯(lián)機在線調(diào)試的時候也沒有發(fā)生太大的問題。
最大的問題發(fā)生在程序內(nèi)部的信息處理部分,因為我事先并沒有對信號的編解碼做規(guī)定,這樣就直接導(dǎo)致雙音頻信號解碼后輸入到單片機內(nèi),造成跳轉(zhuǎn)指令混亂。比如我按下“7”鍵,單片機會認為我按下的是“1”鍵。這一部分原理是比較簡單的,但是程序還是挺麻煩的,因為當時已經(jīng)是半夜,所以頭腦比較混亂,我用了一個多小時的時間才把程序內(nèi)譯碼、碼制轉(zhuǎn)換的問題解決。
因為調(diào)試的時候是只使用一位密碼,控制一路電器,所以到了這時,我還有擴展密碼位數(shù)和擴展控制路數(shù)的問題要解決。這些擴展都是時間問題,只要仔細的拷貝一些程序代碼就可以順利完成。
在聯(lián)機調(diào)試的后期我還發(fā)現(xiàn)了一些小問題:我的實驗桌上一共有三排數(shù)據(jù)線,我使用的是其中的一排。結(jié)果總是第三路電器無法實現(xiàn)遙控,更換數(shù)據(jù)線就會變正常。經(jīng)萬用表測量發(fā)現(xiàn)原先使用的數(shù)據(jù)線有一根線根本是不導(dǎo)通的。
我還用不同的MCS-51仿真機實驗,發(fā)現(xiàn)幾乎沒有兩臺MCS-51仿真機的實驗結(jié)果是完全相同的,不是晶振的振蕩頻率不同,就是有個別管腳不能輸出數(shù)據(jù)。晶振的振蕩頻率不同就直接造成延時不同,發(fā)生頻率不一樣。
經(jīng)過一個通宵的調(diào)試,大大小小的各種問題都得到了解決,到此為止,在線聯(lián)機調(diào)試也就告一段落。
第六章 系統(tǒng)使用說明
本系統(tǒng)使用起來非常方便,下面我就系統(tǒng)使用流程圖做一下簡單的使用方法介紹。
如右圖7.1所示,首先用戶把本裝置的信號線并聯(lián)在電話線的兩端,插上電源線,打開電源開關(guān),本裝置自動復(fù)位,就能正常工作了。
當用戶從異地打來電話,本裝置接收到電話振鈴音,開始計數(shù)。當電話鈴聲計到五次,裝置自動摘機,回送提示音提示輸入密碼。
當用戶在三次之內(nèi)輸入正確的密碼后,用戶就可以對裝置所連的電器進行選擇,然后根據(jù)需要對其進行開關(guān)控制。
用戶可以在一次“通話”中同時控制幾個電器。如果用戶控制完畢,可以按‘#’鍵讓裝置自動掛機,結(jié)束“通話”。而已經(jīng)開啟的電器將保持其開啟的狀態(tài),直到下一次的“通話”控制使其關(guān)閉。
本裝置使用起來簡單易學(xué),而且功能強大。
第七章 系統(tǒng)功能擴展
本系統(tǒng)由于時間的限制,在畢業(yè)設(shè)計結(jié)束之前只能作到現(xiàn)有的程度。在本次畢業(yè)設(shè)計的后期,我也盡量對本作品的功能進行了相應(yīng)的擴展。例如:單片機控制電器數(shù)量的增加,此部分充分應(yīng)用了單片機外圍接口擴展技術(shù)。
我在這里對本系統(tǒng)還可以的擴展功能做一下簡單的介紹。
1、使用MT8888芯片還可以進一步擴展其功能,而且使本裝置的體積大大減小,在這里就MT8888集成電路作一個簡單的介紹。
MT8888是MITEL公司的產(chǎn)品,是一種帶呼叫進展過濾器的單片雙音多頻收發(fā)器。它包括一個帶增益可調(diào)放大器的DTMF接收器和一個DTMF發(fā)送器。接收器的結(jié)構(gòu)及工作原理與MT8870大同小異,也采用集頻帶分離濾波和數(shù)字解碼為一體的結(jié)構(gòu)。其中濾波電路也采用高頻群和低頻群兩個六階開關(guān)電容帶通濾波器,解碼采用數(shù)字計數(shù)器技術(shù)來確定輸入的DTMF音調(diào)的頻率,并將其譯成標準的四位二進制碼。發(fā)送器采用開關(guān)電容D/A變換器。片內(nèi)使用了一個脈沖計數(shù)器,能合成精確的音調(diào)脈沖,保證音調(diào)脈沖準確的定時發(fā)送。MT8888提供了一個標準的微處理器總線接口,可以直接與MCS-51系列微機接口。它還可以選用呼叫進展方式工作,通過呼叫進展濾波器來檢測特定通帶內(nèi)的信號頻率,供微處理機或計數(shù)器電路分析,以確定檢測到的呼叫進展音的性質(zhì)。
MT8888的接收工作方式,從檢測DTMF信號到解碼的過程與MT8870完全一致,差異較大的是解碼后的二進制碼的輸出。MT8888沒有延時導(dǎo)引輸出端stD,當收到的有效音調(diào)對已被寄存且相對應(yīng)的四位二進制碼已被鎖在接收數(shù)據(jù)寄存器中時,片內(nèi)狀態(tài)寄存器中的延時控制標志位b3復(fù)位,同時狀態(tài)寄存器中的接收數(shù)據(jù)寄存器滿標志位b2置位,CPU可通過查詢這些狀態(tài)標志來了解解碼的過程。如果選中的是中斷方式,當延時控制標志位復(fù)位時,IRQ/CP端將變?yōu)榈碗娖剑駽PU發(fā)送中斷請求,當CPU響應(yīng)此中斷,讀出狀態(tài)寄存器中的數(shù)據(jù)后,IRQ/CP端返回高電平狀態(tài)。
根據(jù)MT8888的以上特點,它可以檢測出電話振鈴音、忙音等信號音。我設(shè)計了新的系統(tǒng)功能,改進了的系統(tǒng)可以首先工作于第二方式,即電話線路信號音檢測狀態(tài),然后根據(jù)振鈴情況控制摘掛機,摘機后MT8888工作于第四方式,即雙音頻解碼狀態(tài),后面就和8870一樣了。這樣就能節(jié)省硬件電路的設(shè)計制作,還可以大大縮小本裝置整體體積。
2、利用138譯碼器的STA、STB和STC還可以進行級聯(lián)擴展為24線譯碼器,若外接一個反向器還可以級聯(lián)擴展成為32線譯碼器。
3、使用LM567鎖相環(huán)可以對電話信號音中的忙音進行識別,使使用者更加方便,而且能夠提高本裝置的穩(wěn)定性。
評論