AT89S51單片機電子時鐘(帶溫度顯示)_第1頁
AT89S51單片機電子時鐘(帶溫度顯示)_第2頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、基于AT89S51單片機的電子時鐘帶溫度顯示)設(shè)計摘要: 本設(shè)計以數(shù)字集成電路技術(shù)為基礎(chǔ),單片機技術(shù)為核心。軟件設(shè)計采用模塊化 結(jié)構(gòu),C語言編程。系統(tǒng)通過LCD顯示數(shù)據(jù),可以顯示日期年、月、日、時、分、 秒)以及溫度。在內(nèi)容安排上首先描述系統(tǒng)硬件工作原理,著重介紹了各硬件接口技 術(shù)和各個接口模塊的功能;其次,詳細(xì)的闡述了程序的各個模塊和實現(xiàn)過程。關(guān)鍵詞:單片機。電子時鐘。溫度傳感器。DS1302。DS18B20。LCD1602基于AT89S51單片機的電子時鐘帶溫度顯示)設(shè)計摘要錯誤!未定義書簽。1 設(shè)計要求 22 方案論證與設(shè)計 22.1用可編程邏輯器件設(shè)計 22.1.1控制器部分 32.2

2、顯示部分的方案選擇錯誤!未定義書簽。2.3系統(tǒng)設(shè)計錯誤!未定義書簽。2.3.1 晶體振蕩器電路 . .錯誤!未定義書簽。2.3.2 分頻器電路. .錯誤!未定義書簽。2.3.3 時間計數(shù)器電路 . .錯誤!未定義書簽。2.3.4 時鐘電路 . .錯誤!未定義書簽。2.3.5 復(fù)位電路 . .錯誤!未定義書簽。2.3.6 復(fù)位電路的可靠性設(shè)計. 錯誤!未定義書簽。2.3.7 按鍵部分. .錯誤!未定義書簽。3.3.9 根據(jù)各模塊的功能互相連接成電子時鐘的控制電路 .53 各硬件介紹錯誤!未定義書簽。3.1 AT89S51 的引腳說明 73.2 發(fā)光二極管指示電路設(shè)計. 83.3 LCM1602簡

3、介.93.5 DS1302 簡介 104系統(tǒng)硬件設(shè)計所需的器材.115 系統(tǒng)軟件總體設(shè)計錯誤!未定義書簽。6 主程序流程圖錯誤!未定義書簽。8調(diào)試與檢測安全.147安裝制作9 結(jié)束語錯誤!未定義書簽。、尸、 亠前言電子時鐘是實現(xiàn)對年,月,日,時,分,秒數(shù)字顯示的計時裝置,廣泛用于個人 家庭,車站, 碼頭,辦公室,銀行大廳等場所, 成為人們?nèi)粘I钪械谋匦杵?。數(shù)字 集成電路的發(fā)展和石英晶體振蕩器的廣泛應(yīng)用,使得數(shù)字鐘的精度遠(yuǎn)遠(yuǎn)超過老式鐘 表。 鐘表的數(shù)字化給人們生產(chǎn)生活帶來了極大的方便,在此基礎(chǔ)上完成的電子時鐘精 度高,功能易于擴展??蓴U展成為諸如定時自動報警、按時自動打鈴、時間程序自動 控制

