基于單片機(jī)80C51模擬路燈控制系統(tǒng)的課題設(shè)計(jì)_第1頁
基于單片機(jī)80C51模擬路燈控制系統(tǒng)的課題設(shè)計(jì)_第2頁
基于單片機(jī)80C51模擬路燈控制系統(tǒng)的課題設(shè)計(jì)_第3頁
基于單片機(jī)80C51模擬路燈控制系統(tǒng)的課題設(shè)計(jì)_第4頁
基于單片機(jī)80C51模擬路燈控制系統(tǒng)的課題設(shè)計(jì)_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、模擬路燈控制系統(tǒng)的設(shè)計(jì)摘要 本系統(tǒng)以avr低功耗單片機(jī)系列atmega16l為核心組成支路控制系統(tǒng),采用專用時(shí)鐘芯片實(shí)現(xiàn)精確的時(shí)鐘功能,設(shè)定并顯示開關(guān)燈時(shí)間。該控制系統(tǒng)能根據(jù)環(huán)境明暗變化自動(dòng)開燈和關(guān)燈,以達(dá)到節(jié)能要求。atmega16l是一款高性能、低功耗的8位avr微處理器,使系統(tǒng)在低功耗的狀態(tài)下穩(wěn)定工作。系統(tǒng)采用線路簡單、體積小的專用時(shí)鐘芯片ds1302,ds1302工作時(shí)功耗很低,保持?jǐn)?shù)據(jù)和時(shí)鐘信息時(shí)功率小于1mw。使用ds1302不但使電路功耗降低,而且節(jié)省io口資源。采用低功耗的字符型液晶作為顯示器件,顯示更為直觀。使用光敏電阻來檢測環(huán)境明暗的變化,光敏電阻在不同光強(qiáng)下電阻值會(huì)發(fā)生明

2、顯變化,單片機(jī)內(nèi)部ad采集電阻值的變化量達(dá)到檢測目的。采用對射式收發(fā)一體光電傳感器檢測物體的運(yùn)動(dòng),使用靈敏光電傳感器更有效地實(shí)現(xiàn)在物體運(yùn)動(dòng)過程中路燈的自動(dòng)控制,達(dá)到節(jié)能的要求。當(dāng)路燈電路出現(xiàn)故障時(shí),單片機(jī)采集路燈電路采樣點(diǎn)的電壓后處理采集到的數(shù)據(jù),實(shí)現(xiàn)自動(dòng)報(bào)警功能。該系統(tǒng)基于可靠的硬件設(shè)計(jì)和穩(wěn)定的軟件算法實(shí)現(xiàn)題目基本要求。關(guān)鍵詞:atmega16l 功耗 節(jié)能 光電傳感器 目 錄一、 設(shè)計(jì)任務(wù)- 2 -1.1任務(wù)- 2 -1.2 要求- 2 -二、方案論證與比較- 3 -三、總體設(shè)計(jì)方案- 3 -1.支路控制系統(tǒng)設(shè)計(jì)- 4 -(1)時(shí)鐘模塊- 4 -(2)信號采集模塊的設(shè)計(jì)- 5 -(3)顯示

3、、按鍵模塊- 6 -(4)路燈控制模塊- 6 -(5) 聲光報(bào)警模塊- 6 -(6) 電源模塊- 7 -2.軟件設(shè)計(jì)- 13 -四、結(jié)果分析- 13 -五、結(jié)論- 14 -六、參考文獻(xiàn)- 14 -附錄1 系統(tǒng)原理圖- 15 -附錄2 程序清單- 16 -一、 設(shè)計(jì)任務(wù)1.1任務(wù)設(shè)計(jì)并制作一套模擬路燈控制系統(tǒng)??刂葡到y(tǒng)結(jié)構(gòu)如圖1所示,路燈布置如圖2所示。圖1 路燈控制系統(tǒng)示意圖圖2 路燈布置示意圖(單位:cm)1.2 要求 1基本要求(1)支路控制器有時(shí)鐘功能,能設(shè)定、顯示開關(guān)燈時(shí)間,并控制整條支路按時(shí)開燈和關(guān)燈。(2)支路控制器應(yīng)能根據(jù)環(huán)境明暗變化,自動(dòng)開燈和關(guān)燈。(3)支路控制器應(yīng)能根據(jù)交通

