|
|
這是一個(gè)萬(wàn)年歷的小制作,包含有完整的論文,大家可以多多提供意見(jiàn)呀!!
里面有仿真圖以及源代碼提供下載
還有實(shí)物圖喲!
洛陽(yáng)理工學(xué)院?jiǎn)纹瑱C(jī)課程設(shè)計(jì)
課程名稱:基于單片機(jī)的萬(wàn)年歷 系別:計(jì)算機(jī)與信息工程學(xué)院 班級(jí):B140509 學(xué)號(hào):B14050918 姓名:伍華 同組人:李威 楊宇 指導(dǎo)老師:李
【目錄】 1 諸論 1.1 摘要 1.2 單片機(jī)發(fā)展概況 1.3 單片機(jī)原理及應(yīng)用簡(jiǎn)介 2 系統(tǒng)方案 2.1 系統(tǒng)功能 2.2 系統(tǒng)總體方案 2.2 芯片簡(jiǎn)介 2.2.1 80C52芯片 2.2.2 實(shí)時(shí)時(shí)鐘芯片DS1302 2.2.3 DS18B20單總線數(shù)字溫度計(jì) 2.2.4 Lcd1602液晶顯示器 3 系統(tǒng)軟件設(shè)計(jì) 4 PROTUES軟件仿真 4.1 仿真過(guò)程 4.2 仿真結(jié)果 5 開(kāi)發(fā)板調(diào)試結(jié)果 6 心得體會(huì) 7 待解決問(wèn)題 8 附錄
1 諸論1.1摘要本設(shè)計(jì)是一個(gè)基于MCS-51單片機(jī)實(shí)現(xiàn)的萬(wàn)年歷。 單片機(jī)中央處理系統(tǒng)的方案設(shè)計(jì),選用80C52單片機(jī)作為中央處理器,如圖所示。該單片機(jī)除了擁有MCS-51系列單片機(jī)的所有優(yōu)點(diǎn)外,內(nèi)部還具有8K的在系統(tǒng)可編程FLASH存儲(chǔ)器,低功耗的空閑和掉電模式,極大的降低了電路的功耗,還包含了定時(shí)器、程序存儲(chǔ)器、數(shù)據(jù)存儲(chǔ)器等硬件,其硬件能符合整個(gè)控制系統(tǒng)的要求,不需要外接其他存儲(chǔ)器芯片和定時(shí)器件,方便地構(gòu)成一個(gè)最小系統(tǒng)。整個(gè)系統(tǒng)結(jié)構(gòu)緊湊,抗干擾能力強(qiáng),性價(jià)比高。 1.2單片機(jī)發(fā)展概況單片機(jī)的發(fā)展歷史可大致分為4個(gè)階段。
第一階段(1974年-1976年):?jiǎn)纹瑱C(jī)初級(jí)階段。因工藝限制,單片機(jī)采用雙片的形式而且功能比較簡(jiǎn)單。1974年12月,仙童公司推出了8位的F8單片機(jī),實(shí)際上只包括了8位CPU、64B RAM和2個(gè)并行口。
第二階段(1976年-1978年):低性能單片機(jī)階段。1976年,Intel公司推出的MCS-48單片機(jī)(8位單片機(jī))極大地促進(jìn)了單片機(jī)的變革和發(fā)展;1977年,GI公司推出了PIC1650,但這個(gè)階段的單片機(jī)仍然處于低性能階段。
第三階段(1978年-1983年):高性能單片機(jī)階段。1978年,Zilog公司推出了28單片機(jī);1980年,Intel公司在MCS-48單片機(jī)的基礎(chǔ)上推出了MCS-51系列,Mortorola公司推出了6801單片機(jī);這些產(chǎn)品使單片機(jī)的性能及應(yīng)用躍上了一個(gè)新的臺(tái)階。此后,各公司的8位單片機(jī)迅速發(fā)展起來(lái)。這個(gè)階段推出的單片機(jī)普遍帶有串行I/O口、多級(jí)中斷系統(tǒng)、16位定時(shí)器/計(jì)數(shù)器,片內(nèi)ROM、RAM容量加大,且尋址范圍可達(dá)64 KB,有的片內(nèi)還帶有A/D轉(zhuǎn)換器。由于這類單片機(jī)的性能價(jià)格比高,所以被廣泛應(yīng)用,是目前應(yīng)用數(shù)量最多的單片機(jī)。
第四階段(1983年-現(xiàn)在):8位單片機(jī)鞏固、發(fā)展及16位單片機(jī)、32位單片機(jī)推出階段。16位單片機(jī)的典型產(chǎn)品為Intel公司生產(chǎn)的MCS-96系列單片機(jī)。而32位單片機(jī)除了具有更高的集成度外,其數(shù)據(jù)處理速度比16位單片機(jī)提高許多,性能比8位、16位單片機(jī)更加優(yōu)越。20世紀(jì)90年代是單片機(jī)制造業(yè)大發(fā)展的時(shí)期,這個(gè)時(shí)期的Mortorola、Intel、ATMEL、德州儀器(TI)、三菱、日立、Philips、LG等公司也開(kāi)發(fā)了一大批性能優(yōu)越的單片機(jī),極大地推動(dòng)了單片機(jī)的應(yīng)用。近年來(lái),又有不少新型的高集成度單片機(jī)產(chǎn)品涌現(xiàn)出來(lái),出現(xiàn)了單片機(jī)產(chǎn)品豐富多彩的局面。目前,除了8位單片機(jī)得到廣泛應(yīng)用之外,16位單片機(jī)、32位單片機(jī)也得到廣大用戶的青睞。
1.3單片機(jī)原理及應(yīng)用簡(jiǎn)介 單片機(jī)是單片微型計(jì)算機(jī)的簡(jiǎn)稱,指在一塊大規(guī)模或超大規(guī)模集成電路芯片上制成的微型計(jì)算機(jī)。單片機(jī)具有體積小、功耗低、性價(jià)比高、應(yīng)用靈活等優(yōu)點(diǎn),可以作為一個(gè)部件嵌入到各種裝置和產(chǎn)品中。現(xiàn)代生活中,從通信設(shè)備、家用電器、辦公應(yīng)用到工業(yè)控制、儀器儀表、汽車電子、航空航天,幾乎每件電子和機(jī)械產(chǎn)品中都有單片機(jī)在工作,單片機(jī)的用量早已遠(yuǎn)遠(yuǎn)超過(guò)包括個(gè)人計(jì)算機(jī)在內(nèi)的其他計(jì)算機(jī)的總和。以其嵌入到實(shí)際產(chǎn)品中發(fā)揮的控制作用或所處的地位,單片機(jī)又被稱為微控制器或嵌入式微控制器。
單片機(jī)的種類繁多、功能各異。Intel公司的MCS-51系列8位單片機(jī),以其完善的結(jié)構(gòu)、豐富的功能、開(kāi)放的體系,盛行30多年而不衰。眾多半導(dǎo)體廠商(如Atmel、Dallas Semi、Infineon、Philips/Signetics等)獲得Intel公司的授權(quán)后,在保持代碼兼容性的前提下,融合各自先進(jìn)技術(shù),針對(duì)不同市場(chǎng)需求,在時(shí)鐘、存儲(chǔ)器、定時(shí)器/計(jì)數(shù)器、I/O接口、串行總線控制等方面進(jìn)行了改進(jìn)、裁剪,使得在任何實(shí)際產(chǎn)品的設(shè)計(jì)中都有最恰當(dāng)?shù)男酒晒┻x擇,也給這一單片機(jī)家族提供了旺盛的生命力。本書選擇MCS-51系列單片機(jī)作為主講機(jī)型,系統(tǒng)全面地介紹MCS-51單片機(jī)內(nèi)部的功能結(jié)構(gòu)、軟硬件資源的原理與應(yīng)用,以及使用外部電路進(jìn)行功能擴(kuò)展的方法。 單片機(jī)是單片微型計(jì)算機(jī)的簡(jiǎn)稱,指在一塊大規(guī)模或超大規(guī)模集成電路芯片上制成的微型計(jì)算機(jī)。單片機(jī)具有體積小、功耗低、性價(jià)比高、應(yīng)用靈活等優(yōu)點(diǎn),可以作為一個(gè)部件嵌入到各種裝置和產(chǎn)品中。現(xiàn)代生活中,從通信設(shè)備、家用電器、辦公應(yīng)用到工業(yè)控制、儀器儀表、汽車電子、航空航天,幾乎每件電子和機(jī)械產(chǎn)品中都有單片機(jī)在工作,單片機(jī)的用量早已遠(yuǎn)遠(yuǎn)超過(guò)包括個(gè)人計(jì)算機(jī)在內(nèi)的其他計(jì)算機(jī)的總和。以其嵌入到實(shí)際產(chǎn)品中發(fā)揮的控制作用或所處的地位,單片機(jī)又被稱為微控制器或嵌入式微控制器。
單片機(jī)的種類繁多、功能各異。Intel公司的MCS-51系列8位單片機(jī),以其完善的結(jié)構(gòu)、豐富的功能、開(kāi)放的體系,盛行30多年而不衰。眾多半導(dǎo)體廠商(如Atmel、Dallas Semi、Infineon、Philips/Signetics等)獲得Intel公司的授權(quán)后,在保持代碼兼容性的前提下,融合各自先進(jìn)技術(shù),針對(duì)不同市場(chǎng)需求,在時(shí)鐘、存儲(chǔ)器、定時(shí)器/計(jì)數(shù)器、I/O接口、串行總線控制等方面進(jìn)行了改進(jìn)、裁剪,使得在任何實(shí)際產(chǎn)品的設(shè)計(jì)中都有最恰當(dāng)?shù)男酒晒┻x擇,也給這一單片機(jī)家族提供了旺盛的生命力。本書選擇MCS-51系列單片機(jī)作為主講機(jī)型,系統(tǒng)全面地介紹MCS-51單片機(jī)內(nèi)部的功能結(jié)構(gòu)、軟硬件資源的原理與應(yīng)用,以及使用外部電路進(jìn)行功能擴(kuò)展的方法。
2 系統(tǒng)方案2.1系統(tǒng)功能1:LCD顯示年、月、日、時(shí)、分、秒、星期、溫度信息; 2:用按鍵可以調(diào)整日期和時(shí)間、星期; 3:可以設(shè)置鬧鈴時(shí)間,到鬧鈴響起; 2.2系統(tǒng)總體方案本設(shè)計(jì)分為編程,仿真,調(diào)試開(kāi)發(fā)板等步驟。以單片機(jī)為主體,利用單片機(jī)的諸多功能來(lái)控制外部設(shè)備的正常運(yùn)行。 顯示器為L(zhǎng)M016L,通過(guò)PO口將數(shù)據(jù)傳輸?shù)斤@示器上。時(shí)鐘信號(hào)的發(fā)生靠的是DS1302,將時(shí)鐘信號(hào)傳到單片機(jī)用于顯示時(shí)間以及定時(shí)的功能。利用DS18B20檢測(cè)外部環(huán)境溫度,實(shí)時(shí)檢測(cè),將溫度數(shù)據(jù)及時(shí)的傳輸?shù)絾纹瑱C(jī)。 2芯片簡(jiǎn)介2.2.180C52芯片80C52芯片結(jié)合了HMOS的高速和高密度技術(shù)及CHMOS的低功耗特征,它基于標(biāo)準(zhǔn)的MCS-51單片機(jī)體系結(jié)構(gòu)和指令系統(tǒng),屬于80C51增強(qiáng)型單片機(jī)版本,集成了時(shí)鐘輸出和向上或向下計(jì)數(shù)器等更多的功能,適合于類似馬達(dá)控制等應(yīng)用場(chǎng)合。 80C52內(nèi)置8位中央處理單元、256字節(jié)內(nèi)部數(shù)據(jù)存儲(chǔ)器RAM、8k片內(nèi)程序存儲(chǔ)器(ROM)32個(gè)雙向輸入/輸出(I/O)口、3個(gè)16位定時(shí)/計(jì)數(shù)器和5個(gè)兩級(jí)中斷結(jié)構(gòu),一個(gè)全雙工串行通信口,片內(nèi)時(shí)鐘振蕩電路。 此外,80C52還可工作于低功耗模式,可通過(guò)兩種軟件選擇空閑和掉電模式。在空閑模式下凍結(jié)CPU而RAM定時(shí)器、串行口和中斷系統(tǒng)維持其功能。掉電模式下,保存RAM數(shù)據(jù),時(shí)鐘振蕩停止,同時(shí)停止芯片內(nèi)其它功能。80C52有PDIP(40pin)和PLCC(44pin)兩種封裝形式。 8051片內(nèi)有 ROM,無(wú)須外接外存儲(chǔ)器和373,更能體現(xiàn)“單片”的簡(jiǎn)練。但是你編的程序你無(wú)法燒寫到其ROM中,只有將程序交芯片廠代你燒寫,并是一次性的,今后你和芯片廠都不能改寫其內(nèi)容。
1.001.jpg (20.8 KB, 下載次數(shù): 50)
下載附件
2017-5-22 17:50 上傳
2.2.2實(shí)時(shí)時(shí)鐘芯片DS1302美國(guó)DALLAS公司推出的具有涓細(xì)電流充電能力的低功耗實(shí)時(shí)時(shí)鐘電路DS1302的結(jié)構(gòu)、工作原理及其在實(shí)時(shí)顯示時(shí)間中的應(yīng)用。它可以對(duì)年、月、日、周日、時(shí)、分、秒進(jìn)行計(jì)時(shí),且具有閏年補(bǔ)償?shù)榷喾N功能。 DS1302的引腳排列,其中Vcc1為后備電源,VCC2為主電源。在主電源關(guān)閉的情況下,也能保持時(shí)鐘的連續(xù)運(yùn)行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當(dāng)Vcc2大于Vcc1+0.2V時(shí),Vcc2給DS1302供電。當(dāng)Vcc2小于Vcc1時(shí),DS1302由Vcc1供電。 X1和X2是振蕩源,外接32.768kHz晶振。RST是復(fù)位/片選線,通過(guò)把RST輸入驅(qū)動(dòng)置高電平來(lái)啟動(dòng)所有的數(shù)據(jù)傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)RST為高電平時(shí),所有的數(shù)據(jù)傳送被初始化,允許對(duì)DS1302進(jìn)行操作。如果在傳送過(guò)程中RST置為低電平,則會(huì)終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運(yùn)行時(shí),在Vcc≥2.5V之前,RST必須保持低電平。只有在SCLK為低電平時(shí),才能將RST置為高電平。 I/O為串行數(shù)據(jù)輸入輸出端(雙向),后面有詳細(xì)說(shuō)明。 SCLK為時(shí)鐘輸入端。
1.002.jpg (11.48 KB, 下載次數(shù): 43)
下載附件
2017-5-22 17:50 上傳
2.2.3DS18B20單總線數(shù)字溫度計(jì)DS18B20是常用的溫度傳感器,具有體積小,硬件開(kāi)銷低,抗干擾能力強(qiáng),精度高的特點(diǎn)。[ DS18B20的讀寫時(shí)序和測(cè)溫原理與DS1820相同,只是得到的溫度值的位數(shù)因分辨率不同而不同,且溫度轉(zhuǎn)換時(shí)的延時(shí)時(shí)間由2s減為750ms。 DS18B20測(cè)溫原理如圖3所示。圖中低溫度系數(shù)晶振的振蕩頻率受溫度影響很小,用于產(chǎn)生固定頻率的脈沖信號(hào)送給計(jì)數(shù)器1。高溫度系數(shù)晶振隨溫度變化其振蕩率明顯改變,所產(chǎn)生的信號(hào)作為計(jì)數(shù)器2的脈沖輸入。計(jì)數(shù)器1和溫度寄存器被預(yù)置在-55℃所對(duì)應(yīng)的一個(gè)基數(shù)值。計(jì)數(shù)器1對(duì)低溫度系數(shù)晶振產(chǎn)生的脈沖信號(hào)進(jìn)行減法計(jì)數(shù),當(dāng)計(jì)數(shù)器1的預(yù)置值減到0時(shí),溫度寄存器的值將加1,計(jì)數(shù)器1的預(yù)置將重新被裝入,計(jì)數(shù)器1重新開(kāi)始對(duì)低溫度系數(shù)晶振產(chǎn)生的脈沖信號(hào)進(jìn)行計(jì)數(shù),如此循環(huán)直到計(jì)數(shù)器2計(jì)數(shù)到0時(shí),停止溫度寄存器值的累加,此時(shí)溫度寄存器中的數(shù)值即為所測(cè)溫度。斜率累加器用于補(bǔ)償和修正測(cè)溫過(guò)程中的非線性,其輸出用于修正計(jì)數(shù)器1的預(yù)置值。[
1.003.jpg (18.46 KB, 下載次數(shù): 61)
下載附件
2017-5-22 17:50 上傳
2.2.4Lcd1602液晶顯示器1602液晶也叫1602字符型液晶,它是一種專門用來(lái)顯示字母、數(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ù)字)。 1602采用標(biāo)準(zhǔn)的16腳接口,其中: 第1腳:GND為電源地 第2腳:VCC接5V電源正極 第3腳:V0為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地電源時(shí)對(duì)比度最高(對(duì)比度過(guò)高時(shí)會(huì) 產(chǎn)生“鬼影”,使用時(shí)可以通過(guò)一個(gè)10K的電位器調(diào)整對(duì)比度)。 第4腳:RS為寄存器選擇,高電平1時(shí)選擇數(shù)據(jù)寄存器、低電平0時(shí)選擇指令寄存器。 第5腳:RW為讀寫信號(hào)線,高電平(1)時(shí)進(jìn)行讀操作,
低電平(0)時(shí)進(jìn)行寫操作。 第6腳:E(或EN)端為使能(enable)端,高電平(1)時(shí)讀取信息,負(fù)跳 變時(shí)執(zhí)行指令。 第7~14腳:D0~D7為8位雙向數(shù)據(jù)端。第15~16腳:空腳或背燈電 源。15腳背光正極,16腳背光負(fù)極。+
1.004.jpg (17.57 KB, 下載次數(shù): 53)
下載附件
2017-5-22 17:50 上傳
3 系統(tǒng)軟件設(shè)計(jì)
1.005.jpg (16.89 KB, 下載次數(shù): 60)
下載附件
2017-5-22 17:50 上傳
在多功能模塊化程序設(shè)計(jì)中,主程序的作用時(shí)設(shè)置系統(tǒng)運(yùn)行的一些初始狀態(tài)及系統(tǒng)運(yùn)行的環(huán)境,并將各種功能子程序按要求連接起來(lái)組成一個(gè)功能強(qiáng)大的系統(tǒng)。本系統(tǒng)主程序的流程圖如圖。在本程序中,LCD1602初始化:8位數(shù)據(jù)接口,兩行顯示,5*7點(diǎn)陣字符,顯示開(kāi),關(guān)光標(biāo),光標(biāo)移動(dòng)為增量式。 LCD1602的初始化已被寫成一個(gè)函數(shù)LCD——INITIAL(),直接調(diào)用就可完成LCD1602的初始化。
4 PROTUES軟件仿真4.1 仿真過(guò)程- 仿真:打開(kāi)keil uVision2,建立工程,輸入所編寫的源程序并對(duì)程序進(jìn)行編譯,在軟件的幫助下檢查其中的錯(cuò)誤并進(jìn)行反復(fù)修改,知道編譯正確侯運(yùn)行,生成相應(yīng)的HEX文件,并進(jìn)行保存,保存時(shí)給其命名,以便將來(lái)載入程序時(shí)容易找到。
- 打開(kāi)PROTUES軟件,并出畫單片機(jī)電子萬(wàn)年歷具體運(yùn)行電路圖。
- 檢查所畫電路運(yùn)行圖,確保沒(méi)有錯(cuò)誤以后,在PROTUES下對(duì)原理圖進(jìn)行加載keil uVision下的源程序。
1.006.jpg (22.63 KB, 下載次數(shù): 49)
下載附件
2017-5-22 17:50 上傳
4.2 仿真結(jié)果
1.007.jpg (16.38 KB, 下載次數(shù): 53)
下載附件
2017-5-22 17:50 上傳
1.008.jpg (20.44 KB, 下載次數(shù): 55)
下載附件
2017-5-22 17:50 上傳
5 開(kāi)發(fā)板調(diào)試結(jié)果…
1.009.jpg (10.5 KB, 下載次數(shù): 37)
下載附件
2017-5-22 17:50 上傳
1.010.jpg (13.08 KB, 下載次數(shù): 74)
下載附件
2017-5-22 17:50 上傳
6 程序流程圖
1.011.jpg (19.56 KB, 下載次數(shù): 62)
下載附件
2017-5-22 17:50 上傳
7 心得體會(huì)課程設(shè)計(jì)是培養(yǎng)學(xué)生綜合運(yùn)用所學(xué)知識(shí),發(fā)現(xiàn)、提出、分析和解決實(shí)際問(wèn)題,鍛煉實(shí)踐能力的重要環(huán)節(jié),回顧此次單片機(jī)課程設(shè)計(jì),我感覺(jué)受益良多,其中編程,仿真,調(diào)試開(kāi)發(fā)板等步驟。這次課程設(shè)計(jì)是我懂得理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)知識(shí)和實(shí)踐相結(jié)合起來(lái),從理論中得出結(jié)論,才能真正讓所學(xué)的知識(shí)服務(wù)于我們的生活,服務(wù)于我們的社會(huì),從而提高我們的實(shí)際動(dòng)手能力和獨(dú)立思考的能力,同時(shí)加強(qiáng)了與同學(xué)的合作和與老師的溝通,收獲很多大!這次課程設(shè)計(jì)也讓我發(fā)現(xiàn)了自己的不足之處,對(duì)以前學(xué)過(guò)的理論知識(shí)理解得不夠深刻,掌握得不夠牢固,對(duì)單片機(jī)匯編語(yǔ)言掌握得不好,一定要把以前的知識(shí)溫故而知新。
8 待解決問(wèn)題1:仿真部件所屬的庫(kù) 2:程序中一則警告無(wú)法消除 9 附錄
單片機(jī)源程序如下:
- #include //52單片機(jī)的頭文件,規(guī)定了52單片機(jī)的寄存器和IO口
- #include //_nop_空指令及左右循環(huán)移位子函數(shù)庫(kù)
- #define uchar unsigned char //宏定義
- #define uint unsigned int
- sbit lcden=P2^6; //定義下面通過(guò)lcden來(lái)操作P2^6口,1602液晶使能控制端
- sbit lcdwr=P2^5; //定義下面通過(guò)lcdwr來(lái)操作P2^5口,1602讀寫選擇端
- sbit lcdrs=P2^4; //定義下面選數(shù)據(jù)寄存器還是選指令寄存器控制端
- sbit sda=P3^6; //定義DS1302數(shù)據(jù)總線,DS1302設(shè)置時(shí)間
- sbit rst=P3^4; //定義DS1302復(fù)位
- sbit sck=P3^5; //定義時(shí)鐘總線
- sbit s1=P3^0; //定義設(shè)置按鈕
- sbit s2=P3^1; //定義調(diào)試按鈕
- sbit s3=P3^2; //定義確定按鈕
- sbit s4=P3^3;
- sbit DQ=P3^7; //定義DS18B20通信端口
- sbit ACC0=ACC^0;
- sbit ACC7=ACC^7;
- sbit BELL=P1^5;
- char fen,shi,miao,ri,yue,nian,zhou,s1num,s2num,s4num,flag1,flag2,lshi,lfen;
- uchar code table[]={" 2016- - "}; //要寫入1602液晶的數(shù)據(jù)
- uchar code alarm[]={" CLOCK SETTINGS"}; //要寫入1602液晶的數(shù)據(jù)
- uchar code alarm1[]={" : "}; //要寫入1602液晶的數(shù)據(jù)
- uchar code table1[]={" : : . "}; //字庫(kù)中的字可直接以外加""號(hào)的形式直接寫入
- uchar code table2[]={" Wan Nian Li !"}; //歡迎界面
- uchar code table3[]={"Wo Men Jie Zuo!!"}; //歡迎界面
-
-
- //*****************星期編碼表**********************************
- uchar code Weeks[][3]={{"SUN"},{"MON"},{"TUE"},{"WED"},{"THU"},{"FRI"},{"SAT"},{"SUN"}};
- uchar i,j;
- //*********************短暫延時(shí)********************************
- void delay0(uint z)
- {
- while(z--);
- }
- //*********************毫秒延時(shí)********************************
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- //DS18B20初始化函數(shù)
- void Init_DS18B20(void)
- {
- unsigned char x=0;
- DQ=1; //DQ復(fù)位,DQ一般是表示單總線的數(shù)據(jù)接口端 //
- delay0(8); //稍做延時(shí)
- DQ=0; //單片機(jī)將DQ拉低
- delay0(80); //精確延時(shí)
- DQ=1; //拉高總線
- delay0(14);
- x=DQ; //稍做延時(shí)后?如果x=0則初始化成功?x=1則初始化失敗
- delay0(20);
- }
-
- //DS18B20讀一個(gè)字節(jié)
- uchar ReadOneChar(void)
- {
- unsigned char i=0;
- unsigned char dat=0;
- for(i=8;i>0;i--)
- {
- DQ=0; //給脈沖信號(hào)
- dat>>=1; //讓從總線上讀到的位數(shù)據(jù),依次從高位移動(dòng)到低位 //
- DQ=1; //給脈沖信號(hào)
- if(DQ)
- dat|=0x80;
- delay0(4);
- }
- return(dat);
- }
-
- //DS18B20寫一個(gè)字節(jié)?
- void WriteOneChar(unsigned char dat)
- {
- unsigned char i=0;
- for(i=8;i>0;i--)
- {
- DQ=0;
- DQ=dat&0x01;
- delay0(5);
- DQ=1;
- dat>>=1;
- }
- }
-
- //DS18B20讀取溫度
- uint ReadTemperature(void)
- {
- unsigned char a=0;
- unsigned char b=0;
- unsigned int t=0;
- float tt=0;
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作
- WriteOneChar(0x44); //啟動(dòng)溫度轉(zhuǎn)換
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作
- WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
- a=ReadOneChar();
- b=ReadOneChar();
- t=b;
- t<<=8;
- t=t|a;
- tt=t*0.0625; //將溫度的高位與低位合并
- t=tt*10+0.5; //對(duì)結(jié)果進(jìn)行4舍5入
- return(t);
- }
- /*********************蜂鳴器函數(shù)************************************************/
- void didi()
- {
- uchar i;
- for(i=0;i<60;i++)
- {
- BELL=0;
- delay(1);
- BELL=1;
- delay(1);
- }
- }
-
- /*******************向1602液晶中寫一個(gè)指令**************************************/
- void write_com(uchar com)
- {
- lcdwr=0; //lcdwr為讀寫控制端,
- //lcdwr=0,
- lcdrs=0; //液晶rs接口為0時(shí),寫指令,rs為1時(shí)寫數(shù)據(jù)
- P0=com; //將要寫的指令賦給P0口,
- delay(5); //由1602讀寫操作時(shí)序圖,先將指令賦給P0口,延時(shí)后將使能
- lcden=1; //端lcden置高,再延時(shí)一段時(shí)間,然后將lcden置低,這樣指令
- delay(5); //就寫入到LCD了
- lcden=0;
- }
- /****************************
- 向
- 液
- 晶
- 寫
- 數(shù)
- 據(jù)
- ***************************************/
- void write_data(uchar date)
- {
- lcdrs=1; //與寫指令類似,這里lcdrs設(shè)為1
- P0=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
-
- /*****************************初使化1602液晶************************************/
- void init_1602()
- {
- lcdwr=0;
- lcden=0;
- write_com(0x38); //設(shè)置LCD為16*2顯示、5*7點(diǎn)陣、8位數(shù)據(jù)接口模式
- write_com(0x0c); //開(kāi)顯示、不顯示光標(biāo)
- write_com(0x06); //寫一個(gè)字符后,地址指針加1
- write_com(0x01); //顯示清0
- P0=0xff;
- }
-
-
- /*******************************************************************************/
- void gudingtime_1602()
- {
- uchar num;
- write_com(0x80); //將指針指向初始位置
- for(num=0;num<16;num++) //循環(huán)函數(shù),用于將"2012- - "寫入液晶
- write_data(table[num]);
- write_com(0x80+0x40); //將指針指向1602液晶的第二行?
- for(num=0;num<16;num++) //功能與上同,用于將" : : "寫入
- write_data(table1[num]);
- }
- void gudingtime_1602_1()
- {
- uchar num1;
- write_com(0x80); //將指針指向初始位置
- for(num1=0;num1<16;num1++) //循環(huán)函數(shù),用于將"?2012- - "寫入液晶
- write_data(alarm[num1]);
- write_com(0x80+0x40); //將指針指向1602液晶的第二行
- for(num1=0;num1<16;num1++)//功能與上同,用于將" : : . "寫入
- write_data(alarm1[num1]);
- }
-
-
- /**************************顯示初始化界面函數(shù)*************************************/
- void displaystar(void)
- {
- uchar i;
- write_com(0x80);
- for(i=0;i<16;i++)
- write_data(table2[i]);
- write_com(0x80+0x40);
- for(i=0;i<16;i++)
- write_data(table3[i]);
- }
-
- /***************************顯示時(shí)間、日期子函數(shù)*********************************/
- void write_sfm(uchar add,uchar time) //用于在1602上顯示年、月、日、時(shí)、分、秒。Add為顯示位置,time為要顯示的內(nèi)容
- {
- uchar shiwei,gewei;
- shiwei=time/16; //將從DS1302中讀取的BCD碼數(shù)據(jù)轉(zhuǎn)化成十六
- gewei=time%16; //十六進(jìn)制個(gè)位
- write_com(add+0x80); //定義顯示在液晶的什么位置
- write_data(0x30+shiwei); //由1602液晶字庫(kù)可知,0~9的數(shù)據(jù)碼分別對(duì)應(yīng)0x30~0x39
- write_data(0x30+gewei); //初使化中設(shè)定了寫一個(gè)字符后,地址指針加1
- } //?不用重新光標(biāo)寫位?
- void write_temp(uchar add,uint temp) //用于在1602上顯示年、月、日、時(shí)、分、秒。Add為顯示位置,time為要顯示的內(nèi)容
- {
- uchar shi,ge,xshu;
- shi=temp/100; //將從DS1302中讀取的BCD碼數(shù)據(jù)轉(zhuǎn)化成10進(jìn)制個(gè)位和10??
- ge=temp%100/10; //進(jìn)制十位?
- xshu=temp%10;
- write_com(add+0x80); //定義顯示在液晶的什么位置??
- write_data(0x30+shi); //由1602液晶字庫(kù)可知,0~9的數(shù)據(jù)碼分別對(duì)應(yīng)0x30~0x39
- write_data(0x30+ge); //初使化中設(shè)定了寫一個(gè)字符后,地址指針加1,因此這里
- write_com(0x80+0x40+14);
- write_data(0x30+xshu); //?不用重新光標(biāo)寫位?
- }
-
- /**************************顯示周子函數(shù)*****************************************/
- void write_zhou(uchar time1) //用于在1602上顯示周信息,與顯示
- { //時(shí)間日期子函數(shù)類似?
- uchar gewei;
- gewei=time1%16; //一周七天,因此只需個(gè)位?
- write_com(0x80+14);
- write_data(0x30+gewei);
- }
- /***************************寫數(shù)據(jù)字節(jié)子函數(shù)************************************/
- void Input_1byte(uchar TD) //寫一字節(jié)數(shù)據(jù)
- {
- uchar i;
- ACC=TD;
- for(i=8;i>0;i--)
- {
- sda=ACC0;
- sck=1;
- sck=0;
- ACC=ACC>>1;
- }
- }
-
- /*************************
- 讀數(shù)據(jù)字節(jié)子函數(shù)**************************************/
- uchar Output_1byte(void) //讀一字節(jié)數(shù)據(jù)
- {
- uchar i;
- for(i=8;i>0;i--)
- {
- ACC=ACC>>1;
- ACC7=sda;
- sck=1;
- sck=0;
- }
- return(ACC);
- }
- /***************************寫DS1302數(shù)據(jù)函數(shù)***********************************/
- void write_1302(uchar DS_ADD,uchar DS_DAT) //寫操作
- {
- rst=0;
- sck=0;
- rst=1;
- Input_1byte(DS_ADD);
- Input_1byte(DS_DAT);
- sck=1;
- rst=0;
- }
- /***************************讀DS1302數(shù)據(jù)函數(shù)***********************************/
- uchar read_1302(uchar DS_ADD) //讀操作
- {
- uchar DS_INF;
- rst=0;
- sck=0;
- rst=1;
- Input_1byte(DS_ADD);
- DS_INF=Output_1byte();
- sck=1;
- rst=0;
- return(DS_INF);
- }
-
- /*************************初始化DS1302子函數(shù)***********************************/
- void inital_1302()
- {
- write_1302(0x8e,0x00); //禁止寫保護(hù)
- write_1302(0x90,0xaa); //定義充電
- write_1302(0x80,0x53); //秒
- write_1302(0x84,0x09); //時(shí)
- write_1302(0x82,0x56); //分
- write_1302(0x8c,0x13); //年
- write_1302(0x88,0x04); //月
- write_1302(0x86,0x14); //日
- write_1302(0x8a,0x07); //星期?
- write_1302(0xc0,0x08); //鬧鐘小時(shí)初始化
- write_1302(0xfc,0x00); //鬧鐘分鐘初始化
- write_1302(0x8e,0x80); //開(kāi)保護(hù)?
- }
-
- /********************************************************************************掃描函數(shù)********************************************************************************/
- void keyscan()
- {
- if(s1==0&&s4num==0) //按鍵1按下且s4在此之前未曾按過(guò)?
- {
- delay(5);
- if(s1==0&&s4num==0)
- {
- flag1=1;
- s1num++;
- while(!s1);
- didi();
- if(s1num==1)
- {
- write_com(0x80+0x40+8); //光標(biāo)移動(dòng)到**位置
- write_com(0x0f); //顯示光標(biāo)?
- }
- if(s1num==2)
- {
- write_1302(0x8e,0x00); //禁止寫保護(hù)
- write_1302(0x80,miao); //寫入秒信息
- write_1302(0x8e,0x80); //開(kāi)寫保護(hù)
- write_com(0x80+0x40+5);
- }
- if(s1num==3)
- {
- write_1302(0x8e,0x00);
- write_1302(0x82,fen);
- write_1302(0x8e,0x80);
- write_com(0x80+0x40+2);
- }
- if(s1num==4)
- {
- write_1302(0x8e,0x00);
- write_1302(0x88,yue);
- write_1302(0x8e,0x80);
- write_com(0x80+14);
- }
- if(s1num==5)
- {
- write_1302(0x8e,0x00);
- write_1302(0x84,shi);
- write_1302(0x8e,0x80);
- write_com(0x80+10);
- }
- if(s1num==6)
- {
- write_1302(0x8e,0x00);
- write_1302(0x86,ri);
- write_1302(0x8e,0x80);
- write_com(0x80+7);
- }
- if(s1num==7)
- {
- write_1302(0x8e,0x00);
- write_1302(0x8c,nian);
- write_1302(0x8e,0x80);
- write_com(0x80+4);
- }
- if(s1num==8)
- {
- flag1=0;
- s1num=0;
- write_1302(0x8e,0x00);
- write_1302(0x8a,zhou);
- write_1302(0x8e,0x80);
- write_com(0x0c); //不顯示光標(biāo)?
- }
- }
-
- }
-
-
-
- /*******************************************************************************/
-
- if(s1num!=0&&s4num==0) //按鍵1按下*次且s4再此之前未曾按過(guò)
- {
- if(s2==0)
- {
- delay(5);
- if(s2==0)
- {
- while(!s2);
- didi();
- if(s1num==1)
- {
- int x1,x2;
- x1=miao%16;
- x2=miao/16;
- x1++;
- if(x1==10)
- {
- x1=0;
- x2++;
- if(x2>=6)
- x2=0;
- }
- miao=x1+x2*16;
- write_sfm(7+0x40,miao);//將修改的數(shù)送到1602顯示
- write_com(0x80+0x40+8);//挪回光標(biāo)
- }
- if(s1num==2)
- {
- int x3,x4;
- x3=fen%16;
- x4=fen/16;
- x3++;
- if(x3==10)
- {
- x3=0;
- x4++;
- if(x4>=6)
- x4=0;
- }
- fen=x3+x4*16;
- write_sfm(4+0x40,fen);
- write_com(0x80+0x40+5);
- }
- if(s1num==3)
- {
- int x5,x6;
- x5=shi%16;
- x6=shi/16;
- x5++;
- if(x6>=2&&x5>=4)
- {
- x5=0;
- x6=0;
- }
- if(x5==10)
- {
- x5=0;
- x6++;
- }
- shi=x5+x6*16;
- write_sfm(1+0x40,shi);
- write_com(0x80+0x40+2);
- }
- if(s1num==4)
- {
- zhou++;
- if(zhou==8)
- zhou=1;
- write_zhou(zhou);
- write_com(0x80+14);
- }
- if(s1num==5)
- {
- int x5,x6;
- x5=ri%16;
- x6=ri/16;
- x5++;
- if(x6>=3&&x5>=1)
- {
- x5=1;
- x6=0;
- }
- if(x5==10)
- {
- x5=0;
- x6++;
- }
- ri=x5+x6*16;
- write_sfm(9,ri);
- write_com(0x80+10);
- }
- if(s1num==6)
- {
- int x5,x6;
- x5=yue%16;
- x6=yue/16;
- x5++;
- if(x6>=1&&x5>=3)
- {
- x5=1;
- x6=0;
- }
- if(x5==10)
- {
- x5=0;
- x6++;
- }
- yue=x5+x6*16;
- write_sfm(6,yue);
- write_com(0x80+7);
- }
- if(s1num==7)
- {
- int x5,x6;
- x5=nian%16;
- x6=nian/16;
- x5++;
- if(x6>=2&&x5>=1)
- {
- x5=1;
- x6=0;
- }
- if(x5==10)
- {
- x5=0;
- x6++;
- }
- nian=x5+x6*16;
- write_sfm(3,nian);
- write_com(0x80+4);
- }
- }
- }
- }
-
-
-
-
-
-
-
- if(s1num!=0||s4num!=0) // 在調(diào)整模式下
- {
- if(s3==0) //如果確定鍵按下
- {
- delay(5);
- if(s3==0) //延時(shí)并重新檢測(cè)S3是否按下,用于差小誤差
- {
- if(s1num!=0)
- {
- while(!s3);
- didi();//在松手時(shí)將調(diào)整后的時(shí)間、日期及周信息寫 入DS1302,退出調(diào)整模式并隱藏光標(biāo),按鍵次數(shù)清0
- write_1302(0x8e,0x00);
- write_1302(0x80,miao);
- write_1302(0x84,shi);
- write_1302(0x82,fen);
- write_1302(0x8a,zhou);
- write_1302(0x8c,nian);
- write_1302(0x88,yue);
- write_1302(0x86,ri);
- write_1302(0x8e,0x80);
- flag1=0;
- write_com(0x0c);
- s1num=0;
- gudingtime_1602();
- }
- if(s4num!=0)
- {
- while(!s3);didi();//再松手是將調(diào)整后的時(shí)間、日期及周信息寫入DS1302,退出調(diào)整模式并隱藏光標(biāo),按鍵次數(shù)清0
- write_1302(0x8e,0x00);
- write_1302(0xc0,lshi);
- write_1302(0xfc,lfen);
- write_1302(0x8e,0x80);
- flag2=0;
- write_com(0x0c);
- s4num=0;
- gudingtime_1602();
- }
- }
- }
- }
- if(s4==0&&s1num==0) //按鍵4按下*次且s1再次之前未曾按 過(guò)
- {
- delay(5);
- if(s4==0&&s1num==0)
- {
- s4num++;
- flag2=1;
- while(!s4);didi();
- if(s4num==1)
- {
- gudingtime_1602_1();
- lshi=read_1302(0xc1);//從ds1302里面的RAM讀取鬧鐘時(shí), 此處不放在while(1)大循環(huán)里面是因?yàn)閐s1302里面的RAM里的數(shù)據(jù)是不變的只需讀取一次
- lfen=read_1302(0xfd);//從ds1302里面的RAM讀取鬧鐘分
- write_sfm(0x40+10,lshi);//將鬧鐘時(shí)送到1602顯示
- write_com(0x80+0x40+12);//將鬧鐘:送到1602顯示
- write_data(table1[3]);
- write_sfm(0x40+13,lfen);//將鬧鐘分送到1602?
- write_com(0x80+0x40+14);
- write_com(0x0f);
- }
- if(s4num==2)
- {
- write_1302(0x8e,0x00); //禁止寫保護(hù)
- write_1302(0xfc,lfen); //鬧鐘初始化
- write_1302(0x8e,0x80); //開(kāi)寫保護(hù)
- lshi=read_1302(0xc1); //從ds1302里面的RAM讀取鬧鐘 時(shí),此處不放在while(1)大循環(huán)里面是因?yàn)閐s1302里面的RAM里的數(shù)據(jù)是不變的只需讀取一次
- lfen=read_1302(0xfd); //從ds1302里面的RAM讀取鬧鐘分
- write_sfm(0x40+10,lshi);//將鬧鐘時(shí)送到1602顯示
- write_sfm(0x40+13,lfen);//將鬧鐘分送到1602顯示
- write_com(0x80+0x40+11);
- write_com(0x0f);
- }
- if(s4num==3)
- {
- s4num=0;
- flag2=0;
- write_1302(0x8e,0x00);//禁止寫保護(hù)
- write_1302(0xc0,lshi);//鬧鐘初始化
- write_1302(0x8e,0x80);//開(kāi)寫保護(hù)
- write_com(0x0c); //不顯示光標(biāo)
- write_com(0x01); //顯示清0
- gudingtime_1602();
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
單片機(jī)課程設(shè)計(jì)伍錫華 - r9wm4.doc
(1.43 MB, 下載次數(shù): 45)
2017-5-22 08:02 上傳
點(diǎn)擊文件名下載附件
萬(wàn)年歷 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|