4、、定時廣播、自動起閉路燈、定時開關(guān)烘箱、通斷動力設(shè)備、甚至各種定時電氣 的自動啟用等電路。 所有這些,都是以鐘表數(shù)字化為基礎(chǔ)的。因此,研究數(shù)字時鐘及 擴大其應(yīng)用有著非常現(xiàn)實的意義。 本設(shè)計就是數(shù)字時鐘簡單的擴展應(yīng)用。1設(shè)計要求本設(shè)計準(zhǔn)備實現(xiàn)的功能:(1顯示日期功能可通過按鍵切換年、月、日及時、分、秒的顯示狀態(tài)(3可隨時調(diào)校年、月、日或時、分、秒(4可每次增減一進(jìn)行時間調(diào)節(jié)(5可動態(tài)完整顯示年份,實現(xiàn)真正的萬年歷顯示(6可顯示溫度2方案論證與設(shè)計2.1控制器部分方案論證方案一:可采用ALTERA公司的FLEX10K系列PLD器件。設(shè)計起來結(jié)構(gòu)清晰, 各個模塊,從硬件上設(shè)計起來相對簡單, 控制與顯

5、示的模塊間的連接也會比較方便。但是考慮到本設(shè)計的特點,EDA在功能擴展上比較受局限,而且EDA占用的資源也相 對多一些。從成本上來講,用可編程邏輯器件來設(shè)計也沒有什么優(yōu)勢。方案二:凌陽16位單片機有豐富的中斷源和時基。它的準(zhǔn)確度相當(dāng)高,并且C語言和匯編兼容的編程環(huán)境也很方便來實現(xiàn)一些遞歸調(diào)用。I/O口功能也比較強大,方便 使用。用凌陽16位單片機做控制器最有特色的就是它的可編程音頻處理,可完成語音 的錄制播放和識別。這些都方便對設(shè)計進(jìn)行擴展,使設(shè)計更加完善。成本也相對低一 些。但是,在控制與顯示的結(jié)合上有些復(fù)雜,顯示模組資源相對有限,而且單片機的 穩(wěn)定性不是很高,而且就需要完成萬年歷這個不太復(fù)

6、雜的設(shè)計可以不必用凌陽16位單 片機來完成,采用51單片機既能夠?qū)崿F(xiàn)既定功能,成本也不高。綜合考慮最后選擇用51單片機來作為中心控制器件。.14硬件控制電路主要用了AT89S51芯片處理器、LCD顯示器等。根據(jù)各自芯片的功 能互相連接成電子萬年歷的控制電路。軟件控制程序主要有主控程序、電子萬年歷的 時間控制程序、時間顯示及星期顯示程序等組成。主控程序中對整個程序進(jìn)行控制, 進(jìn)行了初始化程序及計數(shù)器、還有鍵盤功能程序、以及顯示程序等工作,時間控制程 序是電子萬年歷中比較重要的部分。時間控制程序體現(xiàn)了年、月、日、時、分、秒及 星期的計算方法。時間控制程序主要是定時器0計時中斷程序每隔10ms中斷一

7、次當(dāng)作一個計數(shù),每中斷一次則計數(shù)加1,當(dāng)計數(shù)100次時,則表示1秒到了,秒變量加1, 同理再判斷是否1分鐘到了,再判斷是否1小時到了,再判斷是否1天到了,再判斷 是否1月到了,再判斷是否1年到了,若計數(shù)到了則相關(guān)變量清除0。先給出一般年份 的每月天數(shù)。如果是閏年,第二個月天數(shù)不為28天,而是29天。再用公式s=v-1 +(y-1/4一(y1/100+(y1/400+ d計算當(dāng)前顯示日期是星期幾,當(dāng)調(diào)節(jié)日 期時,星期自動的調(diào)整過來。閏年的判斷規(guī)則為,如果該年份是4或100的整數(shù)倍或者是400的整數(shù)倍,貝以閏年;否則為非閏年。在我們的這個設(shè)計中因為只涉及100年范圍內(nèi),所以判斷是否閏年就只需要用該

8、年份除4來判斷就行了。溫度的顯示主要是靠ds18b20采集現(xiàn)在的溫度數(shù)據(jù),CPU讀取數(shù)據(jù)進(jìn)行顯示,當(dāng)各自的條件得不到滿 足時,對應(yīng)的顯示器狀態(tài)就不發(fā)生改變,只是在滿足條件的情況下,顯示器的狀態(tài)才 變化。圖 1 單片機控制電路Fig.1 SCM Control circuit2.2顯示部分的方案 論證方案一:采用8段數(shù)碼管雖經(jīng)濟實惠,但操作比液晶顯示來說略顯繁瑣。方案二:液晶顯示方式。液晶顯示效果出眾,可以運用菜單項來方便操作,比較簡單,所以,最后選擇液晶顯示方案圖2液晶顯示電路Fig.2 lcm1602 circuit2.3數(shù)字溫度計設(shè)計方案論證2.3.1方案一因為本設(shè)計是測溫電路,可以使用熱

9、敏電阻之類的器件利用其感溫效應(yīng),在將隨 被測溫度變化的電壓或電流采集過來,進(jìn)行A/D轉(zhuǎn)換后,就可以用單片機進(jìn)行數(shù)據(jù)的處理,在顯示電路上,就可以將被測溫度顯示出來,這種設(shè)計需要用到A/D轉(zhuǎn)換電路,感溫電路比較麻煩。2.3.2方案二(1.進(jìn)而考慮到用溫度傳感器,在單片機電路設(shè)計中,大多都是使用傳感器,所 以這是非常容易想到的,所以可以采用一只溫度傳感器DS18B20此傳感器,可以很容易直接讀取被測溫度值,進(jìn)行轉(zhuǎn)換,就可以滿足設(shè)計要求。從以上兩種方案,很容易看出,采用方案二,電路比較簡單,軟件設(shè)計也比較簡 單,故米用了方案二。(2.方案二的總體設(shè)計框圖溫度計電路設(shè)計總體設(shè)計方框圖如圖1所示,控制器采

10、用單片機AT89S51溫度傳感器采用DS18B20用LCD1602顯示溫度2.4系統(tǒng)設(shè)計2.4.1晶體振蕩器電路晶體振蕩器電路給數(shù)字鐘提供一個頻率穩(wěn)定準(zhǔn)確的32768Hz的方波信號,可保證數(shù)字鐘的走時準(zhǔn)確及穩(wěn)定。不管是指針式的電子鐘還是數(shù)字顯示的電子鐘都使用了晶體 蕩器電路。t nId髯TETkril二-一二HFig.3 ds1302 circuit242分頻器電路分頻器電路將高頻方波信號經(jīng)分頻后得到1Hz的方波信號供秒計數(shù)器進(jìn)行計數(shù),分頻器實際上也就是計數(shù)器。2.4.3時間計數(shù)器電路時間計數(shù)電路由秒個位和秒十位計數(shù)器,分個位和分十位計數(shù)器及時個位和時十位計數(shù)器電路構(gòu)成,其中秒個位和秒十位計數(shù)

11、器,分個位和分十位計數(shù)器為60進(jìn)制計數(shù)器而根據(jù)設(shè)計要求,時個位和時十位計數(shù)器為12進(jìn)制計數(shù)器。244時鐘電路內(nèi)部時鐘電路如圖所示,在XTAL1和XTAL2引腳上外接定時元件,內(nèi)部振蕩電路 就產(chǎn)生自激振蕩。定時元件通常石英晶體和電容組成的并聯(lián)諧振回路,晶體振蕩器選 擇12MHZ電容采用30PF。I圖4時鐘電路Fig.4Clock circuit2.4.5復(fù)位電路影響單片機系統(tǒng)運行穩(wěn)定性的因素可大體分為外因和內(nèi)因兩部分:1)夕卜因射頻干擾,它是以空間電磁場的形式傳遞在機器內(nèi)部的導(dǎo)體引線或零件引腳)感生出相應(yīng)的干擾,可通過電磁屏蔽和合理的布線/器件布局衰減該類干擾; 電源線或電源內(nèi)部產(chǎn)生的干擾,它是

12、通過電源線或電源內(nèi)的部件耦合或直接傳導(dǎo),可通過電源濾波、隔離等措施來衰減該類干擾。P1.4亡S33 PO.3 (AD3)(MCSI)5匚c391 FO.4 (AD4)i.Vli-C)!匚73斗尸3 IAO4)(SCKF1.7匚a331 FO & (ADC)R5T匸831 P0.7 (AD7J(RXD:.0 CID311EAZVFF(TXD) P3.1亡1130 ALEROG2匚1229 FSEN3匚132S P2 7 A15尹禺4.匚27 M.e( (AI4) )(T1)廠152二l r二匚站三(ftVR) P3 6 L1025J F2 4 (A 14)F3 7 T17243 (A11

13、)XTAL2 rt923 F3 3 (A10JXTALIr1022P2 (AJ?)GNU L2321P2 0 (A?)圖9 AT89S51的PDIP封裝引腳圖Fig.9 AT89S5140個引腳中,4組8位共32個I/O口,正電源和地線兩根,外置石英振蕩器的 時鐘線兩根,現(xiàn)在對這些引腳的功能加以說明:1)Pin9:RESET/VPd復(fù)位信號復(fù)用腳,當(dāng)AT89S51通電,時鐘電路開始工作,在RESET引腳上出現(xiàn)24個時鐘周期以上的高電平,系統(tǒng)開始復(fù)位。而RESET由高電平下降為低電平后,系統(tǒng)即從0000H地址單元開始執(zhí)行程序。一CAD 1一電僅 捽制V -J輸人移蹩譽存器1實時時坤*DA1A31

14、xXRAM控制邏輕AD表1 DS 1302引腳功能表引孵號引御名稱胡腿1主電源2.3XLX2振蕩認(rèn)外按站骷加4CND5RST境恒倂選線bI/O串行數(shù)據(jù)蠟人確出端取向)7SCLK審行散據(jù)輸人端85拆備電源1.2 DS1302 的控制字節(jié)說明DS1302 的控制字如圖 2 所示??刂谱止?jié)的最高有效位 位 7)必須是邏輯 1,如果它為 0,則不能把數(shù)據(jù)寫入到 DS1302 中位 6 如果 為 0,則表示存取日歷時鐘數(shù)據(jù),為1 表示存取 RAM 數(shù)據(jù)。位5至位 1 指示操作單元的地址。最低有效位位 0)如為 0 表示要進(jìn)行寫操作,為 1 表示進(jìn)行讀操作,控制字節(jié)總是從最低位開始輸出。6543210圖2

15、控制j節(jié)的含文1.3 復(fù)位通過把 輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。輸入有兩種功能:首先,接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,提供了終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對DS1302 進(jìn)行操作。如果在傳送過程中置為低電平,則會終止此次數(shù)據(jù)傳送,并且I/O 引腳變?yōu)楦咦钁B(tài)。上電運行時,在Vcc2.5V 之前,必須保持低電平。只有在 SCLK 為低電平時,才能將 RST 置為高電平。表2 DS 1302的日歷、時坤寄存器廈其捏制字寄仔器名-命令字取值范關(guān)各位內(nèi)容僕操和16541 3 h h 1 081 H00 59CHI0SECSFC分

16、挪寄存器82 H83H00-50L0M1N小時寄存制84 HK5H01-12或00-2312/240toHKHR87 H01-28,29.30.31打0lODAThIM l H月宦寄存器88 HK9H0卜】2)001CMMONTH周H寄沖8AHKBH0)-0700 0DY8CH00-9910 YEAHYKAri1.4 數(shù)據(jù)輸入輸出在控制指令字輸入后的下一個SCLK 時鐘的上升沿時數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位 0 開始。同樣,在緊跟 8 位的控制指令字后的下一個 SCLK 脈沖的下降沿讀出 DS1302 的數(shù)據(jù),讀出數(shù)據(jù) 時從低位 0位至高位乙數(shù)據(jù)讀寫時序見圖3。A) A2 A3