4、情況 自動(dòng)調(diào)節(jié)亮燈狀態(tài):當(dāng)可移動(dòng)物體m(在物體前端標(biāo)出定位點(diǎn),由定位點(diǎn)確定物體位置 )由左至右到達(dá)s點(diǎn)時(shí)(見圖2),燈1亮;當(dāng)物體m到達(dá)b點(diǎn)時(shí),燈1滅,燈2亮;若物體m由右至左移動(dòng)時(shí),則亮燈次序與上相反。(4)支路控制器能分別獨(dú)立控制每 只路燈的開燈和關(guān)燈時(shí)間。(5)當(dāng)路燈出現(xiàn)故障時(shí)(燈不亮), 支路控制器應(yīng)發(fā)出聲光報(bào)警信號,并顯示有故障路燈的地址編號。 2發(fā)揮部分 (1)自制單元控制器中的led燈恒流驅(qū)動(dòng)電源。(2)單元控制 器具有調(diào)光功能,路燈驅(qū)動(dòng)電源輸出功率能在規(guī)定時(shí)間按設(shè)定要求自動(dòng)減小,該功率應(yīng) 能在20%100%范圍內(nèi)設(shè)定并調(diào)節(jié),調(diào)節(jié)誤差2%。(3)其它(性 價(jià)比等)。 二、方案論證

5、與比較 方案一:題目要求設(shè)計(jì)一個(gè) 模擬路燈控制系統(tǒng),實(shí)現(xiàn)支路控制器對單元控制器的有效控制。本系統(tǒng)采用atmega16l單片機(jī)為主控芯片,采用對射式收發(fā)一體的光電傳感器采集由于物體運(yùn)動(dòng)所產(chǎn)生的信號,再 由支路控制器系統(tǒng)對信號進(jìn)行處理實(shí)現(xiàn)對路燈的合理控制,以達(dá)到題目要求。支路控制器 的時(shí)鐘采用精確的時(shí)鐘芯片并由字符型液晶作為顯示,利用按鍵設(shè)定、修改開關(guān)燈時(shí)間。 系統(tǒng)采用光敏電阻分壓的方式感應(yīng)周圍環(huán)境明暗的變化,支路控制系統(tǒng)采集分壓值經(jīng)單片 機(jī)處理后來控制路燈的變化。當(dāng)路燈出現(xiàn)故障后路燈電路中采樣點(diǎn)的電壓值會(huì)發(fā)生變化, 單片機(jī)根據(jù)變化量進(jìn)行相應(yīng)的處理?;谠O(shè)計(jì)思路在設(shè)計(jì)過程中選擇合適的元器件,使用

6、合適的單元電路模塊,更有效的達(dá)到設(shè)計(jì)要求。 方 案二:與方案一不同的是方案二選用at89s52芯片,采用紅外對管對物體的移動(dòng)進(jìn)行檢測,時(shí)鐘由單片機(jī)定時(shí)器實(shí)現(xiàn)。方案比較 :與at89s52相比,atmega16l在性能上具有明顯的優(yōu)勢,若采用紅外對管則給元件的安 裝帶來不便,且不易調(diào)試;由單片機(jī)定時(shí)器實(shí)現(xiàn)的時(shí)鐘不準(zhǔn)確,故采用方案一。 三、總體設(shè)計(jì)方案本系統(tǒng)以atmega16l為控制核心 。整個(gè)系統(tǒng)硬件框圖如圖1所示: 圖3 系統(tǒng)框圖1.支路控制系統(tǒng)設(shè)計(jì) 圖4 最小系統(tǒng)支路控制系統(tǒng)是模擬路燈控制系 統(tǒng)的核心,該系統(tǒng)采用atmel公司的atmega16l單片機(jī)作為主控制芯片來實(shí)現(xiàn)對受控對 象的控制。

7、與at89s52相比,atmega16l是一款高性能、低功耗的8位avr微處理器,具 有速度快、輸出電流大、工作電壓范圍寬、成本低等優(yōu)點(diǎn),是一款性價(jià)比很高的單片機(jī)。 (1) 時(shí)鐘模塊 圖5 時(shí) 鐘電路為實(shí)現(xiàn)精確的時(shí)鐘功能并節(jié)省單片機(jī)io 口資源,該設(shè)計(jì)使用專用的接口方式為串行的時(shí)鐘芯片ds1302,該芯片線路簡單、體積小 ,易于操作,且價(jià)格低廉。ds1302 是美國dallas公司推出的一種高性能、低功耗、帶ram的實(shí)時(shí)時(shí)鐘電路,它可以對年、月、日、周日、時(shí)、分、秒進(jìn)行計(jì)時(shí),具有閏 年補(bǔ)償功能,工作電壓為2.5v5.5v。采用三線接口與cpu進(jìn)行同步通信,并可采用 突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)

