《單片機(jī)原理與應(yīng)用》課程設(shè)計(jì)萬(wàn)年歷和鬧鐘的設(shè)計(jì)
《《單片機(jī)原理與應(yīng)用》課程設(shè)計(jì)萬(wàn)年歷和鬧鐘的設(shè)計(jì)》由會(huì)員分享,可在線閱讀,更多相關(guān)《《單片機(jī)原理與應(yīng)用》課程設(shè)計(jì)萬(wàn)年歷和鬧鐘的設(shè)計(jì)(31頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、武漢理工大學(xué)《單片機(jī)原理與應(yīng)用》課程設(shè)計(jì)說(shuō)明書 1 相關(guān)軟件介紹 1.1 keil軟件的介紹 Keil C51是美國(guó)Keil Software公司出品的51系列兼容單片機(jī)C語(yǔ)言軟件開發(fā)系統(tǒng),與匯編相比,C語(yǔ)言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢(shì),因而易學(xué)易用。Keil提供了包括C編譯器、宏匯編、連接器、庫(kù)管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過(guò)一個(gè)集成開發(fā)環(huán)境(uVision)將這些部分組合在一起。運(yùn)行Keil軟件需要WIN98、NT、WIN2000、WINXP等操作系統(tǒng)。如果你使用C語(yǔ)言編程,那么Keil幾乎就是你的不二之選,即使不使用C語(yǔ)言而僅
2、用匯編語(yǔ)言編程,其方便易用的集成環(huán)境、強(qiáng)大的軟件仿真調(diào)試工具也會(huì)令你事半功倍。 1.1.1 Keil C51開發(fā)系統(tǒng)基本知識(shí) 1.系統(tǒng)概述:Keil C51軟件提供豐富的庫(kù)函數(shù)和功能強(qiáng)大的集成開發(fā)調(diào)試工具,全windows界面。另外重要的一點(diǎn),只要看一下編譯后生成的匯編代碼,就能體會(huì)到Keil C51生成的目標(biāo)代碼效率非常之高,多數(shù)語(yǔ)句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時(shí)更能體現(xiàn)高級(jí)語(yǔ)言的優(yōu)勢(shì)。 2.Keil C51單片機(jī)軟件開發(fā)系統(tǒng)的整體結(jié)構(gòu):C51工具包的整體結(jié)構(gòu),uVision與Ishell分別是C51 for Windows和for Dos的集成開發(fā)環(huán)
3、境(IDE),可以完成編輯、編譯、連接、調(diào)試、仿真等整個(gè)開發(fā)流程。開發(fā)人員可用IDE本身或其它編輯器編輯C或匯編源文件。然后分別由C51及C51編譯器編譯生成目標(biāo)文件(.OBJ)。目標(biāo)文件可由LIB51創(chuàng)建生成庫(kù)文件,也可以與庫(kù)文件一起經(jīng)L51連接定位生成絕對(duì)目標(biāo)文件(.ABS)。ABS文件由OH51轉(zhuǎn)換成標(biāo)準(zhǔn)的Hex文件,以供調(diào)試器dScope51或tScope51使用進(jìn)行源代碼級(jí)調(diào)試,也可由仿真器使用直接對(duì)目標(biāo)板進(jìn)行調(diào)試,也可以直接寫入程序存貯器如EPROM中。 3.使用獨(dú)立的Keil仿真器時(shí)注意事項(xiàng):(1)仿真器標(biāo)配11.0592MHz的晶振,但用戶可以在仿真器上的晶振插孔中換插
4、其他頻率的晶振。(2)仿真器上的復(fù)位按鈕只復(fù)位仿真芯片,不復(fù)位目標(biāo)系統(tǒng)。(3)仿真芯片的31腳(/EA)已接至高電平,所以仿真時(shí)只能使用片內(nèi)ROM,不能使用片外ROM;但仿真器外引插針中的31腳并不與仿真芯片的31腳相連,故該仿真器仍可插入到擴(kuò)展有外部ROM(其CPU的/EA引腳接至低電平)的目標(biāo)系統(tǒng)中使用。 1.1.2 keil軟件的優(yōu)點(diǎn) 1. Keil C51生成的目標(biāo)代碼效率非常之高,多數(shù)語(yǔ)句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時(shí)更能體現(xiàn)高級(jí)語(yǔ)言的優(yōu)勢(shì)。 2.與匯編相比,C語(yǔ)言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢(shì),因而易學(xué)易用。用過(guò)匯編語(yǔ)言后再使
5、用C來(lái)開發(fā),體會(huì)更加深刻。 Keil C51軟件提供豐富的庫(kù)函數(shù)和功能強(qiáng)大的集成開發(fā)調(diào)試工具,全Windows界面。 1.2 protues軟件的介紹 Proteus軟件是英國(guó)Labcenter electronics公司出版的EDA工具軟件(該軟件中國(guó)總代理為廣州風(fēng)標(biāo)電子技術(shù)有限公司)。它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機(jī)及外圍器件。它是目前最好的仿真單片機(jī)及外圍器件的工具。雖然目前國(guó)內(nèi)推廣剛起步,但已受到單片機(jī)愛(ài)好者、從事單片機(jī)教學(xué)的教師、致力于單片機(jī)開發(fā)應(yīng)用的科技工作者的青睞。Proteus是世界上著名的EDA工具(仿真軟件),從原理圖布圖、代碼調(diào)試到單
6、片機(jī)與外圍電路協(xié)同仿真,一鍵切換到PCB設(shè)計(jì),真正實(shí)現(xiàn)了從概念到產(chǎn)品的完整設(shè)計(jì)。是目前世界上唯一將電路仿真軟件、PCB設(shè)計(jì)軟件和虛擬模型仿真軟件三合一的設(shè)計(jì)平臺(tái),其處理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列處理器,并持續(xù)增加其他系列處理器模型。在編譯方面,它也支持IAR、Keil和MPLAB等多種編譯器。 1.2.1 proteus功能特點(diǎn) Proteus軟件具有其它EDA工具軟件(例:multisim)的功能。這些功能是: 原理布圖 ;PCB自動(dòng)
7、或人工布線;SPICE電路仿真。其革命性的特點(diǎn)有:互動(dòng)的電路仿真;用戶可以實(shí)時(shí)采用諸如RAM,ROM,鍵盤,馬達(dá),LED,LCD,AD/DA,部分SPI器件,部分IIC器件??梢苑抡?1系列、AVR、PIC、ARM、等常用主流單片機(jī)。還可以直接在基于原理圖的虛擬原型上編程,再配合顯示及輸出,能看到運(yùn)行后輸入輸出的效果。配合系統(tǒng)配置的虛擬邏輯分析儀、示波器等,Proteus建立了完備的電子設(shè)計(jì)開發(fā)環(huán)境。 1.2.2 proteus功能模塊 1.智能原理圖設(shè)計(jì)(ISIS):(1)有豐富的器件庫(kù):超過(guò)27000種元器件,可方便地創(chuàng)建新元件;(2)智能的器件搜索:通過(guò)模糊搜索可以快速定位所需要的器
8、件;(3)智能化的連線功能:自動(dòng)連線功能使連接導(dǎo)線簡(jiǎn)單快捷,大大縮短繪圖時(shí)間;(4)支持總線結(jié)構(gòu):使用總線器件和總線布線使電路設(shè)計(jì)簡(jiǎn)明清晰; 可輸出高質(zhì)量圖紙:通過(guò)個(gè)性化設(shè)置,可以生成印刷質(zhì)量的BMP圖紙,可以方便地供WORD、POWERPOINT等多種文檔使用。 2.完善的電路仿真功能(Prospice)(1)ProSPICE混合仿真:基于工業(yè)標(biāo)準(zhǔn)SPICE3F5,實(shí)現(xiàn)數(shù)字/模擬電路的混合仿真;(2)超過(guò)27000個(gè)仿真器件:可以通過(guò)內(nèi)部原型或使用廠家的SPICE文件自行設(shè)計(jì)仿真器件,Labcenter也在不斷地發(fā)布新的仿真器件,還可導(dǎo)入第三方發(fā)布的仿真器件;(3)多樣的激勵(lì)源:包括
9、直流、正弦、脈沖、分段線性脈沖、音頻(使用wav文件)、指數(shù)信號(hào)、單頻FM、數(shù)字時(shí)鐘和碼流,還支持文件形式的信號(hào)輸入;(4)豐富的虛擬儀器:13種虛擬儀器,面板操作逼真,如示波器、邏輯分析儀、信號(hào)發(fā)生器、直流電壓/電流表、交流電壓/電流表、數(shù)字圖案發(fā)生器、頻率計(jì)/計(jì)數(shù)器、邏輯探頭、虛擬終端、SPI調(diào)試器、I2C調(diào)試器等;(5)生動(dòng)的仿真顯示:用色點(diǎn)顯示引腳的數(shù)字電平,導(dǎo)線以不同顏色表示其對(duì)地電壓大小,結(jié)合動(dòng)態(tài)器件(如電機(jī)、顯示器件、按鈕)的使用可以使仿真更加直觀、生動(dòng);(6)高級(jí)圖形仿真功能(ASF):基于圖標(biāo)的分析可以精確分析電路的多項(xiàng)指標(biāo),包括工作點(diǎn)、瞬態(tài)特性、頻率特性、傳輸特性、噪聲、失
10、真、傅里葉頻譜分析等,還可以進(jìn)行一致性分析。 3.獨(dú)特的單片機(jī)協(xié)同仿真功能(VSM):(1)支持主流的CPU類型:如ARM7、8051/52、AVR、PIC10/12、PIC16、PIC18、PIC24、dsPIC33、HC11、BasicStamp、8086、MSP430等,CPU類型隨著版本升級(jí)還在繼續(xù)增加,如即將支持CORTEX、DSP處理器;(2)支持通用外設(shè)模型:如字符LCD模塊、圖形LCD模塊、LED點(diǎn)陣、LED七段顯示模塊、鍵盤/按鍵、直流/步進(jìn)/伺服電機(jī)、RS232虛擬終端、電子溫度計(jì)等等,其COMPIM(COM口物理
11、接口模型)還可以使仿真電路通過(guò)PC機(jī)串口和外部電路實(shí)現(xiàn)雙向異步串行通信;(4)實(shí)時(shí)仿真:支持UART/USART/EUSARTs仿真、中斷仿真、SPI/I2C仿真、MSSP仿真、PSP仿真、RTC仿真、ADC仿真、CCP/ECCP仿真;(5)編譯及調(diào)試:支持單片機(jī)匯編語(yǔ)言的編輯/編譯/源碼級(jí)仿真,內(nèi)帶8051、AVR、PIC的匯編編譯器,也可以與第三方集成編譯環(huán)境(如IAR、Keil和Hitech)結(jié)合,進(jìn)行高級(jí)語(yǔ)言源碼級(jí)仿真和調(diào)試。 4.實(shí)用的PCB設(shè)計(jì)平臺(tái):(1)原理圖到PCB的快速通道: 原理圖設(shè)計(jì)完成后,一鍵便可進(jìn)入ARES的PCB設(shè)計(jì)環(huán)境,實(shí)現(xiàn)從概念到產(chǎn)品的完整設(shè)計(jì); ?。?
12、)先進(jìn)的自動(dòng)布局/布線功能:支持器件的自動(dòng)/人工布局;支持無(wú)網(wǎng)絡(luò)自動(dòng)布線或人工布線;支持引腳交換/門交換功能使PCB設(shè)計(jì)更為合理;(3)完整的PCB設(shè)計(jì)功能:最多可設(shè)計(jì)16個(gè)銅箔層,2個(gè)絲印層,4個(gè)機(jī)械層(含板邊),靈活的布線策略供用戶設(shè)置,自動(dòng)設(shè)計(jì)規(guī)則檢查,3D 可視化預(yù)覽;(4)多種輸出格式的支持:可以輸出多種格式文件,包括Gerber文件的導(dǎo)入或?qū)С?,便利與其它PCB設(shè)計(jì)工具的互轉(zhuǎn)(如protel)和PCB板的設(shè)計(jì)和加工。 1.3 STC_ISP簡(jiǎn)介 STC-ISP 是一款單片機(jī)下載編程燒錄軟件,是針對(duì)STC系列單片機(jī)而設(shè)計(jì)的,可下載STC89系列、12C2052 系列和12
13、C5410等系列的STC單片機(jī),使用簡(jiǎn)便,現(xiàn)已被廣泛使用。 操作說(shuō)明如下: (1) 打開STC-ISP,如下圖界面,在MCUType欄目下選中單片機(jī),如STC89C52RC;(2) 根據(jù)您的9針數(shù)據(jù)線連接情況選中COM端口,波特率一般保持默認(rèn),如果遇到下載問(wèn)題,可以適當(dāng)下調(diào)一些; (3) 先確認(rèn)硬件連接正確,按如圖點(diǎn)擊“打開文件”并在對(duì)話框內(nèi)找到您要下載的HEX文件: (4) 按下圖選中兩個(gè)條件項(xiàng),這樣可以使您在每次編譯KEIL時(shí)HEX代碼能自動(dòng)加載到STC-ISP,點(diǎn)擊“Download/下載”: (5) 手動(dòng)按下電源開關(guān)便即可把可執(zhí)行文件HEX寫入到單片機(jī)內(nèi); (6) 程
14、序?qū)懭胪戤?,目?biāo)板開始運(yùn)行程序結(jié)果。 圖1.1 STC-ISP界面圖 2 相關(guān)芯片介紹 2.1 STC89C52介紹 STC89C52是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程Flash 存儲(chǔ)器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 具有以下標(biāo)準(zhǔn)功能: 8k字節(jié)Flash,512字節(jié)RAM, 32 位I/O 口線,看門狗定
15、時(shí)器,內(nèi)置4KB EEPROM,MAX810復(fù)位電路,三個(gè)16 位 定時(shí)器/計(jì)數(shù)器,一個(gè)6向量2級(jí)中斷結(jié)構(gòu),全雙工串行口。另外 STC89X52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU 停止工作,允許RAM、定時(shí)器/計(jì)數(shù)器、串口、中斷繼續(xù)工作。掉電保護(hù)方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機(jī)一切工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。最高運(yùn)作頻率35Mhz,6T/12T可選。 特性如下:8K字節(jié)程序存儲(chǔ)空間;512字節(jié)數(shù)據(jù)存儲(chǔ)空間;內(nèi)帶4K字節(jié)EEPROM存儲(chǔ)空間;可直接使用串口下載。 參數(shù)如下:(1)增強(qiáng)型8051 單片機(jī),6 時(shí)鐘/機(jī)器周期和
16、12 時(shí)鐘/機(jī)器周期可以任意 選擇,指令代碼完全兼容傳統(tǒng)8051。(2)工作電壓:5.5V~3.3V(5V 單片機(jī))/3.8V~2.0V(3V 單片機(jī))。(3)工作頻率范圍:0~40MHz,相當(dāng)于普通8051 的0~80MHz,實(shí)際工作 頻率可達(dá)48MHz 。(4)用戶應(yīng)用程序空間為8K 字節(jié)。(5)片上集成512 字節(jié)RAM(6)通用I/O 口(32 個(gè)),復(fù)位后為:P1/P2/P3/P4 是準(zhǔn)雙向口/弱上拉, P0 口是漏極開路輸出,作為總線擴(kuò)展用時(shí),不用加上拉電阻,作為 I/O 口用時(shí),需加上拉電阻。 (7)ISP(在系統(tǒng)可編程)/IAP(在應(yīng)用可編程),無(wú)需專用編程器,無(wú) 需專用仿
17、真器,可通過(guò)串口(RxD/P3.0,TxD/P3.1)直接下載用戶程 序,數(shù)秒即可完成一片。(8)具有EEPROM 功能。(9)具有看門狗功能。(10)共3 個(gè)16 位定時(shí)器/計(jì)數(shù)器。即定時(shí)器T0、T1、T2。(11)外部中斷4 路,下降沿中斷或低電平觸發(fā)電路,Power Down 模式可 由外部中斷低電平觸發(fā)中斷方式喚醒。(12)通用異步串行口(UART),還可用定時(shí)器軟件實(shí)現(xiàn)多個(gè)UAR。(13)工作溫度范圍:-40~+85℃(工業(yè)級(jí))/0~75℃(商業(yè)級(jí))。(14)PDIP 封裝。 圖2.1 STC89C52引腳 2.2 DS12C887芯片介紹
18、 DS12C887實(shí)時(shí)時(shí)鐘芯片功能豐富,可以用來(lái)直接代替IBM PC上的時(shí)鐘日歷芯片DS12887,同時(shí),它的管腳也和MC146818B、DS12887相兼容。由于DS12C887能夠自動(dòng)產(chǎn)生世紀(jì)、年、月、日、時(shí)、分、秒等時(shí)間信息,其內(nèi)部又增加了世紀(jì)寄存器,從而利用硬件電路解決子“千年”問(wèn)題; DS12C887中自帶有鋰電池,外部掉電時(shí),其內(nèi)部時(shí)間信息還能夠保持10年之久;對(duì)于一天內(nèi)的時(shí)間記錄,有12小時(shí)制和24小時(shí)制兩種模式。在12小時(shí)制模式中,用AM和PM區(qū)分上午和下午;時(shí)間的表示方法也有兩種,一種用二進(jìn)制數(shù)表示,一種是用BCD碼表示;DS12C887中帶有128字節(jié) RAM,其中有
19、11字節(jié)RAM用來(lái)存儲(chǔ)時(shí)間信息,4字節(jié)RAM用來(lái)存儲(chǔ)DS12C887的控制信息,稱為控制寄存器,113字節(jié)通用RAM使用戶使用;此外用戶還可對(duì)DS12C887進(jìn)行編程以實(shí)現(xiàn)多種方波輸出,并可對(duì)其內(nèi)部的三路中斷通過(guò)軟件進(jìn)行屏蔽。 2.2.1 DS12C887時(shí)鐘芯片各寄存器 各寄存器定義如下表所示: 表2.1 DS12C887各寄存器定義表 (1) 控制寄存器A:UIP--更新位,用來(lái)表示芯片是否即將進(jìn)行更新。當(dāng)UIP=1時(shí),更新即將開始;當(dāng)UIP=0時(shí),表示至少在244us內(nèi)芯片不會(huì)更新,此時(shí),時(shí)鐘、日歷和鬧鐘信息可以通過(guò)讀/寫相應(yīng)的字節(jié)獲得并設(shè)置。
20、UIP位為只讀位并且不受復(fù)位信號(hào)的影響。通過(guò)把寄存器B中的SET位設(shè)置為1,可以禁止更新并將UIP位清零。DV2,DV1,DV0--這三位用來(lái)開/關(guān)晶體振蕩器和復(fù)位分頻器。當(dāng)[DV0 DV1 DV2]=[010]時(shí),晶體振蕩器開啟且保持時(shí)鐘運(yùn)行。 (2)控制寄存器B:SET--SET=0,芯片更新正常進(jìn)行;SET--1,芯片更新被禁止。PIE--PIE=0,禁止周期中斷輸出到中斷請(qǐng)求輸出位;PIE=1,允許周期中斷輸出到中斷請(qǐng)求輸出位。DM--DM=0,設(shè)置寄存器存儲(chǔ)數(shù)據(jù)格式為BCD碼格式;DMI=1,設(shè)置寄存器存儲(chǔ)數(shù)據(jù)格式為二進(jìn)制數(shù)據(jù)格式,此位不受復(fù)位信號(hào)影響。24/12--為1,24小時(shí)
21、制;為0,12小時(shí)制。 (3) 控制寄存器C:IRQF--中斷請(qǐng)求標(biāo)志。 (4) 控制寄存器D:VRT--VRT=0,表示內(nèi)置電池能量耗盡,此時(shí)RAM中數(shù)據(jù)的正確性就不能保證了。 2.2.2 時(shí)序圖分析 Mototola和Intel模式總線讀/寫如下圖所示: 圖2.2 Motolola模式總線讀/寫時(shí)序圖 圖2.3 Intel模式總線讀時(shí)序圖 圖2.4 Intel模式總線寫時(shí)序圖 2.3 LCD1602 1602液晶也叫1602字符型液晶 它是一種專門用來(lái)顯示字
22、母、數(shù)字、符號(hào) 等的點(diǎn)陣型液晶模塊 它有若干個(gè)5X7或者5X11等點(diǎn)陣字符位組成,每個(gè)點(diǎn)陣字符位都可以顯示一個(gè)字符。每位之間有一個(gè)點(diǎn)距的間隔 每行之間也有也有間隔 起到了字符間距和行間距的作用,正因?yàn)槿绱?所以他不能顯示圖形(用自定義CGRAM,顯示效果也不好)。1602LCD是指顯示的內(nèi)容為16X2,即可以顯示兩行,每行16個(gè)字符液晶模塊(顯示字符和數(shù)字)。 目前市面上字符液晶絕大多數(shù)是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780寫的控制程序可以很方便地應(yīng)用于市面上大部分的字符型液晶。 2.3.1 LCD1602特性 (1) +5V電壓,對(duì)比度可調(diào);
23、 (2) 內(nèi)含復(fù)位電路; (3) 提供各種控制命令,如:清屏、字符閃爍、光標(biāo)閃爍、顯示移位等多種功能; (4) 有80字節(jié)顯示數(shù)據(jù)存儲(chǔ)器DDRAM; (5) 內(nèi)建有160個(gè)5X7點(diǎn)陣的字型的字符發(fā)生器CGROM; (6) 8個(gè)可由用戶自定義的5X7的字符發(fā)生器CGRAM; (7)字符型LCD1602通常有14條引腳線或16條引腳線的LCD,多出來(lái)的2條線是背光電源線VCC(15腳)和地線GND(16腳),HD44780內(nèi)置了DDRAM(顯示數(shù)據(jù)存儲(chǔ)RAM)、CGROM(字符存儲(chǔ)ROM)和CGRAM(用戶自定義RAM)。DDRAM就是顯示數(shù)據(jù)RAM,用來(lái)寄存待顯示的字符代碼。共80個(gè)字
24、節(jié),其地址和屏幕的對(duì)應(yīng)關(guān)系如下表: 表2.2 DDRAM地址與顯示位置的對(duì)應(yīng)關(guān)系表 2.3.2 LCD1602主要指令介紹 OCH: 設(shè)置開顯示,不顯示光標(biāo); 06H: 寫一個(gè)字符后地址指針自動(dòng)加1; 01H:顯示清零,數(shù)據(jù)指針清零。 根據(jù)下面寫時(shí)序圖可知: 寫指令 輸入:RS=L, R/=L,D0-D7=指令碼,E=高脈沖 輸出:D0-D7=數(shù)據(jù) 寫數(shù)據(jù) 輸入:RS=H, R/=L,D0-D7=數(shù)據(jù),E=高脈沖 輸出:無(wú) 圖2.5 1602液晶寫操作時(shí)序圖 3 課程設(shè)計(jì)實(shí)現(xiàn) 3.1 程序編譯實(shí)現(xiàn) 應(yīng)該實(shí)
25、現(xiàn)的功能設(shè)置如下: (1) 在正常工作時(shí),LCD1602顯示以Hex中文件設(shè)置好的時(shí)間開始,不斷更新顯示時(shí)間,相當(dāng)于一個(gè)時(shí)鐘,在第二行以24進(jìn)制顯示時(shí)分秒的同時(shí),還會(huì)在第一行顯示年份、月份、日期以及星期,在秒顯示不斷跳動(dòng)的同時(shí),4個(gè)led燈循環(huán)閃。 (2)按下S1鍵可以對(duì)顯示進(jìn)行設(shè)置,按一下,表示設(shè)置秒,按兩下,表示設(shè)置分,如此一次設(shè)置時(shí),星期,日,月,年,直到按下第八次,退出設(shè)置。按S2鍵表示光標(biāo)位置的數(shù)字加,按S3鍵表示光標(biāo)位置的數(shù)字減。 (3)按下S4表示對(duì)鬧鐘時(shí)間的設(shè)置,然后按S1選擇對(duì)時(shí)分秒的設(shè)置,再按一下S4,退出鬧鐘的設(shè)置。在所有的設(shè)置過(guò)程中,led燈滅,表示設(shè)置。在鬧鐘響
26、的過(guò)程中,按四個(gè)鍵中的任意一個(gè),都可以讓鬧鐘停止響。如果沒(méi)有按鍵,則蜂鳴器“滴滴”響30下,就自動(dòng)停止鬧鐘響。
程序清單如下:
C程序代碼:
#include
27、 { rs=0; lcden=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } void write_data(uchar date) //寫液晶數(shù)據(jù)函數(shù) { rs=1; lcden=0; P0=date; delay(5); lcden=1; delay(5); lcden=0; } void init() //初始化函數(shù) { uchar num; EA=1; //打開總中斷 EX1=1; //開外部中斷1 IT1=1; //設(shè)置負(fù)跳變觸發(fā)中
28、斷 flag1=0; //變量初始化 t0_num=0; s1num=0; week=1; dula=0; //關(guān)數(shù)碼管顯示 wela=0; lcden=0; rd=0; //以下幾行在首次設(shè)置DS12C887時(shí)使用,以后不必再寫入 write_ds(0x0A,0x20); //打開振蕩器 write_ds(0x0B,0x26); //設(shè)置24小時(shí)模式,數(shù)據(jù)二進(jìn)制格式,開啟鬧鈴中斷 set_time(); //設(shè)置上電默認(rèn)時(shí)間 // ................................ write_com(0x
29、38); //1602液晶初始化 write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); for(num=0;num<15;num++) //寫入液晶固定部分顯示 { write_data(table[num]); delay(5); } write_com(0x80+0x40); for(num=0;num<11;num++) { write_data(table1[num]); delay(5); } } vo
30、id write_sfm(uchar add,uchar date) //1602液晶刷新時(shí)分秒函數(shù),add為4時(shí)表示時(shí),為7時(shí)表示分,為10時(shí)表示秒 { char shi,ge; shi=date/10; ge=date%10; write_com(0x80+0x40+add); write_data(0x30+shi); write_data(0x30+ge); } void write_nyr(uchar add,char date) //1602液晶刷新年月日函數(shù),add為3時(shí)表示年,為6時(shí)表示月,為9時(shí)表示日 { char shi,
31、ge; shi=date/10; ge=date%10; write_com(0x80+add); write_data(0x30+shi); write_data(0x30+ge); } void write_week(char we) //1602液晶寫星期顯示函數(shù) { write_com(0x80+12); switch(we) { case 1: write_data(M);delay(5); write_data(O);delay(5); write_data(N);
32、 break; case 2: write_data(T);delay(5); write_data(U);delay(5); write_data(E); break; case 3: write_data(W);delay(5); write_data(E);delay(5); write_data(D); break; case 4: write_data(T);delay(5); write_da
33、ta(H);delay(5); write_data(U); break; case 5: write_data(F);delay(5); write_data(R);delay(5); write_data(T); break; case 6: write_data(S);delay(5); write_data(A);delay(5); write_data(T); break; case 7: write_
34、data(S);delay(5); write_data(U);delay(5); write_data(N); break; } } void keyscan() { if(flag_ri==1) { if((s1==0)||(s2==0)||(s3==0)||(s4==0)) //這里用來(lái)取消鬧鐘報(bào)警,按任意一鍵取消報(bào)警 { delay(5); if((s1==0)||(s2==0)||(s3==0)||(s4==0)) { wh
35、ile(!(s1&&s2&&s3&&s4)); di(); flag_ri=0; //清除報(bào)警標(biāo)志 } } else { if(t0_num==30) { flag_ri=0; t0_num=0; } } } if(s1==0) //檢測(cè)s1 { delay(5); if(s1==0) { s1num++; //記錄按下的次
36、數(shù) if(flag1==1) { if(s1num==4) s1num=1; } flag=1; while(!s1); di(); switch(s1num) //光標(biāo)閃爍定位 { case 1: write_com(0x80+0x40+10); write_com(0x0f); break; case 2: write_com(0x80+0x40
37、+7); break; case 3: write_com(0x80+0x40+4); break; case 4: write_com(0x80+12); break; case 5: write_com(0x80+9); break; case 6: write_com(0x80+6); break; case 7: write_com(0x80+3); break
38、; case 8: s1num=0; write_com(0x0c); flag=0; write_ds(0,miao); write_ds(2,fen); write_ds(4,shi); write_ds(6,week); write_ds(7,day); write_ds(8,month); write_ds(9,year); break; } } } if(s
39、1num!=0) //只有當(dāng)s1按下后,才檢測(cè)s2和s3 { if(s2==0) { delay(1); if(s2==0) { while(!s2); di(); switch(s1num) //根據(jù)功能鍵次數(shù)調(diào)節(jié)響應(yīng)數(shù)值 { case 1: miao++; if(miao==60) miao=0; write_sfm(10,miao);
40、 write_com(0x80+0x40+10); break; case 2: fen++; if(fen==60) fen=0; write_sfm(7,fen); write_com(0x80+0x40+7); break; case 3: shi++; if(shi==24)
41、 shi=0; write_sfm(4,shi); write_com(0x80+0x40+4); break; case 4: week++; if(week==8) week=1; write_week(week); write_com(0x80+12); break; case 5: day++;
42、 if(day==32) day=1; write_nyr(9,day); write_com(0x80+9); break; case 6: month++; if(month==13) month=1; write_nyr(6,month); write_com(0x80+6);
43、 break; case 7: year++; if(year==100) year=0; write_nyr(3,year); write_com(0x80+3); break; } } } if(s3==0) { delay(1); if(s3==0) { while(!s3);
44、 di(); switch(s1num) { case 1: miao--; if(miao==-1) miao=59; write_sfm(10,miao); write_com(0x80+0x40+10); break; case 2: fen--; if(fen==-1) fen=59;
45、 write_sfm(7,fen); write_com(0x80+0x40+7); break; case 3: shi--; if(shi==-1) shi=23; write_sfm(4,shi); write_com(0x80+0x40+4); break; case 4: week--; if(week==0)
46、 week=7; write_week(week); write_com(0x80+12); break; case 5: day--; if(day==0) day=31; write_nyr(9,day); write_com(0x80+9); break; case 6: month--;
47、 if(month==0) month=12; write_nyr(6,month); write_com(0x80+6); break; case 7: year--; if(year==-1) year=99; write_nyr(3,year); write_com(0x80+3); break; }
48、 } } } if(s4==0) { delay(5); if(s4==0) { flag1=~flag1; while(!s4); di(); if(flag1==0) //退出鬧鐘設(shè)置時(shí)保存數(shù)值 { flag=0; write_com(0x80+0x40); write_data( ); write_data( ); write_com(0x0c); write_ds(1,miao); write_ds(3,fen);
49、 write_ds(5,shi); } else //進(jìn)入鬧鐘設(shè)置 { read_alarm(); //讀取原始數(shù)據(jù) miao=amiao; //重新賦值用以按鍵調(diào)節(jié) fen=afen; shi=ashi; write_com(0x80+0x40); write_data(R); write_data(i); write_com(0x80+0x40+4); write_sfm(4,ashi); write_sfm(7,afen); write_s
50、fm(10,amiao); } } } } void write_ds(uchar add,uchar date) //寫12C887函數(shù) { dscs=0; dsas=1; dsds=1; dsrw=1; P0=add; dsas=0; dsrw=0; P0=date; dsrw=1; dsas=1; dscs=1; } uchar read_ds(uchar add) //讀12C887函數(shù) { uchar ds_date; dsas=1; dsds=1; dsrw=1; dsc
51、s=0; P0=add; dsas=0; dsds=0; P0=0xff; ds_date=P0; dsds=1; dsas=1; dscs=1; return ds_date; } //首次操作12c887時(shí)給予寄存器初始化 void set_time() { write_ds(0,0); write_ds(1,0); write_ds(2,0); write_ds(3,1); write_ds(4,14); write_ds(5,14); write_ds(6,3); write_ds(7,20); writ
52、e_ds(8,6); write_ds(9,12); } //................................. void read_alarm() { amiao=read_ds(1); afen=read_ds(3); ashi=read_ds(5); } void main() { init(); while(1) { led1=0; led2=0; led3=0; led4=0; keyscan(); if(flag_ri==1) { di
53、(); delay(100); di(); delay(500); t0_num++; } if(flag==0&&flag1==0) { keyscan(); year=read_ds(9); month=read_ds(8); day=read_ds(7); week=read_ds(6); shi=read_ds(4); fen=read_ds(2); miao=read_ds(0); write_sfm(10,miao); wri
54、te_sfm(7,fen); write_sfm(4,shi); write_week(week); write_nyr(3,year); write_nyr(6,month); write_nyr(9,day); led1=1; delay(100); led1=0; led2=1; delay(100); led2=0; led3=1; delay(100); led3=0; led4=1; delay(100); led4=0; } }
55、 } void exter() interrupt 2 { uchar c; flag_ri=1; c=read_ds(0x0c); } 頭文件代碼: #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; sbit rs=P3^5; sbit lcden=P3^4; sbit s1=P3^0; //功能鍵 sbit s2=P3^1; //增大鍵 sbit s3=P3^2; //減小鍵 sbit s4=P3^6;
56、 //鬧鐘查看鍵 sbit rd=P3^7; sbit beep=P2^3; //蜂鳴器 sbit dscs=P1^4; sbit dsas=P1^5; sbit dsrw=P1^6; sbit dsds=P1^7; sbit dsirq=P3^3; sbit led1=P1^0; sbit led2=P1^1; sbit led3=P1^2; sbit led4=P1^3; bit flag1,flag_ri; //定義兩個(gè)位變量 uchar count,s1num,flag; //其他變量定義 int t0_num; char miao,shi,fe
57、n,year,month,day,week,amiao,afen,ashi; uchar code table[]=" 20 - - "; //液晶固定顯示內(nèi)容 uchar code table1[]=" : : "; void write_ds(uchar,uchar); //函數(shù)申明 void set_alarm(uchar,uchar,uchar); void read_alarm(); uchar read_ds(uchar); void set_time(); 3.2 proteus仿真
58、 圖3.1 proteus仿真圖 3.3 硬件實(shí)現(xiàn) 3.3.1 電路調(diào)試 圖3.2 硬件圖 3.3.2 性能測(cè)試與分析 通過(guò)硬件的調(diào)試,具備如下功能: (1) 在1602液晶上顯示年、月、日、星期、時(shí)、分、秒,并且按秒實(shí)時(shí)更新顯示。 (2) 具有鬧鐘設(shè)定以及到時(shí)報(bào)警功能,報(bào)警響起時(shí)按任何鍵可取消報(bào)警。如果不按任何鍵,則“滴滴”響30下即停止。 (3) 能夠是板上的按鍵隨時(shí)調(diào)節(jié)各個(gè)參數(shù),按鍵分為四個(gè)有效鍵,分別為功能選擇鍵,數(shù)字增大鍵,數(shù)值減小鍵和鬧鐘查看鍵。 (4) 每次有鍵按下,蜂鳴器都以短“滴”聲報(bào)警。
59、 4 結(jié)論與心得 在本次的課程設(shè)計(jì)中,接觸到了較多的專業(yè)軟件,如protues,keil,以及單片機(jī)燒錄軟件STC_ISP,在整個(gè)設(shè)計(jì)任務(wù)的過(guò)程中,反復(fù)的學(xué)習(xí)使用軟件,使得自己對(duì)這些軟件有了跟多的認(rèn)識(shí)和掌握,較之前,能跟熟練的使用這些軟件。雖然在整個(gè)使用軟件的這些過(guò)程中,遇到了一系列的問(wèn)題,比如在用C語(yǔ)言編寫程序的時(shí)候,輸入的代碼功能不完善,還有諸如輸入法,大小寫之類的細(xì)節(jié)問(wèn)題導(dǎo)致的代碼編譯有錯(cuò)誤,無(wú)法生成Hex文件。此外,由于proteus軟件本身存在一些缺陷,在使用的過(guò)程中可能會(huì)出現(xiàn)各種問(wèn)題,比如同樣的程序生成的Hex文件,在有些電腦上能運(yùn)行正確,有些卻又運(yùn)行錯(cuò)誤。對(duì)待這樣的問(wèn)題,需
60、要有極大的耐心通過(guò)各種途徑來(lái)修改,可以通過(guò)選取其他類型的原件,也可以通過(guò)修改連線方法,或者加入一些較大的驅(qū)動(dòng)電阻來(lái)修改。 此外,通過(guò)查閱大量的書籍,對(duì)51單片機(jī)有了進(jìn)一步的了解,其強(qiáng)大的功能設(shè)計(jì),有了更深刻的認(rèn)識(shí),該課程設(shè)計(jì)相當(dāng)于是單片機(jī)課外學(xué)習(xí)的的拓展。初次接觸到了芯片DS12C887,了解到DS12C887實(shí)時(shí)時(shí)鐘芯片功能豐富,可以用來(lái)直接代替IBM PC上的時(shí)鐘日歷芯片DS12887,同時(shí),它的管腳也和MC146818B、DS12887相兼容。 獨(dú)立完成擴(kuò)展程序,遇到問(wèn)題小組成員一起討論學(xué)習(xí),這樣的交流,更加有助于學(xué)習(xí)效率的提高,總之,在本次課設(shè)中,獲益匪淺,學(xué)會(huì)了將知識(shí)融會(huì)貫通,提高了自己與組員討論交流學(xué)習(xí)的能力,同時(shí)也提高自己的團(tuán)隊(duì)意識(shí)。 參考文獻(xiàn) [1] 郭天祥. 51單片機(jī)C語(yǔ)言教程. 電子工業(yè)出版社 [2] 李群芳 張士軍. 單片機(jī)微型計(jì)算機(jī). 電子工業(yè)出版社 [3] 康華光 電子技術(shù)基礎(chǔ). 數(shù)字部分(第五版). 高等教育出版社 [4] 周潤(rùn)景 張麗娜 . PROTEUS入門實(shí)用教程. 機(jī)械工業(yè)出版社 [5] 王為青.程國(guó)鋼. 單片機(jī)KeilCx51應(yīng)用開發(fā)技術(shù).人民郵電出版社 31
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 川渝旅游日記成都重慶城市介紹推薦景點(diǎn)美食推薦
- XX國(guó)有企業(yè)黨委書記個(gè)人述責(zé)述廉報(bào)告及2025年重點(diǎn)工作計(jì)劃
- 世界濕地日濕地的含義及價(jià)值
- 20XX年春節(jié)節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)人到場(chǎng)心到崗
- 大唐女子圖鑒唐朝服飾之美器物之美繪畫之美生活之美
- 節(jié)后開工第一課輕松掌握各要點(diǎn)節(jié)后常見(jiàn)的八大危險(xiǎn)
- 廈門城市旅游介紹廈門景點(diǎn)介紹廈門美食展示
- 節(jié)后開工第一課復(fù)工復(fù)產(chǎn)十注意節(jié)后復(fù)工十檢查
- 傳統(tǒng)文化百善孝為先孝道培訓(xùn)
- 深圳城市旅游介紹景點(diǎn)推薦美食探索
- 節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)勿忘安全本心人人講安全個(gè)個(gè)會(huì)應(yīng)急
- 預(yù)防性維修管理
- 常見(jiàn)閥門類型及特點(diǎn)
- 設(shè)備預(yù)防性維修
- 2.乳化液泵工理論考試試題含答案