17、Aip/C 1DM* LOBE 1 nMA IO BYTTt,圖3馥據(jù)請寫時洋1.5 DS1302 的寄存器DS1302 共有 12 個寄存器,其中有 7 個寄存器與日歷、時鐘相關(guān),存放的數(shù)據(jù)位為BCD 碼形式。其日歷、時間寄存器及其控制字見表2。此外,DS1302 還有年份寄存器、控制寄存器、充電寄存器、時鐘突發(fā)寄存器及與 RAM 目關(guān)的寄存器等。時鐘突發(fā)寄存器可一次性順序讀寫除充電寄存器外的所 有寄存器內(nèi)容。DS1302 與 RAM 相關(guān)的寄存器分為兩類,一類是單個RAM 單元,共 31 個,每個單元組態(tài)為一個 8 位的字節(jié),其命令控制字為COHFD,其中奇數(shù)為讀操作,偶數(shù)為寫操作;再一類

18、為突發(fā)方式下的 RAM 寄存器,此方式下可一次性讀寫所有的RAM 的 31 個字節(jié),命令控制字為FEH寫)、FFH賣)。3.5 DS1302簡介3.5.1.溫度傳感器DS18B20DS18B20溫度傳感器是美國DALLAS導(dǎo)體公司最新推出的一種改進(jìn)型智能溫度傳 感器,與傳統(tǒng)的熱敏電阻等測溫元件相比,它能直接讀出被測溫度,并且可根據(jù)實際 要求通過簡單的編程實現(xiàn)912位的數(shù)字值讀數(shù)方式。T492封裝的DS18B20的引腳排列見下圖,其引腳功能描述見表1底視圖)_12 3表1DS18B20詳細(xì)引腳功能描述序 號名稱引腳功能描述1GND地信號2DQ數(shù)據(jù)輸入/輸出引腳。開漏單總線接口引腳。當(dāng)被用著在寄生