8、鐘信號或ram數(shù)據(jù)。ds1302內(nèi)部有一個(gè)318的用于 臨時(shí)性存放數(shù)據(jù)的ram寄存器。ds1302是ds1202的升級產(chǎn)品,與ds1202兼容,但 增加了主電源/后背電源雙電源引腳,同時(shí)提供了對后背電源進(jìn)行涓細(xì)電流充電的能 力。另外該芯片有備份電源引腳,可以在斷電后仍能工作,以保證時(shí)鐘的準(zhǔn)確性。ds1302與單片機(jī)之間能簡單的采用同步串行方式進(jìn)行通信,僅需用到三個(gè)口線:(1)res(復(fù)位), (2)i/o(數(shù)據(jù)線),(3)sclk(串行時(shí)鐘)。x1和x2是振蕩源,外接32.768khz晶振 。rst是復(fù)位/片選線,通過把rst輸入驅(qū)動(dòng)置高電平來啟動(dòng)所有的數(shù)據(jù)傳送。rst 輸入有兩種功能:首先,

9、rst接通控制邏輯,允許地址/命令序列送入移位寄存器;其 次,rst提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)rst為高電平時(shí),所有的數(shù)據(jù)傳送被初始化,允許對ds1302進(jìn)行操作。如果在傳送過程中rst置為低電平,則會(huì)終止 此次數(shù)據(jù)傳送,i/o引腳變?yōu)楦咦钁B(tài)。上電運(yùn)行時(shí),在vcc2.0v之前,rst必須保持 低電平。只有在sclk為低電平時(shí),才能將rst置為高電平。ds1302 存在時(shí)鐘精度不 高,易受環(huán)境影響,出現(xiàn)時(shí)鐘混亂等缺點(diǎn)。ds1302可以用于數(shù)據(jù)記錄,特別是對某些 具有特殊意義的數(shù)據(jù)點(diǎn)的記錄,能實(shí)現(xiàn)數(shù)據(jù)與出現(xiàn)該數(shù)據(jù)的時(shí)間同時(shí)記錄。這種記錄 對長時(shí)間的連續(xù)測控系統(tǒng)結(jié)果的分析及對異常數(shù)據(jù)出

10、現(xiàn)的原因的查找具有重要意義。傳統(tǒng)的數(shù)據(jù)記錄方式是隔時(shí)采樣或定時(shí)采樣,沒有具體的時(shí)間記錄,因此,只能記錄 數(shù)據(jù)而無法準(zhǔn)確記錄其出現(xiàn)的時(shí)間;若采用單片機(jī)計(jì)時(shí),一方面需要采用計(jì)數(shù)器,占 用硬件資源,另一方面需要設(shè)置中斷、查詢等,同樣耗費(fèi)單片機(jī)的資源,而且,某些 測控系統(tǒng)可能不允許。但是,如果在系統(tǒng)中采用時(shí)鐘芯片ds1302,則能很好地解決這 個(gè)問題。ds1302工作時(shí)功耗很低,保持?jǐn)?shù)據(jù)和時(shí)鐘信息時(shí)功率小于1mw。 (2) 信號采集模塊的設(shè)計(jì) 圖6 采樣電路讓他和人信號采集模塊包括物體檢測模塊和環(huán)境明暗檢測模 塊,兩者功能如下:物體檢測模塊:該模塊需要檢測小車的移動(dòng),并根據(jù)小車的移動(dòng)進(jìn)行路燈開關(guān)的自動(dòng)

11、控制。基于此目的采用探測距離遠(yuǎn)、靈敏度高的反射式光電傳感器進(jìn)行檢測,當(dāng)傳感器檢測到小車時(shí),傳感器給單片機(jī)一個(gè)信號,然后單片機(jī)對路燈進(jìn)行合理控制,達(dá)到題目要求。環(huán)境明暗檢測模塊:該模塊需要檢測環(huán)境光的變化,根據(jù)環(huán)境光的明暗進(jìn)行路燈開關(guān)的自動(dòng)控制?;诖艘蟛捎糜晒饷綦娮杞M成的分壓電路進(jìn)行檢測。光敏電阻器又稱光導(dǎo)管,特性是在特定光的照射下,其阻值迅速減小,可用于檢測可見光。在不同的光強(qiáng)下,光敏電阻的電阻值會(huì)發(fā)生明顯變化,光敏電阻器是利用半導(dǎo)體的光電效應(yīng)制成的一種電阻值隨入射光的強(qiáng)弱而改變的電阻器;入射光強(qiáng),電阻減小,入射光通過檢測不同光強(qiáng)下電阻值的變化量來控制路燈的開和關(guān)。(3) 顯示、按鍵模塊

