系統(tǒng)總體設(shè)計(jì) 2.1系統(tǒng)基本設(shè)計(jì)方案 2.1.1控制部分的選擇方案與論證 2.1.2 顯示電路模塊的選擇方案與論證 2.1.3輸入電路模塊的選擇方案與論證 2.2電路設(shè)計(jì)最終方案 3 系統(tǒng)硬件設(shè)計(jì) 3.1 系統(tǒng)硬件原理圖 3.2主芯片模塊 3.2.1 AT89C51芯片引腳 3.2.2晶振和復(fù)位電路模塊 3.3顯示電路模塊 3.3.1 1602LCD簡介 3.3.2 1602LCD的RAM地址映射及標(biāo)準(zhǔn)字庫表 3.3.3 1602LCD的一般初始化過程 3.4矩陣鍵盤輸入電路模塊 3.4.1矩陣鍵盤的基本結(jié)構(gòu) 3.4.2矩陣鍵盤的按鍵識別方法 4 系統(tǒng)軟件設(shè)計(jì) 4.1 程序設(shè)計(jì)整體思路 4.2.主要功能模塊設(shè)計(jì) 4.2.1 鍵盤掃描模塊設(shè)計(jì) 4.2.2 LCD顯示模塊設(shè)計(jì) 5 系統(tǒng)仿真與調(diào)試 5.1系統(tǒng)運(yùn)行環(huán)境 5.2 系統(tǒng)仿真說明 5.2.1 KEILC調(diào)試 5.2.2 Proteus調(diào)試 5.2.3 Proteus與Keilc聯(lián)調(diào)實(shí)現(xiàn)電路仿真 總 結(jié) 致 謝 參考文獻(xiàn) 附件1 源程序代碼 附件2 電話撥號系統(tǒng)電路原理圖
隨著社會的發(fā)展,科學(xué)的進(jìn)步,人們的生活水平在逐步的提高,尤其是微電子技術(shù)的發(fā)展,猶如雨后春筍般的變化。各種數(shù)字顯示儀器中的顯示、廣告牌、數(shù)碼產(chǎn)品等,傳統(tǒng)的數(shù)碼管顯示已經(jīng)遠(yuǎn)遠(yuǎn)不能滿足各行各業(yè)的需求。單片機(jī)的應(yīng)用已經(jīng)越來越貼近生活,用單片機(jī)來實(shí)現(xiàn)一些電子設(shè)計(jì)也變得容易起來;趩纹瑱C(jī)的LCD顯示是一種用單片機(jī)來控制的一種顯示系統(tǒng),它不僅能顯示種各數(shù)字、字母、還能顯示各種字體的漢字以及一些簡單的圖象,使用起來極為方便,只要通過對單片機(jī)寫入一定的程序來控制LCD的顯示即可完成,根據(jù)程序的不同而產(chǎn)生不同不效果。隨著單片機(jī)產(chǎn)品以及LCD產(chǎn)品的不斷涌現(xiàn),這一領(lǐng)域已經(jīng)得到了飛速的發(fā)展。 本文設(shè)計(jì)的是基于單片機(jī)的電話撥號系統(tǒng),主要介紹了一種基于AT89C51單片機(jī)的電話撥號控制系統(tǒng),該系統(tǒng)可以實(shí)現(xiàn)電話號碼數(shù)字顯示。系統(tǒng)主要由電話撥號矩陣鍵盤、單片機(jī)最小系統(tǒng)、LCD1602顯示屏幾個單元電路組成。在本設(shè)計(jì)中,最終選用的是矩陣式鍵盤,把所操作的數(shù)字送至單片機(jī),通過單片機(jī)實(shí)現(xiàn)號碼的顯示與控制。
2 系統(tǒng)總體設(shè)計(jì)
2.1系統(tǒng)基本設(shè)計(jì)方案
2.1.1控制部分的選擇方案與論證 方案一:用可編程邏輯器件設(shè)計(jì) 可采用PLD器件,設(shè)計(jì)起來結(jié)構(gòu)清晰,各個模塊從硬件上設(shè)計(jì)起來相對簡單,控制與顯示的模塊間連接也會比較方便。但是考慮到本設(shè)計(jì)的特點(diǎn),EDA在能夠擴(kuò)展上比較受局限,占用的資源也多。從成本上講,可編程邏輯器件價(jià)格比較高。 方案二:用單片機(jī)設(shè)計(jì) 用單片機(jī)芯片作為控制部分,單片機(jī)有豐富的中斷源,它的準(zhǔn)確度相當(dāng)高,并且C語言的靈活運(yùn)用,給編程帶來了方便。單片機(jī)I/O功能也比較強(qiáng)大,容易對其進(jìn)行擴(kuò)展,使設(shè)計(jì)更加完善,此外單片機(jī)的成本也比較低。 綜上所述,單片機(jī)資源豐富,程序編寫也靈活簡單,可移植性強(qiáng),性價(jià)比也高,所以選擇單片機(jī)作為主控芯片。 2.1.2 顯示電路模塊的選擇方案與論證LCD由于其顯示清晰,顯示內(nèi)容豐富,顯示信息量大,使用方便,顯示快速而得到了廣泛的應(yīng)用。 對于此系統(tǒng)本設(shè)計(jì)選用的LCD液晶能夠顯示英語字母和數(shù)字,能夠很好的滿足顯示要求,因此本設(shè)計(jì)選擇了此方案。 2.1.3輸入電路模塊的選擇方案與論證鍵盤用于實(shí)現(xiàn)單片機(jī)應(yīng)用系統(tǒng)中的數(shù)據(jù)和控制命令的輸入,鍵盤輸入也是單片機(jī)應(yīng)用系統(tǒng)中使用最廣泛的一種輸入方式。鍵盤輸入的主要對象是各種按鍵或開關(guān)。這些按健或者開關(guān)可以獨(dú)立使用,也可以組合成鍵陣使用。單片機(jī)中常用的按鍵式鍵盤可以分為兩類:獨(dú)立連接式和行列式。每類按譯碼方式的不同又分為編碼式和非編碼式兩種。單片機(jī)中一般使用的都是用軟件來識別和產(chǎn)生鍵代碼的非編碼鍵盤。行列式鍵盤的編碼方式有靜態(tài)和動態(tài)兩種。靜態(tài)接口主要由一個行編碼器和一個列編碼器構(gòu)成;動態(tài)接口可采用計(jì)數(shù)器,譯碼器和數(shù)據(jù)選擇器構(gòu)成。這兩種鍵盤由硬件完成鍵的辨碼任務(wù)。一般在小型儀器儀表和控制系統(tǒng)中,使用較多的是行列式和獨(dú)立式的非編碼鍵盤;如果系統(tǒng)要求實(shí)現(xiàn)多鍵同時按下的處理,則用非編碼獨(dú)立方式較為合適。 方案一:采用獨(dú)立式按鍵電路 獨(dú)立式按鍵電路每個按鍵單獨(dú)占有一根I/O接口線, 每個I/O口的工作狀態(tài)互不影響,此類鍵盤采用端口直接掃描方式。缺點(diǎn)為當(dāng)按鍵較多時占用單片機(jī)的I/O口數(shù)目較多,優(yōu)點(diǎn)為電路設(shè)計(jì)簡單,且編程相對比較容易。 方案二:采用矩陣式鍵盤電路 矩陣式鍵盤為4*3矩陣式行列掃描,雖然軟件較為復(fù)雜,但是當(dāng)按鍵較多時可降低占用單片機(jī)的I/O口數(shù)目。 對于本系統(tǒng),由于按鍵數(shù)目多,故采用方案二。 2.2電路設(shè)計(jì)最終方案本系統(tǒng)包括主芯片模塊、顯示電路模塊、鍵盤輸入模塊、晶振和復(fù)位電路模塊。綜上各方案所述,確定最終設(shè)計(jì)方案為:采用單片機(jī)作為主控芯片,1602LCD液晶作為顯示部分,矩陣式按鍵作為鍵盤輸入模塊。
3 系統(tǒng)硬件設(shè)計(jì)3.1 系統(tǒng)硬件原理圖 將電話撥號鍵盤上所撥號碼顯示在1602液晶屏上的電路如圖3.1所示。
圖3.1系統(tǒng)硬件原理圖 3.2主芯片模塊 AT89C51是一種帶4K字節(jié)閃存可編程可擦除只讀存儲器FPEROM—Falsh Programmable and Erasable Read Only Memory )的低電壓、高性能CMOS8位微處理器,俗稱單片機(jī)。AT89C2051是一種帶2K字節(jié)閃存可編程可擦除只讀存儲器的單片機(jī)。單片機(jī)的可擦除只讀存儲器可以反復(fù)擦除1000次。該器件采用ATMEL高密度非易失存儲器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。AT89C51單片機(jī)為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價(jià)廉的方案。如圖3.2所示。
圖3.2 AT89C51芯片引腳圖 3.2.1 AT89C51芯片引腳管腳說明 VCC:供電電壓。 GND:接地。 P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P0口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時,P0 口作為原碼輸入口,當(dāng)FIASH進(jìn)行校驗(yàn)時,P0輸出原碼,此時P0外部必須被拉高。 P1口:P1口是一個內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗(yàn)時,P1口作為第八位地址接收。 P2口:P2口為一個內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當(dāng)P2口被寫“1”時,其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲器或16位地址外部數(shù)據(jù)存儲器進(jìn)行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內(nèi)部上拉優(yōu)勢,當(dāng)對外部八位地址數(shù)據(jù)存儲器進(jìn)行讀寫時,P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗(yàn)時接收高八位地址信號和控制信號。 P3口:P3口管腳是8個帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。P3口也可作為AT89C51的一些特殊功能口,如表3.1所示。 表3.1 P3口特殊功能表
P3口同時為閃爍編程和編程校驗(yàn)接收一些控制信號。 RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時,要保持RST腳兩個機(jī)器周期的高電平時間。 ALE/PROG:當(dāng)訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時,ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。 /PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機(jī)器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信號將不出現(xiàn)。 /EA/VPP:當(dāng)/EA保持低電平時,則在此期間外部程序存(0000H-FFFFH),不管是否有內(nèi)部程序存儲器。注意加密方式1時,/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時,此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。 XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。 XTAL2:來自反向振蕩器的輸出。 3.2.2晶振和復(fù)位電路模塊 (1)復(fù)位電路 單片機(jī)需要復(fù)位以后才能正常工作,復(fù)位的目的就是使單片機(jī)處于一個基準(zhǔn)點(diǎn),在這個基準(zhǔn)點(diǎn),程序?qū)䦶腃51的main()主函數(shù)的第一條語句開始執(zhí)行。復(fù)位工作是一個純硬件的工作,一般是在上電開始幾毫秒內(nèi)執(zhí)行完畢。 復(fù)位的過程很簡單,在電源剛剛合上時,電流經(jīng)過電阻對電解電容器充電,這樣在電阻上就形成一個電壓,對于單片機(jī)來說,這個電壓就是復(fù)位電壓。經(jīng)過若干毫秒以后,電解電容器被充滿電,這時電阻就沒有電流流過,電阻兩端也就沒有電壓,單片機(jī)的復(fù)位腳電壓恢復(fù)為0,復(fù)位工作結(jié)束,單片機(jī)開始工作。晶振和復(fù)位電路模塊是系統(tǒng)中很重要的一部分,如圖3.3所示。
圖3.3 晶振和復(fù)位電路 (2)晶振電路 在AT89C51單片機(jī)內(nèi)部有一振蕩電路,只要在單片機(jī)的XTAL1和XTAL2引腳外接晶振,就改成了自激振蕩器并在單片機(jī)內(nèi)部產(chǎn)生時鐘脈沖信號。 如圖3.3所示,單片機(jī)工作的時間基準(zhǔn)是由時鐘電路提供的。在單片機(jī)的XTAL1和XTAL2兩個引腳間,接一個晶振及兩只電容就構(gòu)成了時鐘電路。 電路中的器件可以通過計(jì)算和實(shí)驗(yàn)確定,也可以參考一些典型電路參數(shù)。電路中,電容器C1和C2對晶振器頻率有微調(diào)作用,通常取值范圍30+10pF;石英晶體選擇6MHZ或12MHZ都可以。其結(jié)果只是機(jī)器周期時間不同,影響計(jì)算器的計(jì)數(shù)初值。 3.3顯示電路模塊本設(shè)計(jì)中重點(diǎn)部分是基于單片機(jī)系統(tǒng)的液晶顯示部分。液晶顯示模塊是一種將液晶顯示器件、連接件、集成電路、PCB線路板、背光源、結(jié)構(gòu)件裝配在一起的組件,英文名叫“LCD Module”, 簡稱“LCM”,中文一般為“液晶顯示模塊”。在單片機(jī)系統(tǒng)中使用液晶顯示模塊作為輸出有以下優(yōu)點(diǎn):顯示資料高、數(shù)字式接口、功率消耗小、電路中的應(yīng)用。
3.3.1 1602LCD簡介工業(yè)字符型液晶能夠同時顯示16*2即32個字,(16列2行)1602字符型LCD通常有14條引腳線或16條引腳線的LCD,多出來的兩條是背光電源線。 一般1602字符型液晶顯示器實(shí)物如圖3.4所示。
圖3.4 1602LCD的實(shí)物圖 1602LCD分為帶背光和不帶背光兩種,基控制器大部分為HD44780,帶背光的比不帶背光的厚,應(yīng)用中并無差別。 1602LCD原件顯示原理如圖3.5所示。 圖3.5 1602LCD原件顯示原理圖
1602LCD采用標(biāo)準(zhǔn)的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如表3.2所示。 表3.2 引腳接口說明表
第1腳:VSS為地電源。 第2腳:VDD接5V正電源。 第3腳:VEE為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度。 第4腳:RS為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。 第5腳:R/W為讀寫信號線,高電平時進(jìn)行讀操作,低電平時進(jìn)行寫操作。當(dāng)RS和R/W共同為低電平時可以寫入指令或者顯示地址,當(dāng)RS為低電平R/W為高電平時可以讀忙信號,當(dāng)RS為高電平R/W為低電平時可以寫入數(shù)據(jù)。 第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。 第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。 第15腳:背光源正極。 第16腳:背光源負(fù)極。 1602LCD的控制命令表如表3.3所示。 表3.3 控制命令表
1602液晶模塊的讀寫操作、屏幕和光標(biāo)的操作都是通過指令編程來實(shí)現(xiàn)的。(說明:1為高電平、0為低電平) 指令1:清顯示,指令碼01H, 光標(biāo)復(fù)位到地址00H位置。 指令2:光標(biāo)復(fù)位,光標(biāo)返回到地址00H。 指令3:光標(biāo)和顯示模式設(shè)置 I/D:光標(biāo)移動方向,高電平右移,低電平左移 S: 屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。 指令4:顯示開關(guān)控制。 D:控制整體顯示的開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示 C:控制光標(biāo)的開與關(guān),高電平表示有光標(biāo),低電平表示無光標(biāo) B:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍。 指令5:光標(biāo)或顯示移位 S/C:高電平時移動顯示的文字,低電平時移動光標(biāo)。 指令6:功能設(shè)置命令 DL:高電平時為4位總線,低電平時為8位總線 N:低電平時為單行顯示,高電平時雙行顯示 F: 低電平時顯示5x7的點(diǎn)陣字符,高電平時顯示5x10的點(diǎn)陣字符。 指令7:字符發(fā)生器RAM地址設(shè)置。 指令8:DDRAM地址設(shè)置。 指令9:讀忙信號和光標(biāo)地址 BF:為忙標(biāo)志位,高電平表示忙,此時模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。 指令10:寫數(shù)據(jù)。 指令11:讀數(shù)據(jù)。 3.3.2 1602LCD的RAM地址映射及標(biāo)準(zhǔn)字庫表液晶顯示模塊是一個慢顯示器件,所以在執(zhí)行每條指令前一定要確認(rèn)模塊的忙標(biāo)志為低電平,表示不忙,否則此指令失效。要顯示字符時要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,圖3.6是1602的內(nèi)部顯示地址。 圖3.6 1602LCD內(nèi)部顯示地址 例如第二行第一個字符的地址是40H,那么是否直接寫入40H就可以將光標(biāo)定位在第二行第一個字符的位置呢?這樣不行,因?yàn)閷懭腼@示地址時要求最高位D7恒定為高電平1所以實(shí)際寫入的數(shù)據(jù)應(yīng)該是01000000B(40H)+10000000B (80H) =11000000B (C0H) 。 在對液晶模塊的初始化中要先設(shè)置其顯示模式,在液晶模塊顯示字符時光標(biāo)是自動右移的,無需人工干預(yù)。每次輸入指令前都要判斷液晶模塊是否處于忙的狀態(tài)。1602液晶模塊內(nèi)部的字符發(fā)生存儲器(CGROM)已經(jīng)存儲了160個不同的點(diǎn)陣字符圖形,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時模塊把地址41H中的點(diǎn)陣字符圖形顯示出來,我們就能看到字母“A”。其中字符代碼與字符圖形對應(yīng)關(guān)系如圖3.7所示。
圖3.7字符代碼與字符圖形對應(yīng)關(guān)系 3.3.3 1602LCD的一般初始化過程延時15mS 寫指令38H(不檢測忙信號) 延時5mS 寫指令38H(不檢測忙信號) 延時5mS 寫指令38H(不檢測忙信號) 以后每次寫指令、讀/寫數(shù)據(jù)操作均需要檢測忙信號 寫指令38H:顯示模式設(shè)置 寫指令08H:顯示關(guān)閉 寫指令01H:顯示清屏 寫指令06H:顯示光標(biāo)移動設(shè)置 寫指令0CH:顯示開及光標(biāo)設(shè)置 3.4矩陣鍵盤輸入電路模塊3.4.1矩陣鍵盤的基本結(jié)構(gòu)矩陣鍵盤中的鍵實(shí)際上就是一個機(jī)械開關(guān),位于行線和列線的交點(diǎn)處,圖3.8所示為本設(shè)計(jì)中使用的4行×3列的12鍵矩陣鍵盤,當(dāng)鍵被按下時,其交點(diǎn)的行線和列線接通,使相應(yīng)行線或列線上的電平發(fā)生變化,根據(jù)電平變化情況確定被按下的鍵。
圖3.8鍵盤排列圖 3.4.2矩陣鍵盤的按鍵識別方法常用的鍵盤識別方法有:行掃描法,線翻轉(zhuǎn)法和利用8279鍵盤接口的中斷法。前兩種方法相當(dāng)于查詢法,需要反復(fù)查詢按鍵的狀態(tài),會占用大量的CPU時間。后一種方法在有鍵按下時向CPU申請中斷,平時并不需要占用CPU時間。在本系統(tǒng)中,完全可以不使用中斷法完成鍵盤接口,這是由系統(tǒng)的特殊性決定的。首先,對于本系統(tǒng)而言,要實(shí)現(xiàn)便攜式的設(shè)計(jì),硬件電路使用的器件越少越好。其次,被測信號由外中斷引腳輸入,未占用單片機(jī)4個并行I/O口中的任何一個,系統(tǒng)有足夠的資源利用自身I/O 口完成接口。最后,只有當(dāng)傳感器輸出信號頻率為空載頻率,系統(tǒng)處于空閑待測的狀態(tài)下,才允許鍵盤輸入,因此鍵盤識別占用的CPU時間不會對系統(tǒng)正常工作造成影響。因此直接利用單片機(jī)并行接口完成鍵盤的接口,采用行掃描法進(jìn)行鍵盤識別。
行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法,如圖3.9所示鍵盤。 圖3.9鍵盤原理圖 (1)判斷鍵盤上是否有鍵閉合 將全部行線置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。 (2)去除鍵的機(jī)械抖動 為保證鍵的正確識別,需要進(jìn)行去抖動處理。其方法是得知鍵盤上有鍵閉合后延遲一段時間,再判別鍵盤的狀態(tài),若仍有鍵閉合,則認(rèn)為鍵盤上有一個鍵處于穩(wěn)定的閉合期,否則認(rèn)為是鍵的抖動或者是干擾。 (3)確定閉合鍵的物理位置 在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。 (4)得到閉合鍵的編號 在得到閉合鍵的物理位置的基礎(chǔ)上,根據(jù)給定的按鍵編號規(guī)律,計(jì)算得出閉合鍵的編號。 (5)確保CPU對鍵的一次閉合僅做一次處理 為實(shí)現(xiàn)這一功能,可以采用等待閉合鍵釋放以后在處理的方法。 4 系統(tǒng)軟件設(shè)計(jì)C51單片機(jī)可以應(yīng)用匯編語言和C語言進(jìn)行編程。匯編語言與機(jī)器指令一一對應(yīng),所以用匯編語言編寫的程序在單片機(jī)里運(yùn)行起來效率較高,但可移植性差。C語言程序可讀性高,也便于移植到其它系統(tǒng)中,故本次設(shè)計(jì)使用C語言編程。 4.1 程序設(shè)計(jì)整體思路本設(shè)計(jì)是由單片機(jī)控制的LCD顯示系統(tǒng),另外鍵盤來控制顯示的方式。 用P3口作為鍵盤的輸入端,對于按鍵的識別方式可以是中斷也可以是查詢,在此設(shè)計(jì)中所選用的是行掃描法進(jìn)行鍵盤識別。 用P0口作為LCD的顯示控制端,由于此LCD的顯示屏被分為了兩部分,所以應(yīng)該對LCD顯示位置進(jìn)行設(shè)置。由此LCD的顯示時序可知,在顯示過程中還需要一定的延時并且在顯示前需將一些特定的控制端置相應(yīng)的電平,所以還需要一個適當(dāng)?shù)难訒r子程序以及輸入數(shù)據(jù)前的準(zhǔn)備程序。除了這些外,還應(yīng)寫一個初始化程序,用來對LCD進(jìn)行初始化設(shè)置。 最后就是主函數(shù),它的主要功能就是判斷鍵盤上是否有按鍵閉合,若有按鍵閉合,然后根據(jù)按下的是哪一個鍵來執(zhí)行相應(yīng)的程序,選擇相應(yīng)的顯示方式。系統(tǒng)功能設(shè)計(jì)框圖如圖4.1所示。
圖4.1 系統(tǒng)功能設(shè)計(jì)框圖 4.2.主要功能模塊設(shè)計(jì) 系統(tǒng)主程序設(shè)計(jì)流程圖如圖4.2,其源代碼見附件1。
圖片見附件
圖4.2 系統(tǒng)主程序設(shè)計(jì)流程圖
系統(tǒng)第一次上電后,先進(jìn)行初始化,初始化LCD模塊,設(shè)置LCD中各個部分的顯示內(nèi)容,然后進(jìn)行鍵盤掃描,獲取按鍵,以及根據(jù)各按鍵的不同執(zhí)行相應(yīng)的操作,最后等待釋放,釋放之后再進(jìn)行鍵盤掃描,循環(huán)以上操作。 4.2.1 鍵盤掃描模塊設(shè)計(jì)鍵盤上有很多鍵,每一個鍵對應(yīng)一個鍵碼,以便根據(jù)鍵碼轉(zhuǎn)到相應(yīng)的鍵處理子程序,進(jìn)一步實(shí)現(xiàn)數(shù)據(jù)輸入和命令處理的功能。 鍵盤掃描子程序設(shè)計(jì)流程圖如圖4.3所示,其源代碼見附件1。
下面給出一個具體的例子解釋圖4.3的流程。 如圖3.2所示,AT89C51單片機(jī)的P3口用作鍵盤I/O口,鍵盤的列線接到P3口的低4位,鍵盤的行線接到P3口的高4位。列線P3.0-P3.3分別接有4個上拉電阻到正電源+5V,并把列線P3.0-P3.3設(shè)置為輸入線,行線P3.4-P3.7設(shè)置為輸出線。4根行線和4根列線形成16個相交點(diǎn)。 (1)檢測當(dāng)前是否有鍵被按下。檢測的方法是P3.4-P3.7輸出全“0”,讀取P3.0-P3.3的狀態(tài),若P3.0-P3.3為全“1”,則無鍵閉合,否則有鍵閉合。 (2)去除鍵抖動。當(dāng)檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。 (3)若有鍵被按下,應(yīng)識別出是哪一個鍵閉合。方法是對鍵盤的行線進(jìn)行掃描。P3.4-P3.7按下述4種組合依次輸出如表 4.1所示。 表4.1 鍵盤掃描
(4)在每組行輸出時讀取P3.0-P3.3,若全為“1”,則表示為“0”這一行沒有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計(jì)算法或查表法將閉合鍵的行值和列值轉(zhuǎn)換成所定義的鍵值。鍵盤掃描主要代碼如下: uchar GetKey () { uchar i, j, k = 0; uchar KeyScanCode [] = {0xEF, 0xDF, 0xBF, 0x7F}; //鍵盤掃描碼 uchar KeyCodeTable[] ={0xEE,0xED,0xEB,0xDE,0xDD,0xDB, 0xBE,0xBD,0xBB,0x7E,0x7D,0x7B}; //鍵盤特征碼 P3 = 0x0F;//掃描鍵盤獲取按鍵序號 if (P3! = 0x0F) DelayMS(20);//延時去機(jī)械抖動 if (P3! = 0x0F) { for (i = 0; i< 4;i++) { P3 = KeyScanCode; for (j = 0;j < 3;j++) { k = i * 3 + j; if (P3 == KeyCodeTable[k]) return k;} } } else return 0xFF; } //-------------------------------------------------------------------- 4.2.2 LCD顯示模塊設(shè)計(jì)LCD LM016L的顯示函數(shù)很簡單,只要按照時序圖操作,結(jié)合相關(guān)指令集,寫好LCD初始化程序,清屏程序,寫指令程序,寫數(shù)據(jù)程序,讀數(shù)據(jù)程序等一系列驅(qū)動程序,可完成LCD的所有顯示需要。在本設(shè)計(jì)中,由于要顯示的內(nèi)容比較多,且有些需重復(fù)顯示,有些只要顯示一次,故只畫液晶顯示的基本流程。 LCD顯示模塊流程如圖4.4所示,其源代碼見附件1。
圖4.4 LCD顯示模塊流程圖 5 系統(tǒng)仿真與調(diào)試5.1系統(tǒng)運(yùn)行環(huán)境 (1)本系統(tǒng)的硬件電路是在Proteus電路仿真軟件上運(yùn)行的。 (2)本系統(tǒng)的軟件是在 Keil uVision3 上編譯運(yùn)行的。 (3)通過Proteus與Keil連調(diào)實(shí)現(xiàn)電路仿真。 5.2 系統(tǒng)仿真說明5.2.1 KEILC調(diào)試打開Keil新建工程文件,然后添加源程序文件,保存時把文件后綴名改成“.c”,再直接導(dǎo)入新建的工程中。 把源程序全部錄入后,先粗略的檢查一遍,主要改正明顯的各種錯誤,這樣可以減少之后的修改工作量。接著Options for Target “Target 1” ,點(diǎn)擊Output ,勾選Create Hex 那個選項(xiàng),一邊生成可執(zhí)行的文件。然后點(diǎn)擊Project菜單下的Built Target命令然后再進(jìn)行編譯、連接,形成目標(biāo)文件。編譯、連接用Project菜單下的Built Target命令(或快捷鍵F7),也可以直接點(diǎn)擊工具欄中相對應(yīng)的圖標(biāo)。. 編譯、連接時,如果程序存在語法有錯,則不會通過編譯,并在下面的信息窗口給出相應(yīng)的出錯提示信息,其中錯誤是一定得改正的,警告可以忽略。雙擊下面顯示錯誤信息的那一行,可以直接定位錯誤所在的行,用戶可以方便的對程序進(jìn)行修改。修改后再編譯、連接,繼續(xù)進(jìn)行調(diào)試,這個過程可能會重復(fù)多次。如果沒有任何語法上的錯誤,則編譯、連接成功,并且信息窗口給出提示信息。 5.2.2 Proteus調(diào)試在Proteus軟件中先從元件庫中加載要使用的那些元件,然后把元件放在圖紙上一個一個的接線,盡量不讓線交錯,便于查看、分析,有必要時,使用接線標(biāo)號法,完成所有元器件的接線。 5.2.3 Proteus與Keilc聯(lián)調(diào)實(shí)現(xiàn)電路仿真在Proteus中雙擊AT89C51,在彈出的窗口中Program File后面選擇在Keil中生成的以“.hex”為后綴名的文件,為單片機(jī)添加可執(zhí)行文件。然后點(diǎn)擊左下角的相關(guān)圖標(biāo),開始進(jìn)行仿真。 仿真運(yùn)行結(jié)果如下圖5.1所示。
圖5.1 電路仿真圖
總 結(jié)隨著IT行業(yè)的不斷發(fā)展,傳統(tǒng)的固定電話已漸漸不能滿足人們?nèi)粘5耐ㄐ判枨,而更智能、更人性化、微小型、多元化的電子產(chǎn)品成為了現(xiàn)代化電子產(chǎn)業(yè)的主要發(fā)展方向。本系統(tǒng)就是基于這樣一個背景下開始設(shè)計(jì)的。系統(tǒng)以AT89C51芯片作為主控模塊,鍵盤作為輸入電路模塊,1602LCD作為顯示電路模塊,實(shí)現(xiàn)了以下功能如下: (1)系統(tǒng)運(yùn)行時將所按下的鍵盤顯示在液晶屏上; (2)電話號碼鍵盤上的“*”鍵能夠?qū)崿F(xiàn)退格功能; (3)電話號碼鍵盤上的“#”鍵能夠?qū)崿F(xiàn)清除功能; (4)每按下一個鍵盤能夠發(fā)出聲音; 通過此次設(shè)計(jì)本人在各方面有了一定的提高。 首先,通過這次設(shè)計(jì),我不僅對理論有了更深一步的認(rèn)識,增強(qiáng)了和外界技術(shù)的溝通,還培養(yǎng)了自學(xué)能力和分析解決問題的能力,更重要的是,培養(yǎng)了克服困難的勇氣和信心。 其次,培養(yǎng)了自己的市場觀念。一個商品是否能夠搶占市場,除了必須的功能和質(zhì)量要求外,其價(jià)格是最大的競爭優(yōu)勢。如何在保證質(zhì)量和完成同等功能的情況下,把產(chǎn)品的成本降到最低。是每個設(shè)計(jì)人員在作出方案時首要考慮的因素。 此次設(shè)計(jì)不僅鍛煉了我們理論和實(shí)踐相結(jié)合的綜合能力,還使得我對專業(yè)有了更深一步的了解,鞏固了我們所學(xué)的專業(yè)基礎(chǔ)知識,提高了我們解決實(shí)際工程問題的能力,同時也提高我們查閱文獻(xiàn)資料、設(shè)計(jì)手冊、設(shè)計(jì)規(guī)范的動手能力,通過對整體的掌控,對局部的取舍,以及對細(xì)節(jié)的斟酌處理,都使我的能力得到了鍛煉,經(jīng)驗(yàn)得到了豐富,并且意志力,抗壓能力也都得到了不同程度的提升。這正是我們進(jìn)行設(shè)計(jì)的目的所在。 “團(tuán)結(jié)、合作、謙虛”這三個詞我的體會也比較深。做任何事包括做實(shí)驗(yàn)都不是孤立的,不是你“閉門造車”,而是一個需要和他人交往的過程。這就要求我們要團(tuán)結(jié),要有合作精神,要注意和他人的溝通,要謙虛,不懂就問所謂“知之為知之,不知為不知”。 總之,在整個實(shí)驗(yàn)操作和文檔完成的過程中,我體會到的是實(shí)驗(yàn)的艱辛和收獲的充實(shí),感受到的是一種堅(jiān)持不懈、契而不舍的科研精神。對我以后的深造學(xué)習(xí)有重要的意義。
致 謝設(shè)計(jì)即將完成之際,我特別想借此機(jī)會感謝一下賈老師。賈老師在百忙之中抽出時間,從方案的論證、資料的查閱、電路的設(shè)計(jì)、調(diào)試、文檔的撰寫、修改,都進(jìn)行了一絲不茍的指導(dǎo)和嚴(yán)格的要求,她的悉心指導(dǎo)是我設(shè)計(jì)能如期完成的重要因素,在此我衷心的感謝賈老師給我提供的大量指導(dǎo)與幫助。 同時,在此我也非常感謝小組同學(xué)給我提供幫助。在設(shè)計(jì)過程中,我遇到的問題有很多,在編程上給了我很多指導(dǎo),在他們的幫助下我才能完成整體程序的編制。可以說,本設(shè)計(jì)的順利完成,他們對我的幫助是不可忽視的。在此,我要向他們表示由衷的感謝。 最后,感謝學(xué)校三年來對我的培養(yǎng)與教育,感謝學(xué)院各級領(lǐng)導(dǎo)及相關(guān)老師對我三年來成長的關(guān)心與本設(shè)計(jì)的指導(dǎo)。感謝所有在我完成本設(shè)計(jì)過程中給予我?guī)椭耐瑢W(xué)和朋友。也祝愿大家身體健康,工作順利,合家歡樂,萬事如意!
參考文獻(xiàn)[1] 李朝青編著,單片機(jī)原理及接口技術(shù).北京:北京航空航天大學(xué)出版社,2006. [3] 張毅剛編著,單片機(jī)原理極其應(yīng)用.哈爾濱:哈爾濱工業(yè)大學(xué)出版社,2004. [4] 趙建領(lǐng)編著,51系列單片機(jī)開發(fā)寶典.電子工業(yè)出版社,2007. [5] 潘永雄編著,新編單片機(jī)原理與應(yīng)用.西安電子科技大學(xué)出版社,2003. [6] 李國興、李偉編著,單片機(jī)開發(fā)應(yīng)用技術(shù).北京大學(xué)出版社,2007. [7] 劉瑞新編著,單片機(jī)原理及應(yīng)用教程.機(jī)械工業(yè)出版社,2003. [8] 譚浩強(qiáng)編著,C程序設(shè)計(jì)(第二版) [M]. 北京: 清華大學(xué)出版社, 1999.12. [9]楊居義編著,單片機(jī)設(shè)計(jì)實(shí)例教程.清華大學(xué)出版社,2010.8. [10] 趙又新著,微機(jī)原理與接口技術(shù).中國電力出版社,2007. [11] 韓曉東、李勇江等著,Protel 99 SE電路設(shè)計(jì)實(shí)用教程. 中國鐵道出版社,2008. [12] 胡漢才,單片機(jī)原理及其接口技術(shù).清華大學(xué)出版社,2010. [13] 陳忠平編著,51單片機(jī)C語言程序設(shè)計(jì)經(jīng)典實(shí)例. 電子工業(yè)出版社,2012.
程序代碼:
- //-------------------------------------------------------------------
- // 名稱:1602顯示電話撥號鍵盤按鍵
- // 說明: 本例將電話撥號鍵盤上所撥號碼顯示在1602液晶屏上。
- //--------------------------------------------------------------------
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define DelayNOPx() {_nop_();_nop_();_nop_();_nop_();}
- sbit BEEP = P1^0;
- sbit RS = P2^0;
- sbit RW = P2^1;
- sbit E = P2^2;
- void DelayMS (uint ms); //聲明延時函數(shù)
- bit LCD_Busy ();
- void LCD_Pos (uchar);
- void LCD_Wcmd (uchar);
- void LCD_Wdat (uchar);
- //--------------------------------------------------------------------
- // 標(biāo)題字符串
- char code Title_Text[] = {"-- Phone Code --"};
- // 鍵盤序號與鍵盤符號映射表
- uchar code Key_Table[]={'1','2','3','4','5','6','7','8','9','*','0','#'};
- // 鍵盤撥號數(shù)字緩沖
- uchar Dial_Code_Str[] = {" "};
- uchar KeyNo = 0xFF;
- int tCount = 0;
- //-------------------------------------------------------------------
- // 延時
- //-------------------------------------------------------------------
- void DelayMS (uint x)
- {
- uchar i;
- while(x--) for (i = 0;i < 120; i++);
- }
- //------------------------------------------------------------------
- // 在LCD指定鍵盤上顯示字符串
- //-------------------------------------------------------------------
- void Display_String(uchar * str,uchar LineNo)
- {
- uchar k;
- LCD_Pos(LineNo);
- for (k = 0; k< 16; k++) LCD_Wdat (str[k]);
- }
- //--------------------------------------------------------------------
- // LCD狀態(tài)檢測
- //--------------------------------------------------------------------
- bit LCD_Busy ()
- {
- bit result;
- RS =0;RW =1;E=1;DelayNOPx();result = (bit)(P0 & 0x80); E= 0;
- return result;
- }
- //--------------------------------------------------------------------
- // 寫LCD命令
- //--------------------------------------------------------------------
- void LCD_Wcmd (uchar cmd)
- {
- while (LCD_Busy ()); //判斷LCD是否忙碌
- RS=0;RW=0;E=0;_nop_();_nop_();
- P0=cmd;DelayNOPx();E=1;DelayNOPx();E=0;
- }
- //-------------------------------------------------------------------
- // 寫LCD數(shù)據(jù)
- //--------------------------------------------------------------------
- void LCD_Wdat (uchar str)
- {
- while (LCD_Busy ()); //判斷LCD是否忙碌
- RS =1;RW =0;E=0;
- P0=str; DelayNOPx ();
- E=1;DelayNOPx();E=0;
- }
- //--------------------------------------------------------------------
- // LCD初始化
- //--------------------------------------------------------------------
- void LCD_Init()
- {
- LCD_Wcmd(0x38);DelayMS(1);//設(shè)定LCD為16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
- LCD_Wcmd(0x0c);DelayMS(1);//開顯示,不顯示光標(biāo)
- LCD_Wcmd(0x06);DelayMS(1);//顯示光標(biāo),自動右移,整屏不要動
- LCD_Wcmd(0x01);DelayMS(1);//顯示清屏
- }
- //--------------------------------------------------------------------
- // 設(shè)置LCD顯示位置
- //--------------------------------------------------------------------
- void LCD_Pos (uchar pos)
- {
- LCD_Wcmd(pos | 0x80);
- }
- //--------------------------------------------------------------------
- // T0控制按鍵聲音
- //--------------------------------------------------------------------
- void T0_INT () interrupt 1
- {
- TH0 = -600 / 256;
- TL0 = -600 % 256;
- BEEP = ~BEEP;
- if (++tCount == 200)
- {
- tCount = 0; TR0 = 0;
- }
- }
- //--------------------------------------------------------------------
- // 鍵盤掃描
- //--------------------------------------------------------------------
- uchar GetKey ()
- {
- uchar i, j, k = 0;
- uchar KeyScanCode [] = {0xEF, 0xDF, 0xBF, 0x7F}; //鍵盤掃描碼
- uchar KeyCodeTable[] ={0xEE,0xED,0xEB,0xDE,0xDD,0xDB,
- 0xBE,0xBD,0xBB,0x7E,0x7D,0x7B}; //鍵盤特征碼
- P3 = 0x0F;//掃描鍵盤獲取按鍵序號
- if (P3!= 0x0F) DelayMS(20);//延時去機(jī)械抖動
- if (P3!= 0x0F)
- {
- for (i = 0; i< 4;i++)
- {
- P3 = KeyScanCode[i];
- for (j = 0;j < 3;j++)
- {
- k = i * 3 + j;
- if (P3 == KeyCodeTable[k]) return k;
- }
- }
- }
- else return 0xFF;
- }
- //--------------------------------------------------------------------
- // 主程序
- //--------------------------------------------------------------------
- void main()
- {
- uchar i = -1,j,a;
- P0 = P2 = P1 = 0xFF;
- IE = 0x82;
- TMOD = 0X01;//寄存器工作方式設(shè)定為模式1
- LCD_Init();//初始化LCD
- Display_String (Title_Text,0x00);//在第一行顯示標(biāo)題
- while(1)
- {
- KeyNo = GetKey();//獲取按鍵
- if (KeyNo ==0xFF) continue;//無按鍵時繼續(xù)掃描
- i++;
- if(KeyNo==9)
- { Dial_Code_Str[i-1]= ' ';i=i-2; } //按”*”鍵退格
- else
- { if (KeyNo==11)
- {for (a = 0;a< 16;a++) Dial_Code_Str[a] = ' '; i=-1;}//按鍵“#”鍵清空
- else if (i == 11)
- {for (j = 0;j < 16;j++) Dial_Code_Str[j] = ' ';i = 0;} //超過11位清空
- Dial_Code_Str[i] = Key_Table [KeyNo]; }
- Display_String (Dial_Code_Str, 0x40); //在第二行顯示號碼
- TR0 = 1;//T0中斷控制按鍵聲音
- while(GetKey()!=0xFF);//等待釋放
-
- }
- }
復(fù)制代碼
以上圖文的Word格式文檔下載(內(nèi)容和本網(wǎng)頁上的一模一樣,方便大家保存):
基于單片機(jī)的電話撥號系統(tǒng)的設(shè)計(jì).doc
(568.5 KB, 下載次數(shù): 325)
2017-6-5 18:29 上傳
點(diǎn)擊文件名下載附件
單片機(jī)模擬電話撥號文檔
|