19、電源 下,也可以向器件提供電源。3VDD可選擇的VDD引腳。當(dāng)工作于寄生電源時,此引腳必須接地。DS18B20的性能特點如下:獨特的單線接口僅需要一個端口引腳進(jìn)行通信;多個DS18B20可以并聯(lián)在惟一的三線上,實現(xiàn)多點組網(wǎng)功能; 無須外部器件;可通過數(shù)據(jù)線供電,電壓范圍為3.05.5 V;零待機功耗;溫度以9或12位數(shù)字;用戶可定義報警設(shè)置;5C1.KRSTIX) )fWWWUUWWWU-.-.- - 報警搜索命令識別并標(biāo)志超過程序限定溫度 TH或TV TL,則將該器件內(nèi)的報警標(biāo)志位置位,并對主機發(fā)出的報警搜索 命令作出響應(yīng)。因存儲器與控制邏輯I/OOA64位ROM的結(jié)構(gòu) 有48位,最后8位是

20、 行通信的原因。溫度報溫度傳感電擦除的CEERADS18B20S18B20內(nèi)部結(jié)構(gòu)-二八工著是每個器件的惟一的序CRC檢驗碼,戈這也是多個_可通過軟件寫入戶報警上下限圖2 D開始8位是產(chǎn) 前面56位的 站觸發(fā)器TH和TL,器的內(nèi)部存儲器還包括一個高速暫秋Ai溫和一個非易失性的可 暫存RAM勺纟i品類型的編號個溫度傳S感器B20可號,共 以采用一線進(jìn)字節(jié)的存儲器,第3和第4字節(jié)Tt和速TL的拷貝,結(jié)構(gòu)如圖3是易溫觸發(fā)器每芋器,它的內(nèi)容用于確定溫度值的數(shù)字轉(zhuǎn)換分辨 存器中的分辨率轉(zhuǎn)換為相應(yīng)精 直為接,TM是工作模式位,B20出廠時該位被設(shè)置節(jié),為配置寄存:示。低)位一為0,用度的溫度數(shù)值寄存器字節(jié)

21、各位的定義 用于設(shè)置、DS18B20在工作模式還 質(zhì)去改動位CRC C發(fā)生器R 0決定溫度轉(zhuǎn)位 CRCCRCTM R1 R011111圖3DS18B2C字節(jié)定義由表1可見,DS18B20溫度 越高,所需要的溫度數(shù) 據(jù)轉(zhuǎn)換時間越長。因此,在實際 衡考慮。高速暫存RAM的第6、 邏輯1。第9字節(jié)讀出前面所有 據(jù),從而保證通信數(shù)據(jù)的正確溫度LSB溫度MSBTH用戶字節(jié)1TL用戶字節(jié)2配置寄存器保留保留保留CRC轉(zhuǎn)換的時間比較長,而且分辨率應(yīng)用中要將分辨率和轉(zhuǎn)換時間權(quán)7、8字節(jié)保留未用,表現(xiàn)為全8字節(jié)的CRC碼,可用來檢驗數(shù) 性。此,可用多只DS18B2C同時測量溫度并進(jìn)行報警搜索。在64位ROM勺最

22、高有效字節(jié)中存儲有循環(huán)冗余檢驗碼CRC。 主機ROM勺前56位來計算CRC值,并和存入DS18B20勺CRC值作比較,以判斷主機收到的ROM數(shù)據(jù)是 否正確。DS18B20的測溫原理是這這樣的,器件中低溫度系數(shù)晶振的振蕩頻率受溫度的影響 很小,用于產(chǎn)生固定頻率的脈沖信號送給減法計數(shù)器1;高溫度系數(shù)晶振隨溫度變化 其振蕩頻率明顯改變,所產(chǎn)生的信號作為減法計數(shù)器2的脈沖輸入。器件中還有一個 計數(shù)門,當(dāng)計數(shù)門打開時,DS18B20就對低溫度系數(shù)振蕩器產(chǎn)生的時鐘脈沖進(jìn)行計數(shù)進(jìn) 而完成溫度測量。計數(shù)門的開啟時間由高溫度系數(shù)振蕩器來決定,每次測量前,首先 將-55C所對應(yīng)的一個基數(shù)分別置入減法計數(shù)器1、溫度