12、圖7 1602顯示及按鍵電路通過按鍵可以調(diào)節(jié)和設(shè)定路燈的開關(guān)時(shí)間,控制整條支路按時(shí)開燈和關(guān)燈,并在字符液晶上顯示出來。字符型液晶因具有體積小、功耗低、壽而已命長、價(jià)格低、接口控制方便及顯示操作簡單等優(yōu)點(diǎn)而被廣泛應(yīng)用。我們這里用到的是16 02液晶,1602液晶為5v電壓驅(qū)動(dòng),帶背光,可顯示2行,每行16個(gè)字符,不能顯示漢字,內(nèi)置128個(gè)字符的ascii字符集庫,只有并口接口,無串口接口。(4) 路燈控制模塊圖8 路燈控制電路該模塊采用節(jié)能的1w led燈,當(dāng)電路出現(xiàn)故障時(shí),單片機(jī)通過內(nèi)部ad采集電路采樣點(diǎn)的電壓變化量后對數(shù)據(jù)進(jìn)行處理。(5) 聲光報(bào)警模塊 認(rèn)同uyhes圖9 聲光報(bào)警電路 當(dāng)系

13、統(tǒng)出現(xiàn)故障時(shí),蜂鳴器會(huì)發(fā)出警報(bào)聲,同時(shí)報(bào)警指示燈也會(huì)點(diǎn)亮。(6) 電源模塊圖10 5v穩(wěn)壓電路 電源是系統(tǒng)中最重要的模塊之一,輸入電源經(jīng)穩(wěn)壓塊后輸出穩(wěn)定的+5v電源,用以驅(qū)動(dòng)整個(gè)系統(tǒng)。(7) 恒流源模塊1. 原理介紹:恒流源是輸出電流保持不變的電流源,而理想的恒流源為:a)不因負(fù)載(輸出電壓)變化而改變。b)不因環(huán)境溫度變化而改變。c)內(nèi)阻為無限大。 (3-1)恒流源之電路符號: 理想的恒流源 實(shí)際的流源圖11 恒流源理想的恒流源,其內(nèi)阻為無限大,使其電流可以全部流出外面。實(shí)際的恒流源皆有內(nèi)阻r。2.三極管的恒流特性: 圖12 三極管恒流特性咕()b一蛾從三極管特性曲線可見,工作區(qū)內(nèi)的ic受i

14、b影響,而vce對ic的影響很微。因此,只要ib值固定,ic亦都可以固定。輸出電流io即是流經(jīng)負(fù)載的ic。 (3-2)電流鏡電路currentmirror:電流鏡是一個(gè)輸入電流is與輸出電流io相等的電路: 圖13 電流鏡電路q1和q2的特性相同,即vbe1=vbe2,1=2。 (3-3)三極管之受溫度的影響,但利用電流鏡像恒流源,不受影響,主要依靠外接電阻r經(jīng)q2去決定輸出電流io(ic2=io)。方案1: 圖14 恒流源電路咕()b一從左邊看起:基極偏壓 (3-4)所以 ve=vb-0.6=1.0v (3-5) 又因?yàn)樯錁O電阻是1k,流經(jīng)射極電阻的電流是 (3-6)所以流經(jīng)負(fù)載的電流就就是

15、穩(wěn)定的1ma方案2. 圖15 恒流源電路這是個(gè)利用穩(wěn)壓二極管提供基極偏壓5.6v,ve=vb-0.6=0.5v,流經(jīng)負(fù)載的電流 (3-7)方案3. 圖16 恒流源電路 這個(gè)有一點(diǎn)不同:利用pnp三極管供應(yīng)電流給負(fù)載電路.首先,利用二極管0.6v的壓降,提供8.2v基極偏壓(103x0.6=8.2).4.7k電阻只是用來形成通路,而且不希望(也不會(huì))有很多電流流經(jīng)這個(gè)電阻。ve=vb+0.6=8.8v,pnp晶體的560歐姆電阻兩端電位差是1.2v,所以電流是2ma。如果只用一個(gè)三極管不能滿足需求,可以用兩個(gè)三極管架成: 圖17 恒流源或是 圖18 恒流源方案4.電路圖如下所示:兒也是圖19 恒