23、寄存器中,計數(shù)器1和溫度 寄存器被預(yù)置在-55E所對應(yīng)的一個基數(shù)值。減法計數(shù)器1對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進(jìn)行減法計數(shù),當(dāng)減法計數(shù)器1的預(yù)置值減到0時,溫度寄存器的值將加1,減法計數(shù)器1的預(yù)置將重新被裝入,減 法計數(shù)器1重新開始對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進(jìn)行計數(shù),如此循環(huán)直到減法 計數(shù)器計數(shù)到0時,停止溫度寄存器的累加,此時溫度寄存器中的數(shù)值就是所測溫度 值。 其輸出用于修正減法計數(shù)器的預(yù)置值, 只要計數(shù)器門仍未關(guān)閉就重復(fù)上述過程,直到溫度寄存器值大致被測溫度值。表2一部分溫度對應(yīng)值表溫度/C二進(jìn)制表示十六進(jìn)制表示+1250000 0111 1101000007D0H+850000 0

24、101 010100000550H+25.06250000 0001 100100000191H+10.1250000 0000 1010000100A2H+0.50000 0000 000000100008H00000 0000 000010000000H-0.51111 1111 11110000FFF8H-10.1251111 1111 01011110FF5EH-25.06251111 1110 01101111FE6FH-551111 1100 10010000FC90H另外,因為DS18B2 0單線通信功能是分時完成的,它有嚴(yán)格的時隙概念,因此讀 寫時序很重要。系統(tǒng)對DS18B20

25、的各種操作按協(xié)議進(jìn)行。操作協(xié)議為:初使化DS18B20發(fā)復(fù)位脈沖)一發(fā)ROM功能命令一發(fā)存儲器操作命令一處理數(shù)據(jù)。3.5.2DS18B20時序DS18B20的復(fù)位時序DS18B20的讀時序?qū)τ贒S18B20的讀時序分為讀0時序和讀1時序兩個過程對于DS18B20的讀時隙是從主機把單總線拉低之后,在15秒之內(nèi)就得釋放單總 線,以讓DS18B20把數(shù)據(jù)傳輸?shù)絾慰偩€上。DS18B2C在完成一個讀時序過程,至少需要60us才能完成。DS18B20的寫時序牛主機發(fā)岀復(fù)位林沖 f 主機接收商祐最規(guī)時間VWGND-VCC圖4 DS18B20與單片機的接口電路D518B20X 出“ 應(yīng)答關(guān)沖松最小值,4801

26、*垠大值:960us對于DS18B20勺寫時序仍然分為寫0時序和寫1時序兩個過程對于DS18B20寫0時序和寫1時序的要求不同, 當(dāng)要寫0時序時, 單總線要被拉 低至少60us,保證DS18B2C能夠在15us到45us之間能夠正確地采樣10總線上的“0”電平,當(dāng)要寫1時序時,單總線被拉低之后,在15us之內(nèi)就得釋放單總線。4系統(tǒng)硬件設(shè)計所需的器材5V電源3V電源AT89S51單片機1個液晶顯示器1個DS1302 1個DS18B20一個電阻1 K的2個、4.7K的2個4.7歐排阻8550三極管晶振12M的一個32768K的一個電容30P的兩個)LED二極管1個22卩f電容1個輕觸開關(guān)5個5系統(tǒng)

27、軟件總體設(shè)計系統(tǒng)的軟件設(shè)計采用匯編語言,對單片機進(jìn)行編程實現(xiàn)各項功能。程序在WindowsXP環(huán)境下采用Keil軟件編寫。軟件控制程序主要有主控程序、電子時鐘的時 間控制程序h和溫度顯示程序組成。主控程序中對整個程序進(jìn)行控制,進(jìn)行了初始化 程序還有鍵盤功能程序、以及顯示程序和時間控制程序是電子時鐘中比較重要的部 分。時間控制程序體現(xiàn)了年、月、日、時、分、秒的計算方法。6主程序流程圖圖 16 主流程框圖Fig.16 TheprocesSlow chart源程序lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll

28、lllllllllllllllllllllllllllll使用說明:按 Si 進(jìn)入日期設(shè)置;進(jìn)入設(shè)置后進(jìn)行光標(biāo)左移;lll按 s2 進(jìn)入時間設(shè)置;設(shè)置完成后進(jìn)行確認(rèn);lll按 S3 進(jìn)行減;lll按 s4 進(jìn)行加;llllllllllllllllllllllllllllllllllllllllllllllllllll/ #include #define uintunsigned int #define uchar unsigned char /sbit rw = P2A6O/sbit rs = P2A& / 1602 IO 口位定義sbit en = P2A7。 /sbit rst =

29、 P3A5。 / sbit sclk =P3A6。 / sbit io = P3A4。/sbit key1 = P1A0。/ sbit key2= P1A1。 / sbit key3 = P1A2。/ sbit key4 = P1A3。 /sbit DQ = P2A2。 /uchar tempL=0。 /臨時變量低位uchar tempH=0。 /臨時變量高位1302 IO 口位定義獨立按鍵位定義uint temperature。uint hour, minute, second, year, month, dayuint key = 0。uchar tab_num =0 x30,0 x31,

30、0 x32,0 x33,0 x34,0 x35,0 x36,0 x37,0 x38,0 x39,0 x3a,0 x2d。 /對應(yīng)字符為: 0 1 2 3 4 5 6 7 8 9 : - uchar tab_time = 1,2,10,3,4,10,5,6。uchar tab_date = 2,0,1,0,11,0,9,11,2,7。/ 延時函數(shù),延時 z 毫秒 *void delay(uint zuint x, y。for(x=0。xfor(y=0。 y。/*/*函數(shù)功能 :延時子程序入口參數(shù) :k出口參數(shù) :*/void delay18b20(unsigned int kunsigned i

31、nt n。 n=0。while(n n+。 return。/*函數(shù)功能 :DS18B20 初始化子程序入口參數(shù) :出口參數(shù) :*/Init_DS18B20(voidunsigned char x=0。DQ=1 。 /DQ 先置高delay18b20(8。 /延時DQ=0 。 /發(fā)送復(fù)位脈沖 delay18b20(85。 /延時 480msDQ=1 。 /拉高數(shù)據(jù)線delay18b20(14。 /等待 /*函數(shù)功能 :向 DS18B20 讀一字節(jié)數(shù)據(jù)入口參數(shù) :出口參數(shù) :dat*/ReadOneChar(voidunsigned char i=0。unsigned char dat=0。for

32、 (i=8。i0。i-DQ=1。delay18b20(1。DQ=0 。dat=1 。DQ=1。if(DQdat|=0 x80。delay18b20(4。return(dat 。/*函數(shù)功能 :向 DS18B20 寫一字節(jié)數(shù)據(jù)入口參數(shù) :dat出口參數(shù) :*/WriteOneChar(unsigned char datunsigned char i=0。for(i=8。i0。i-DQ=0 。DQ=dat&0 x01 。delay18b20(5。DQ=1。dat=1 。delay18b20(4。/*函數(shù)功能 :向 DS18B20 讀溫度值入口參數(shù) :出口參數(shù) :temperature*/u

33、int ReadTemperature(voidInit_DS18B20( 。 /初始化WriteOneChar(0 xcc 。 /跳過讀序列號的操作WriteOneChar(0 x44 。 /啟動溫度轉(zhuǎn)換 delay18b20(125。 /轉(zhuǎn)換需要一點時間,延時Init_DS18B20( 。 /初始化WriteOneChar(0 xcc 。 /跳過讀序列號的操作WriteOneChar(0 xbe 。 /讀溫度寄存器 。 /讀出溫度的低位 LSBtempH=ReadOneChar( 。 /讀出溫度的高位 MSB /溫度轉(zhuǎn)換,把高低位做相應(yīng)的運算轉(zhuǎn)化為實際溫度temperature=(temp

34、H*256+tempL*5/8 。 delay18b20(200。return(temperature。/=1302 寫一個字節(jié) =void write_byte(uchar datuchar i, dat_w。dat_w = dat。for(i=0。iio = 0。if(dat_w & 0 x01io = 1。elseio = 0。dat_w = dat_w 1。sclk = 0。sclk = 1。sclk = 0。/= /=1302 讀一個字節(jié)= uchar read_byte(uchar i, k。k = 0 。for(i=0。ik = k 1。if(iok = k|0 x80。

35、sclk = 1。sclk = 0。sclk = 0。return (k 。/= /=1302 把數(shù)據(jù)寫入地址 = void write_add(uchar add, uchar datrst = 0。sclk = 0。rst = 1。write_byte(add。write_byte(dat / 10 | (dat % 10 。 sclk = 0。rst = 0。/=/=1302 從地址讀出數(shù)據(jù) = uchar read_add(uchar adduchar temp, dat1, dat2。rst = 0。sclk = 0。rst = 1。write_byte(add。temp = rea

36、d_byte(。sclk = 0。rst = 0。dat1 = temp / 16。dat2 = temp % 16。temp = dat1 * 10 + dat2。return (temp。/= /=1302 時間初始化 = void ds1302_init(write_add(0 x8e,0 x00。/打開寫保護(hù),寫入時間;write_add(0 x80,50。/初始化 -秒 50;write_add(0 x82,59。/初始化 -分 59;write_add(0 x84,23。/初始化 -時 23;write_add(0 x86,31。/初始化 -日 31;write_add(0 x88

37、,12。/初始化 -月 12;write_add(0 x8c,10。/初始化 -年 2018;write_add(0 x8e,0 x80。/關(guān)閉寫保護(hù),禁止寫入。/=/=1302 讀出時間 =void ds1302(rs = 0。 rw = 0。 en = 0。 delay(5。P0 = com。 delay(5。en = 1。write_add(0 x8e,0 x00。second = read_add(0 x81。minute = read_add(0 x83。hour = read_add(0 x85。day = read_add(0 x87。month = read_add(0 x89

38、。year = read_add(0 x8d。write_add(0 x8e,0 x80。/=/ 寫命令函數(shù) *void write_com(uchar com/打開寫保護(hù), 讀出時間;/從 1302 讀出時間 -秒;/從 1302讀出時間 -分; /從 1302 讀出時間 -時; /從 1302 讀出時間 -日; /從 1302 讀出時間 -月; /從 1302 讀出時間 -年;/關(guān)閉寫保護(hù),禁止讀出;delay(5。en = 0。*/ 寫數(shù)據(jù)函數(shù) * void write_data(uchar daters = 1。rw = 0。en = 0。 delay(5。P0 = date。 del

39、ay(5。en = 1。delay(5。en = 0。/*/1602 顯示一個字符 = void DisplayOne(uchar *pwrite_data(*p 。/*/=/= 時間重新賦值 = void time(tab_time0hour / 10。tab_time1hour % 10 。tab_time3minute /10。tab_time4minute %10 。tab_time6second / 10。tab_time7second %10。tab_date2year / 10。tab_date3year % 10 。tab_date5month / 10。tab_date6mo

40、nth % 10。tab_date8day / 10。tab_date9day % 10。/= /=1602 初始化= void init(write_com(0 x38。write_com(0 x0c。write_com(0 x06。write_com(0 x01。/= /= 時間顯示函數(shù)= void DisplayTime(uint n。 ds1302(。 time(。write_com(0 x80 + 6。for(n=0。n10。n+DisplayOne(tab_num + tab_daten。write_com(0 x80 + 0 x40 + 6。for(n=0。 n8。 n+Disp

41、layOne(tab_num + tab_timen。 /顯示時間/顯示日期/=/= 時鐘停止 =void stop(write_add(0 x8e, 00。/ 打開寫保護(hù)write_add(0 x80,80。/ 時鐘停止write_add(0 x8e, 80。/ 禁止寫保護(hù)write_com(0 x80+0 x40+12。/= write_data(tab_numsecond/10。/write_data(tab_numsecond%10。/=/=/= 時鐘開始 =void start(write_add(0 x8e, 00。/ 打開寫保護(hù)write_add(0 x80,second。/ 讀

42、入秒write_add(0 x8e, 80。/禁止寫保護(hù)顯示秒/= 矩陣鍵盤掃描函數(shù) =void KeyScan(P1 = 0 xff。if(key1 = 0 /即獨立鍵盤中的 k1delay(10。if(key1 = 0key = 1。 while(!key1。if(key2 = 0 /即獨立鍵盤中的 k2delay(10。if(key2 = 0key = 2。while(!key2。delay(10。 if(key3 = 0key = 3。 while(!key3。if(key4 = 0/即獨立鍵盤中的 k6delay(10。 if(key4 = 0key = 4。while(!key4。

43、/=/= 按鍵操作函數(shù) = voidKeyDo(if(key3 = 0/即獨立鍵盤中的 k3/用以修改日期 第一行)時,移動閃爍光標(biāo)。/用以修改時間 第二行)時,移動閃爍光標(biāo)。if(key = 1key = 0。stop(。write_com(0 x80 + 0 x40 + n。write_com(0 x0f。while(1KeyScan(。 if(key = 3n = n + 3。if(n 13n = 7。write_com(0 x80 + 0 x40 + n。write_com(0 x0f。key = 0。switch(nuint m = 15。uint n = 13。case 13 :i

44、f(key = 2second+。if(second = 60 second = 0。time(。write_add(0 x8e,0 x00。write_add(0 x80,second。write_add(0 x8e,0 x80。write_com(0 x80 + 0 x40 + 12。DisplayOne(tab_num + tab_time6。DisplayOne(tab_num + tab_time7。write_com(0 x80 + 0 x40 + 13。write_com(0 x0f。key = 0。if(key = 4second-。-if(second = -1second

45、= 59。time(。write_add(0 x8e,0 x00。write_add(0 x80,second。write_add(0 x8e,0 x80。write_com(0 x80 + 0 x40 + 12。DisplayOne(tab_num + tab_time6。DisplayOne(tab_num + tab_time7。write_com(0 x80 + 0 x40 + 13。write_com(0 x0f。key = 0。case 10 :if(key = 2minute+。if(minute = 60 minute = 0。time(。write_add(0 x8e,0 x

46、00。write_add(0 x82,minute。write_add(0 x8e,0 x80。write_com(0 x80 + 0 x40 + 9。DisplayOne(tab_num + tab_time3。DisplayOne(tab_num + tab_time4。write_com(0 x80 + 0 x40 + 10。write_com(0 x0f。key = 0。if(key = 4minute-。if(minute = -1minute = 59。time(。write_add(0 x8e,0 x00。write_add(0 x82,minute。write_add(0 x8

47、e,0 x80。write_com(0 x80 + 0 x40 + 9。DisplayOne(tab_num + tab_time3。DisplayOne(tab_num + tab_time4。write_com(0 x80 + 0 x40 + 10。write_com(0 x0f。key = 0。case 7 :if(key = 2hour+。if(hour = 24hour = 0。time(。write_add(0 x8e,0 x00。write_add(0 x84,hour。write_add(0 x8e,0 x80。write_com(0 x80 + 0 x40 + 6。Displ

48、ayOne(tab_num + tab_time0。DisplayOne(tab_num + tab_time1。write_com(0 x80 + 0 x40 + 7。write_com(0 x0f。key = 0。if(key = 4hour-。if(hour = -1hour = 23。time(。write_add(0 x8e,0 x00。write_add(0 x84,hour。write_add(0 x8e,0 x80。write_com(0 x80 + 0 x40 + 6。DisplayOne(tab_num + tab_time0。DisplayOne(tab_num + ta

49、b_time1。write_com(0 x80 + 0 x40 + 7。write_com(0 x0f。key = 0。if(key = 1start(。key = 0。write_com(0 x0c。 break。if(key = 3stop(。write_com(0 x80 + m。write_com(0 x0f。while(1KeyScan(。if(key = 3m = m + 3。if(m 15m = 9。write_com(0 x80 + m。write_com(0 x0f。key = 0。switch(mcase 15 :if(key = 2day+。if(day = 32day

50、= 1。time(。write_add(0 x8e,0 x00。write_add(0 x86,day。write_add(0 x8e,0 x80。write_com(0 x80 + 14。DisplayOne(tab_num + tab_date8。DisplayOne(tab_num + tab_date9。write_com(0 x80+15。write_com(0 x0f。key = 0。if(key = 4day-。 if(day = 0day = 31。time(。 write_add(0 x8e,0 x00。write_add(0 x86,day。write_add(0 x8e,

51、0 x80。write_com(0 x80 + 14。DisplayOne(tab_num + tab_date8。DisplayOne(tab_num + tab_date9。write_com(0 x80 + 15。write_com(0 x0f。key = 0。case 12 :if(key = 2month+。if(month = 13month = 1。time(。write_add(0 x8e,0 x00。write_add(0 x88,month。write_add(0 x8e,0 x80。write_com(0 x80 + 11。DisplayOne(tab_num + tab

52、_date5。DisplayOne(tab_num + tab_date6。write_com(0 x80 + 12。write_com(0 x0f。key = 0。if(key = 4month-。if(month = -1month = 12。time(。write_add(0 x8e,0 x00。write_add(0 x88,month。write_add(0 x8e,0 x80。write_com(0 x80 + 11。DisplayOne(tab_num + tab_date5。DisplayOne(tab_num + tab_date6。write_com(0 x80 + 12。

53、write_com(0 x0f。key = 0。case 9 :if(key = 2year+。if(year = 100year = 0。time(。write_add(0 x8e,0 x00。write_add(0 x8c,year。write_add(0 x8e,0 x80。write_com(0 x80 + 8。DisplayOne(tab_num + tab_date2。DisplayOne(tab_num + tab_date3。write_com(0 x80 + 9。write_com(0 x0f。key = 0。if(key = 4year-。if(year = -1year

54、= 23。time(。write_add(0 x8e,0 x00。write_add(0 x8c,year。write_add(0 x8e,0 x80。write_com(0 x80 + 8。DisplayOne(tab_num + tab_date2。DisplayOne(tab_num + tab_date3。write_com(0 x80 + 9。write_com(0 x0f。key = 0。if(key = 1key = 0。 start(。 write_com(0 x0c。 break。void Display_18b20(uint t1,t2,t3。t1 = ReadTemper

55、ature(/100%10。t2 = ReadTemperature(/10%10。t3 = ReadTemperature(%10。 write_com(0 x80。write_data(tab_numt1。write_data(tab_numt2。DisplayOne(. 。 write_data(tab_numt3。/=void main(init( 。ds1302_init(。while(1Display_18b20(。KeyScan(。KeyDo(。DisplayTime(。7安裝制作8.1清理元器件,重點辯別認(rèn)清電阻器阻值及相應(yīng)代號,對電阻、電容、發(fā)光二 極管、三極管、電源變壓器等

56、要用萬用表一一檢測。8.2安裝時,電阻器、整流二極管采用臥式插裝,并近貼電路板;瓷介電容器、 電解電容器、三極管等采用立式插裝,也要近貼電路板。發(fā)光二極管安裝時可不講極 性,因為其供電電路為交流電源,其余有極性元件:如電解電容器、整流二極管、穩(wěn) 壓二極管、三極管、集成電路等必須按正確的極性插裝,否則電路不會正常工作。8.3焊完元器件后,在覆銅面剪掉多余元器件的引線,工具最好用斜口鉗,可防 止因剪線而使覆銅皮損壞。8.4焊接完后,請認(rèn)真對照電路原理圖、安裝圖檢查電路板上有無漏焊、錯焊、 短路、斷路等錯誤現(xiàn)象,確認(rèn)無誤后才能通電。8調(diào)試與檢測安全調(diào)試與檢測過程中,要接觸各種電路和儀器設(shè)備,特別是各種電源及高壓電路, 高壓大容量電容器等,為保護(hù)檢測人員安全,防止測試設(shè)備和檢測線路的損壞,除嚴(yán) 格遵守一般安全規(guī)程外,還必須注意調(diào)試和檢測工作中制定的安全措施。9.1供電安全:大部分故障檢測過程中都必須加電,所以調(diào)試檢測過的設(shè)備儀器,最終都要加電 檢驗。抓住供電安全就抓住了安全的關(guān)鍵。1)調(diào)試檢測場

溫馨提示

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

評論

0/150

提交評論