16、流源電路圖中的第一組運(yùn)放電路是跟隨器,對輸入的電壓取樣電路進(jìn)行阻抗變換。最前面的雙向開關(guān)負(fù)責(zé)將正負(fù)12v電壓接入,這個(gè)電壓是運(yùn)放的供電電壓,并提供給其他線路作為電源輸入,c24和c25電容是運(yùn)放正負(fù)電源端的濾波電容,緊靠運(yùn)放電源引腳。r11和電位器rw4組成了一個(gè)電壓取樣電路,通過改變電位器rw4滑動(dòng)端的位置取出不同的電壓值,同時(shí)這個(gè)取出的電壓值也是輸出電流的正比例控制值,電位器滑動(dòng)頭的電壓就按照串聯(lián)分壓的方式計(jì)算得出,后端的r15和電容c20作為取出電壓信號的阻容濾波電路,因?yàn)楹蠖私拥氖沁\(yùn)放的正端,電位器的滑動(dòng)頭不輸出電流。運(yùn)放的1腳輸出的電壓等于3腳的電壓,既是電位器滑動(dòng)端的電壓值。運(yùn)放上

17、面的r12和d9是供電電源12v的指示電路,12v通過開關(guān)供給后d9發(fā)光指示電壓正常。后面的一組運(yùn)放是實(shí)現(xiàn)電壓到恒流的轉(zhuǎn)換,電路中有正反饋也有負(fù)反饋,但線路是穩(wěn)定的狀態(tài),計(jì)算的時(shí)候運(yùn)放也是按照虛短和虛斷的分析方式,c21是電壓信號的濾波電容,假設(shè)第一組運(yùn)放1腳輸出的電壓是v,第二組運(yùn)放5腳正端的電壓是v1,那么電阻rs1左端的電壓值為2v1,因?yàn)殡娮鑢16和r18是相同的數(shù)值。電阻rs1右端的電壓按照r13和r14分壓電路計(jì)算的話數(shù)值是v1-(v-v1)=2v1-v,這樣我們就可以計(jì)算出rs1兩端的電壓是v,所以流過rs1電阻的電流是恒定的,另外考慮到rx1和r13相對rs1和負(fù)載的阻值不在同

18、一個(gè)數(shù)量級,比他們大好多倍,因此流過rs1的電流基本都流向負(fù)載,很少量的電流流向r13和rx1,所以輸出的電流基本是恒定的。在以上的計(jì)算中v1的數(shù)值是不確定的,他是根據(jù)負(fù)載的大小變化的,但是不論v1的數(shù)值怎么變化,通過計(jì)算可以知道流過電阻rs1的電流是不變的,以為它兩端的電壓是v,而v這個(gè)電壓值是第一組運(yùn)放的輸出,在電位器ser一不調(diào)節(jié)的時(shí)候v的數(shù)值是固定的,流過rs1的電流不變,所以輸出電流也不變,實(shí)現(xiàn)恒流控制。后面一組運(yùn)放電路中q4三極管的作用時(shí)增大運(yùn)放的電流輸出能力,因?yàn)樨?fù)載比較小,運(yùn)放驅(qū)動(dòng)能力還是認(rèn)同與蛾可能不夠,r19基本沒有作用在電路中,rx1可能是負(fù)載或者假負(fù)載,比如輸出不接任何

19、負(fù)載,電流基本都流過rx1,如果不接rx1,在沒有負(fù)載的情況下輸出就是電壓最大值接近12v,在這種電壓輸出下,運(yùn)放的正負(fù)端會(huì)有較大的壓差,有可能會(huì)損壞運(yùn)放358。同時(shí)在線路的設(shè)計(jì)上也要保證負(fù)載流過恒定電流產(chǎn)生的電壓值不能超過12v,如果超過電源供電電壓,不能實(shí)現(xiàn)恒流工作性能。rx1不取吧,估計(jì)也沒事,取小了對負(fù)載不好,要比負(fù)載大10倍以上啊,要忽略流過他的電流 本系統(tǒng)采用方案四的恒流源電路,以實(shí)現(xiàn)系統(tǒng)的功能。2.軟件設(shè)計(jì)系統(tǒng)流程圖如下:開始初始化判斷環(huán)境在明暗判斷移動(dòng)小車位置判斷l(xiāng)ed燈好壞設(shè)置實(shí)時(shí)時(shí)間、開關(guān)燈時(shí)間顯示并輸出相應(yīng)動(dòng)作圖10 流程圖 c語言表達(dá)能力和運(yùn)算能力比較強(qiáng),且具有很好的可

20、移植性和硬件控制能力。采用icc avr編譯器。icc avr是眾多avr單片ser一 機(jī)應(yīng)用開發(fā)軟件中的優(yōu)秀軟件之一,界面友好,易學(xué)易用。四、結(jié)果分析該系統(tǒng)能完成基本功能部分,傳感器檢測物體運(yùn)動(dòng)的最大誤差為正負(fù)1cm,光敏電阻在正常光照情況下電阻值為2k,在強(qiáng)光下電阻值為200歐姆,在黑暗情況下2m.。路燈電路正常時(shí)采樣點(diǎn)電壓為3v左右,在開路故障時(shí)電壓為0v。五、結(jié)論硬件設(shè)計(jì)和軟件設(shè)計(jì)是電子設(shè)計(jì)中不可缺少的內(nèi)容,為了滿足設(shè)計(jì)的功能和指標(biāo)的要求,我們必須在開始設(shè)計(jì)時(shí)就考慮到硬件與軟件的協(xié)調(diào);不然會(huì)增加軟件實(shí)現(xiàn)時(shí)困難和復(fù)雜程度,有時(shí)即使硬件和軟件單獨(dú)能用,卻不能使他們組成的系統(tǒng)工作,故在設(shè)計(jì)的

21、過程中必須考慮軟硬件的處理能力以及它們的接口是否兼容,實(shí)現(xiàn)軟硬件的信號過渡。 六、參考文獻(xiàn)【1】 高吉祥.全國大學(xué)生電子設(shè)計(jì)競賽系列教程【m】.北京:電子工業(yè)出版社.2007【2】 張志良.模擬電子技術(shù)【m】.北京:機(jī)械工業(yè)出版社.2006【3】 何小艇.電子系統(tǒng)設(shè)計(jì)【m】.杭州:浙江大學(xué)出版社.2004【4】 胡斌.元器件及實(shí)用電路解說【m】.北京:電子工業(yè)出版社.2007【5】 刁鳴.常用電路模塊分析與設(shè)計(jì)指導(dǎo)【m】.北京:清華大學(xué)出版社.2008【6】 唐競新.數(shù)字電路基礎(chǔ)【m】.北京:清華大學(xué)出版社.2003附錄1 系統(tǒng)原理圖附錄2 程序清單/*/#include /包含型號頭文件#i

22、nclude /包含位操作頭文件#include b.c#define uchar unsigned char問天網(wǎng)他#define uint unsigned int/*1602控制位的宏定 義*/#define lcd_out ddrc=0xff /數(shù)據(jù)端設(shè)為輸出#define lcd_c_ddr ddrd|=0xe0 /控制端設(shè)為輸出 #define lcd_data portc /發(fā)送數(shù)據(jù)端#define lcd_rs_h portd|=bit(pd5); /操作的是命令#define lcd_rs_l portd&=bit(pd5); /操作的是數(shù)據(jù)#define lcd_rw_h

23、portd|=bit(pd6); /從1602讀#define lcd_rw_l portd&=bit(pd6); /向1602寫#define lcd_oe_h portd|=bit(pd7); /1602使能#define lcd_oe_l portd&=bit(pd7); /1602不使能#define lcda_curon0x0e/ 顯示光標(biāo)#define lcda_curfla0x0f/ 打開光標(biāo)閃爍/*rtc常量*/ #define rtc_clk pb7#define rtc_data pb5#define rtc_cs pc7#define rd 0x01#define wr

24、0x00#define c_sec0x80/秒#define c_min0x82/分#define c_hr0x84/時(shí)#define c_wp0x8e/控制(寫保護(hù))#define c_burst0xbe/時(shí)鐘 蛾dg 多字節(jié)#define clk_halt0x80/停止時(shí)sst鐘控制位 #definstwte clk_start0x00/啟動(dòng)時(shí)鐘 #define protect0x80/寫保護(hù)控制位 #define uprotect0x00/寫保護(hù)控制位 /*按鍵常量控制位的宏定義*/#define key_out ddra|=0xf8/按鍵方向定義輸出#define key_in ddr

25、a&=0x07/按鍵方向定義輸入#define kghbbgfsey_data pina /讀按鍵端口#define key_oust_h porta|=0xf8 /按鍵端口輸出高電平erg#prgdagma data:code const duchar table=0x30,0x31,0x32,0x33,0x34, d 0x35,0x36,0x37,0x38,d 0x39; /*gd*全局變量宏定義*/uchar hour,hghdourshi,hourge,minute,minuteshi,minutege, second,strecondshi,secondge,haomiao,haom

26、iaoshi,haomiaoge;uchar chucun;/fg存儲(chǔ)設(shè)置時(shí)間時(shí)的當(dāng)前值ghvoghid delayns(uint us) rht uintrut i; us=utys*5/4; /5/4是在8mhz晶振下,通過軟件仿真反復(fù)實(shí)驗(yàn)得到的數(shù)值 for( i=0ye;ius;i+); void delay(yuint ms) ty uitnt i,j; foutr( i=0;ims;i+) for(tuj=0;j1141;j+);/1141是在8mhz晶振下,通過軟件仿真反復(fù)實(shí)驗(yàn)得到的數(shù)值/*tur*函數(shù)名稱tru: lcd1602_write_com(uchar com)功 能:

27、ut向1602液晶寫入一個(gè)字節(jié)指令參 數(shù): coutm是指令返回值 : 無tu/*/void lcd1602_uywrite_com(uchar com)yu utr lcd_rs_l; lcd_rw_l; true lcd_data=com; dutrelay(5); lcdtru_oe_h; delay(5tur); lcd_oe_utrl;utr/*函數(shù)tru名稱: lcd1602_write_dat(uchar dat)功 能utr: 向1602液晶寫入一個(gè)字節(jié)數(shù)據(jù)參 數(shù): datrut是數(shù)據(jù)返回值 : 無tru/*rtu*/void lcd1602_write_dat(uchar d

28、at) rtu lrtucd_rs_h; lcdrtu_rw_l; lcd_drutata=dat; delay(5);rut lcd_oe_hrut; delay(5);rut lcd_oe_lu;sru/*函數(shù)名稱: lcd1602_init()功 yse 能: 初始化1602液晶參 ry數(shù): 無返回值 ser: 無/*u*/void lcd1602se55u_init()s lrucd_out; lcsrud_c_ddr; lcd_oe_l; lcd1urt602_write_com(0x38);/設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口 delay(5);tru lcd1602_wr

29、ite_com(0x0c);/設(shè)置開顯示,不顯示光標(biāo) delay(5); lcd1602_write_com(0x01);/顯示清0,數(shù)據(jù)指針清0 delay(5); lcd1602_write_com(0x06);/寫一個(gè)字符后地址指針加1 delay(5); /lcd1602_write_com(0x80+0x0f);/將數(shù)據(jù)指針定位到第一行第一個(gè)字處:lcd1602_write_com(0x80) /delay(5); /寫第二行時(shí)要重新定位數(shù)據(jù)指針 /write_com(0x80+0x40) /*函數(shù)名稱: ds1302_init功 能: 初始化ds1302的數(shù)據(jù)接口參 數(shù): 無返回值

30、 : 無/*/void ds1302_portinit(void) ddrb|=bit(rtc_clk)|bit(rtc_data)|bit(rtc_cs);/將時(shí)鐘端(rtc_clk)數(shù)據(jù)端(rtc_data)片選端(rtc_cs)設(shè)置為輸出 ds1302_writed(c_wp|wr,uprotect); /寫入寫允許命令 ds1302_writed(c_sec|wr,clk_start);/啟動(dòng)振蕩器,ds1302開始工作 ds1302_writed(c_wp|wr,protect); /控制命令,wp位為1,不允許寫操作 /*函數(shù)名稱: ds1302_writeb功 能: 向ds130

31、2寫入一個(gè)字節(jié)數(shù)據(jù)(沒有rst操作)參 數(shù): byte-要寫入的數(shù)據(jù)返回值 : 無/*/void ds1302_writeb(uchar byte) uchar i; for(i=0;i=1; /數(shù)據(jù)右移1位,為送出新數(shù)據(jù)位做準(zhǔn)備 /*函數(shù)名稱: ds1302_writed功 能: 向ds1302的某個(gè)地址寫入一個(gè)字節(jié)數(shù)據(jù)參 數(shù): addr-地址值(寄存器或ram) data-要寫入的地址返回值 : 無/*/void ds1302_writed(uchar addr,uchar data) portc&=bit(rtc_cs); /拉低片選端 portb&=bit(rtc_clk); /拉低時(shí)

32、鐘端 delayns(10); portc|=bit(rtc_cs); /拉高片選端 delayns(10); /調(diào)整片選脈沖 ds1302_writeb(addr); /寫入操作命令(地址) delayns(10); portb&=bit(rtc_clk); /拉低時(shí)鐘端 delayns(10); ds1302_writeb(data); /寫入數(shù)據(jù) portb&=bit(rtc_clk); /拉低時(shí)鐘端 delayns(10); /調(diào)整片選脈沖 portc&=bit(rtc_cs); /拉低片選端/*函數(shù)名稱: ds1302_sett功 能: 設(shè)置ds1302的時(shí)間參 數(shù): pttimed

33、-設(shè)置時(shí)間數(shù)組指針返回值 : 無/*/void ds1302_sett(uchar pttimed) uchar i; uchar addr = 0x80; /寫入地址從秒寄存器開始 ds1302_writed(c_wp|wr,uprotect); /控制命令,wp位為0,允許寫操作delay(5); for(i=0;i7;i+) ds1302_writed(addr|wr,pttimedi); / 秒 分 時(shí) 日 月 星期 年 addr+=2;delay(1); ds1302_writed(c_wp|wr,protect); /控制命令,wp位為1,不允許寫操作 /*函數(shù)名稱: ds1302

34、_readb功 能: 從ds1302讀出一個(gè)字節(jié)數(shù)據(jù)(沒有rst操作)參 數(shù): 無返回值 : byte-讀出的數(shù)據(jù)/*/uchar ds1302_readb(void) uchar i,byte=0; ddrb&=bit(rtc_data); /將數(shù)據(jù)端口設(shè)置為輸入 portb&=bit(rtc_data); /無上拉電阻 for(i=0;i=1; /保存讀入的數(shù)據(jù)位 portb|=bit(rtc_clk); /時(shí)鐘上升沿 delayns(10); /延時(shí),調(diào)整時(shí)鐘脈沖寬度 portb&=bit(rtc_clk); /時(shí)鐘下降沿,ds1302輸出數(shù)據(jù)位 delayns(10); /等待數(shù)據(jù)變化

35、(mega16太快,必須等待ds1302的數(shù)據(jù)位輸出,否則不能正確讀出) if(pinb&bit(rtc_data) /當(dāng)前位是否是高電平 byte|=bit(pb7); /是高電平就將返回?cái)?shù)據(jù)的當(dāng)前位置1 else byte&=bit(pb7); /是低電平就將返回?cái)?shù)據(jù)的當(dāng)前位置0 ddrb|=bit(rtc_data); /最后將數(shù)據(jù)端口設(shè)置為輸出 return byte; /返回讀出的數(shù)據(jù) /*函數(shù)名稱: ds1302_readd功 能: 從ds1302的某個(gè)地址讀出一個(gè)字節(jié)數(shù)據(jù)參 數(shù): addr-地址值(寄存器或ram)返回值 : data-讀出的數(shù)據(jù)/*/uchar ds1302_r

36、eadd(uchar addr) uchar data; portc&=bit(rtc_cs); /拉低片選端 portb&=bit(rtc_clk); /拉低時(shí)鐘端 delayns(10); portc|=bit(rtc_cs); /拉高片選端 delayns(10); /調(diào)整片選脈沖 ds1302_writeb(addr); /寫入操作命令(地址) delayns(10); data=ds1302_readb(); /讀出數(shù)據(jù) delayns(10); portb&=bit(rtc_clk); /拉低時(shí)鐘端 portc&=bit(rtc_cs); /拉低片選端 return data; /

37、返回讀出的數(shù)據(jù)/*函數(shù)名稱: ds1302_gett功 能: 讀取ds1302的當(dāng)前時(shí)間參 數(shù): time-讀取的時(shí)間數(shù)組返回值 : 無/*/void ds1302_gett(uchar time) uchar i; delayns(10); portc|=bit(rtc_cs); /拉高片選端 delayns(10); /調(diào)整片選脈沖 ds1302_writeb(0xbf); / 0xbf:時(shí)鐘多字節(jié)讀取命令 for (i=0;i8;i+) /時(shí)間數(shù)據(jù)的存放格式是: /秒,分,時(shí),日,月,星期,年,控制 timei=ds1302_readb(); /【7個(gè)數(shù)據(jù)(bcd格式)+1個(gè)控制】 po

38、rtc&=bit(rtc_cs); /拉低片選端 portb&=bit(rtc_clk); /拉低時(shí)鐘端(時(shí)鐘端在不操作時(shí)為低)/*函數(shù)名稱: display功 能: 讀取ds1302的當(dāng)前時(shí)間參 數(shù): time-讀取的時(shí)間數(shù)組返回值 : 無/*/void display(uchar add,uchar dat) lcd1602_write_com(add); delay(2); lcd1602_write_dat(dat); delay(2);/*函數(shù)名稱: key_press功 能: 檢測是否有鍵按下參 數(shù): 無返回值 : 鍵按下時(shí)為1,否則為0/*/uchar key_press() u

39、char temp;key_out;key_out_h;key_in;temp=key_data;temp&=0xf8;if(temp=0xf8) return 0;else return 1;/*函數(shù)名稱: key_scan功 能: 檢測是哪個(gè)鍵按下參 數(shù): 無返回值 : key/*/uchar key_scan() uchar key; delay(10);if(key_press()key=key_data;key&=0xf8;switch(key) case 0x78: key=0x0; break; case 0xb8: key=0x1; break; case 0xd8: key=0x2; break; case 0xe8: key=0x3; portb&=bit(4); portb&=bit(6); break; case 0xf0: key=0x4; break; default: key=16; while(key_press();else key=16;return key;/*主函數(shù)*/void main() uchar i=1,j

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論