標(biāo)題: 單片機電子時鐘設(shè)計-DS1302 1602 可調(diào)鬧鐘 [打印本頁]
作者: zbd 時間: 2019-1-12 23:01
標(biāo)題: 單片機電子時鐘設(shè)計-DS1302 1602 可調(diào)鬧鐘
摘要
隨著單片機技術(shù)的飛速發(fā)展,在其推動下,現(xiàn)代的電子產(chǎn)品幾乎滲透到了社會的各個領(lǐng)域,有力地推動了社會生產(chǎn)力的發(fā)展和社會信息化程度的提高,同時也使現(xiàn)代電子產(chǎn)品性能進一步提高。
時間就是金錢、時間就是生命、時間就是勝利……,準(zhǔn)確的掌握時間和分配時間對人們來說至關(guān)重要,時鐘是我們生活中必不可少的工具。電子鐘的設(shè)計方法有很多種,但是基于單片機并通過LCD顯示的電子時鐘具有編程靈活、精確度高、便于攜帶、顯示直觀等特點。
利用STC89C52單片機對DS1302時鐘芯片進行讀寫操作并通過1602字符液晶顯示實時時鐘信息,這樣便構(gòu)成了一個單片機電子時鐘。
目錄
緒論
概述
研究目的
第1章 設(shè)計要求與方案論證
1.1 設(shè)計要求
1.2 系統(tǒng)基本方案選擇和論證
1.2.1 單片機芯片的選擇方案和論證
1.2.2 顯示模塊選擇方案和論證
1.2.3 時鐘芯片的選擇方案和論證2
1.3 電路設(shè)計最終方案決定
第2章 主要元件介紹3
2.1 STC89C52以及最小系統(tǒng)介紹3
2.1.1 STC89C52主要功能及PDIP封裝
2.1.2 STC89C52引腳介紹
2.1.3 STC89C52最小系統(tǒng)4
2.2 DS1302時鐘芯片以及集成時鐘模塊介紹5
2.2.1 DS1302概述6
2.2.2 DS1302引腳介紹6
2.2.3 DS1302使用方法6
2.2.4 時鐘集成模塊內(nèi)部原理圖以及實物圖8
2.3 1602字符液晶以及顯示模塊介紹
2.3.1 1602液晶概述
2.3.2 1602引腳介紹
2.3.3 1602字符液晶使用方法
2.3.4 LCD顯示模塊原理圖13
第3章 系統(tǒng)硬件設(shè)計
3.1 電路設(shè)計框圖
3.2 系統(tǒng)硬件概述
第4章 系統(tǒng)的軟件設(shè)計
4.1 程序流程框圖
第5章 系統(tǒng)測試與總結(jié)
5.1 系統(tǒng)測試17
5.2 總結(jié)17
致謝18
參考文獻18
源程序清單18
附錄35
概述時間,對人們來說是非常寶貴的,準(zhǔn)確的掌握時間和分配時間對人們來說至關(guān)重要。因此自從時鐘發(fā)明的那刻起,就成為人類的好朋友。隨著時間的流逝,科學(xué)技術(shù)的不斷發(fā)展和提高,人們對時間計量的精度要求越來越高,應(yīng)用越來越廣。怎樣讓時鐘更好、更方便、更精確的顯示時間,這就要求人們不斷設(shè)計研發(fā)出新型的時鐘。
高精度的計時工具大多數(shù)都使用了石英晶體振蕩器,由于電子鐘,石英表,石英鐘都采用了石英技術(shù),因此走時精度高,穩(wěn)定性好,使用方便,不需要經(jīng)常調(diào)校。數(shù)字式電子鐘用集成電路計時時,譯碼代替機械式傳動,用LED顯示器代替指針進而顯示時間,減小了計時誤差,這種表具有時,分,秒顯示時間的功能,還可以進行時和分的校對,片選的靈活性好。
時鐘電路在計算機系統(tǒng)中起著非常重要的作用,是保證系統(tǒng)正常工作的基礎(chǔ)。在單片機的應(yīng)用系統(tǒng)中,時鐘有兩個方面的含義:一是指為保障系統(tǒng)正常工作的基準(zhǔn)振蕩定時信號,主要由晶振和外圍電路組成,晶振頻率的大小決定了單片機系統(tǒng)工作的快慢;二是指系統(tǒng)的標(biāo)準(zhǔn)定時時鐘,即定時時間,它通常有兩種實現(xiàn)方法:一是用軟件實現(xiàn),即用單片機內(nèi)部的可編程定時器/計數(shù)器來實現(xiàn);二是用專門的時鐘芯片實現(xiàn)。
研究目的通過利用STC89C52單片機和DS1302芯片以及外圍的按鍵和LCD顯示器等部件,設(shè)計一個基于單片機的電子時鐘。設(shè)計的電子時鐘通過液晶顯示器顯示,并能通過按鍵對時間以及鬧鐘進行設(shè)置。
第1章 設(shè)計要求與方案論證
1.1 設(shè)計要求:- 具有年、月、日、星期、時、分、秒顯示功能()
- 具備年、月、日、星期、時、分、秒校準(zhǔn)功能
- 具有鬧鐘顯示、調(diào)節(jié)設(shè)定、鳴叫功能
1.2 系統(tǒng)基本方案選擇和論證
1.2.1 單片機芯片的選擇方案和論證:方案一:
采用STC89C52芯片作為硬件核心。STC89C52內(nèi)部具有8KB ROM 存儲空間,512字節(jié)數(shù)據(jù)存儲空間,帶有2K字節(jié)的EEPROM存儲空間,與MCS-51系列單片機完全兼容,STC89C52可以通過串口下載。
方案二:
采用AT89S52。AT89S52片內(nèi)具有8K字節(jié)程序存儲空間,256字節(jié)的數(shù)據(jù)存儲空間沒有EEPROM存儲空間,也與MCS-51系列單片機完全兼容,具有在線編程可擦除技術(shù)。
兩種單片機都完全能夠滿足設(shè)計需要,STC89C52相對ATS89C52價格便宜,且抗干擾能力強。考慮到成本因素,因此選用STC89C52。
1.2.2 顯示模塊選擇方案和論證:方案一:
采用點陣式數(shù)碼管顯示。點陣式數(shù)碼管是由八行八列的發(fā)光二極管組成,對于顯示文字比較適合,如采用在顯示數(shù)字顯得太浪費,且也相對較高,所以不用此種作為顯示。
方案二:
采用LED數(shù)碼管動態(tài)掃描。LED數(shù)碼管價格便宜,對于顯示數(shù)字最合適,但功耗較大,且顯示容量不夠,所以也不用此種方案。
方案三:
采用LCD液晶顯示屏。液晶顯示屏的顯示功能強大,可顯示大量文字,顯示多樣,清晰可見,且價格適中,所以采用了LCD數(shù)碼管作為顯示。
1.2.3 時鐘芯片的選擇方案和論證:方案一:
直接采用單片機定時計數(shù)器提供秒信號,使用程序?qū)崿F(xiàn)年、月、日、星期、時、分、秒計數(shù)。采用此種方案雖然減少芯片的使用,節(jié)約成本,但是,實現(xiàn)的時間誤差較大。所以不采用此方案。
方案二:
采用DS1302時鐘芯片實現(xiàn)時鐘,DS1302芯片是一種高性能的時鐘芯片,可自動對秒、分、時、日、周、月、年以及閏年補償?shù)哪赀M行計數(shù),而且精度高,工作電壓2.5V~5.5V范圍內(nèi),2.5V時耗電小于300nA.
1.3 電路設(shè)計最終方案決定綜上各方案所述,對此次作品的方案選定: 采用STC89C52單片機作為主控制系統(tǒng);采用DS1302作為時鐘芯片;采用1602 LCD液晶作為顯示器件。
2.2 DS1302時鐘芯片以及時鐘集成模塊介紹
2.2.1 DS1302概述
DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘芯片,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。采用雙電源供電(主電源和備用電源),同時提供了對后背電源進行涓細(xì)電流充電的能力。采用三線接口與CPU進行同步通信
圖4:DS1302封裝圖
2.2.2 DS1302引腳介紹各引腳功能為:
Vcc: 主電源;Vcc2:備用電源。當(dāng)Vcc2>Vcc1+0.2V時,由Vcc2向DS1302供電;當(dāng)Vcc2<Vcc1時,由Vcc1向DS1302供電。
SCLK:串行時鐘輸入端,控制數(shù)據(jù)的輸入與輸出
I/O: 三線接口時的雙向數(shù)據(jù)線
CE: 輸入信號,在讀、寫數(shù)據(jù)期間必須為高
2.2.3 DS1302使用方法(1) 時鐘芯片DS1302的工作原理:
DS1302在每次進行讀、寫程序前都必須初始化,先把SCLK端置 “0”,接著把RST端置“1”,最后才給予SCLK脈沖;讀/寫時序如圖5所示。表2為DS1302的控制字,此控制字的位7必須置1,若為0則不能把對DS1302進行讀寫數(shù)據(jù)。對于位6,若對程序進行讀/寫時RAM=1,對時間進行讀/寫時,CK=0。位1至位5指操作單元的地址。位0是讀/寫操作位,進行讀操作時,該位為1;該位為0則表示進行的是寫操作?刂谱止(jié)總是從最低位開始輸入/輸出的。表6為DS1302的日歷、時間寄存器內(nèi)容:“CH”是時鐘暫停標(biāo)志位,當(dāng)該位為1時,時鐘振蕩器停止,DS1302處于低功耗狀態(tài);當(dāng)該位為0時,時鐘開始運行!癢P”
是寫保護位,在任何的對時鐘和RAM的寫操作之前,WP必須為0。當(dāng)“WP”為1時,寫保護位防止對任一寄存器的寫操作。
(2) DS1302的控制字節(jié)
DS1302的控制字如表所示。控制字節(jié)最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入DS1302中,位6如果0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);位5至位1指示操作單元的地址;最低有效位(位0)如為0表示要進行寫操作,為1表示進行讀操作,控制字節(jié)總是從最低位開始傳輸
表2:DS1302控制字
(3) 數(shù)據(jù)輸入輸出(I/O)
在控制指令字輸入后的下一個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位0開始。同樣,在緊跟8位的控制指令字后的下一個SCLK脈沖的下降沿讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時從低位0位到高位7。其讀寫時序如圖示
圖5:DS1302讀寫時序
(4)DS1302寄存器
DS1302中與時間、日期有關(guān)的寄存器共有12個,其中7個存放數(shù)據(jù)的格式為BCD碼格式,其讀寫地址如下表所示
表3:DS1302時鐘寄存器
第一行秒寄存器,CH為時鐘暫停標(biāo)志位,該位為1時時鐘停止,該位為0時時鐘運行
第二行分寄存器,bit0~bit6表示分鐘數(shù),因采用BCD編碼,所以低四位最大能表示的數(shù)字為9,計數(shù)滿向高三位進1。
第三行時寄存器,12/24用來定義DS1302小時的運行模式,12小時模式下bit5為1表示PM下午,bit5為0表示AM上午
第八行控制寄存器,bit7是寫保護位WP,當(dāng)WP為1時,寫保護位可防止對任一寄存器的寫操作,在任何的對時鐘和RAM的寫操作之前,WP位必須為0
此外,DS1302 還有年份寄存器、控制寄存器、充電寄存器、時鐘突發(fā)寄存器及與RAM相關(guān)的寄存器等。時鐘突發(fā)寄存器可一次性順序讀寫除充電寄存器外的所有寄存器內(nèi)容。 DS1302與RAM相關(guān)的寄存器分為兩類:一類是單個RAM單元,共31個,每個單元組態(tài)為一個8位的字節(jié),其命令控制字為C0H~FDH,其中奇數(shù)為讀操作,偶數(shù)為寫操作;另一類為突發(fā)方式下的RAM寄存器,此方式下可一次性讀寫所有的RAM的31個字節(jié),命令控制字為FEH(寫)、FFH(讀)。
2.2.4 時鐘集成模塊內(nèi)部原理圖以及實物圖
圖6:DS1302內(nèi)部原理圖
圖7:DS1302實物圖
2. 3 1602字符液晶以及顯示模塊介紹2.3.1 1602液晶概述工業(yè)字符型液晶,1602是指顯示的內(nèi)容為16*2,即能夠同時顯示兩行,每行16個字符。常見的1602字符液晶有兩種,一種顯示的是綠色背光黑色字體,另一種顯示藍色背光白色字體,目前市面上字符液晶絕大多數(shù)是基于HD44780液晶芯片的,控制原理是完全相同的。本課題所用1602液晶模塊,顯示屏是藍色背光白色字體。如圖6所示
圖8:1602字符液晶
2.3.2 1602引腳介紹
表4:1602字符液晶引腳說明
各個引腳具體功能說明:
第1腳:GND為地電源。
第2腳:VCC接5V正電源。
第3腳:VO為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地電源時對比度最高,對比度過高時會產(chǎn)生重影,使用一個1K的電位器調(diào)整對比度。
第4腳:RS為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器,低電平時選擇指令寄存器。
第5腳:R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。
第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。
第7~14腳:DB0~DB7為8位雙向數(shù)據(jù)線。
第15~16腳:背光燈電源。
2.3.3 1602字符液晶使用方法(1)基本操作時序
| | |
| | |
| RS=L,RW=L,D0~D7=指令碼,E=高脈沖 | |
| | |
| RS=H,RW=L,D0~D7=數(shù)據(jù),E=高脈沖 | |
圖9:1602液晶讀時序圖
圖10:1602液晶寫時序圖
(2)RAM
1602液晶控制器芯片內(nèi)部帶有80個8位的RAM緩沖區(qū),其地址和屏幕的對應(yīng)關(guān)系如圖7示
圖11
(3)1602字符液晶字庫
1602液晶模塊內(nèi)部的字符發(fā)生存儲器(CGROM)已經(jīng)存儲了160個不同的點陣字符圖形,如下表所示,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們就能看到字母“A”
2.3.4 LCD顯示模塊原理圖
圖13 LCD顯示模塊原理圖
第3章 系統(tǒng)硬件設(shè)計
3.1 電路設(shè)計框圖
圖14:硬件框圖
3.2 系統(tǒng)硬件概述
電路以STC89C52單片機最小系統(tǒng)為控制核心,時鐘電路由高精度低功耗的DS1302提供,采用三線接口與CPU進行同步通信,輸入部分采用四個獨立式按鍵S1、S2、S3、S4。1602液晶顯示部分,D0-D7口與單片機P0口相連。具體電路連接,詳見附錄1
第4章 系統(tǒng)的軟件設(shè)計
4.1程序流程框圖
圖15:主程序框圖
圖16:按鍵程序圖
第五章 系統(tǒng)測試與總結(jié)
5.1 系統(tǒng)測試
從開始準(zhǔn)備到寫完論文大概花了一周時間,原理圖和PCB制作花了一天時間,在這期間主要遇到的問題是Altium Designer軟件的使用,遇到問題主要到百度上查找答案,PCB做出之后緊接著就是焊接元器件,這部分由于粗心將電解電容正負(fù)極焊反,后面經(jīng)過萬用表不斷的測試才判斷出來,及時糾正過來,焊接與硬件調(diào)試大概花了半天時間。緊接著大部分的時間都花費在硬件與軟件的結(jié)合調(diào)試上,在調(diào)試過程中使用自己在網(wǎng)上買的51單片機開發(fā)板上進行一步一步的調(diào)試。由于是第一次做課程設(shè)計,同時也是第一次寫這么綜合的程序,所以在調(diào)試過程中遇到很多問題,一部分是關(guān)于DS1302與1602的硬件特點以及在硬件的基礎(chǔ)之上驅(qū)動程序的調(diào)用,這里主要是網(wǎng)上找資料去學(xué)會調(diào)用與編寫,主要是通過網(wǎng)上視頻教學(xué) ;另一部分是自己做的硬件存在很多誤差,特別是電源供電部分,剛開始是用廢棄的鼠標(biāo)上的那個USB接口線插在電腦上供電,但由于電源介入硬件的是兩個排針,所以很不穩(wěn)定,1602上總亂碼,或者5個按鍵隨便一個按下都是復(fù)位,而且從電腦輸出5V接到硬件系統(tǒng)后只有4.5V了,想了一下,最后拿出上學(xué)期期末自己做的電源將它調(diào)節(jié)到6V后,接入硬件系統(tǒng)就能達到5V。
5.2 總結(jié)
通過本次論文設(shè)計,使我加深了對單片機的認(rèn)識,并且熟悉了單片機系統(tǒng)的設(shè)計流程,收獲豐碩。功能上基本達標(biāo):時鐘與鬧鐘的顯示,調(diào)時間和鬧鐘功能以及鬧鐘鳴叫功能。時鐘與鬧鐘顯示功能,精確度完全可以滿足日常生活顯示時間的需要;調(diào)時間與鬧鐘功能,方便快捷。硬件設(shè)施基本合乎要求,軟件設(shè)計可以配合硬件實現(xiàn)其功能。
技術(shù)在不斷進步,機械式時鐘已經(jīng)被淘汰,取而代之的是具有高度準(zhǔn)確性和直觀性且無機械裝置,具有更長的使用壽命等優(yōu)點的電子時鐘。電子時鐘更具人性化,更能提高人們的生活質(zhì)量,更受人們歡迎。機械時代已經(jīng)遠(yuǎn)去,電子時代已經(jīng)到來。做為新時代的我們,更應(yīng)該提高自身能力,適應(yīng)新時代的發(fā)展。知識來自實踐,多從生活中探尋所需要的。
從這次的論文設(shè)計中,我真正的體會到,知識的重要性,特別是要理論聯(lián)系實際,把我們所學(xué)的理論知識運用到實際生活當(dāng)中,要用知識改變一切。
附錄一:
系統(tǒng)原理圖
附錄二:
PCB
附錄三:

首先上電進入歡迎界面,如上圖所示,顯示5S鐘。
上電后的整體外觀圖,各按鍵的功能都有標(biāo)注
按K1進入調(diào)時狀態(tài)按得次數(shù)不同光標(biāo)顯示的位置不同,從而進行年、月、日、時、分、秒、的調(diào)整,按8次時退出,按K2調(diào)時,K3確定鍵,確認(rèn)所調(diào)時間。

按K4進入鬧鈴調(diào)整狀態(tài),按一次光標(biāo)顯示在鬧鈴秒位置,從而進行秒的調(diào)整,當(dāng)按二次光標(biāo)顯示在鬧鈴時位置,從而進行時的調(diào)整,按第三次退出調(diào)整狀態(tài)。
單片機源程序如下:
- #include<reg52.h>//52單片機頭文件,規(guī)定了52單片機的寄存器和IO口等
- #include<intrins.h>//_nop_空指令及左右循環(huán)移位子函數(shù)庫
- #define uchar unsigned char//宏定義
- #define uint unsigned int//宏定義
- sbit lcden=P2^7;//定義下面通過lcden來操作P2^7口,1602液晶使能控制端
- sbit lcdwr=P2^5;//定義下面通過lcdrw來操作P2^5口,1602讀寫選擇端
- sbit lcdrs=P2^6;//定義選數(shù)據(jù)寄存器選指令寄存器控制端
- sbit sda=P3^4;//定義DS1302數(shù)據(jù)總線
- sbit rst=P3^5;//DS1320復(fù)位
- sbit sck=P3^6;//定義時鐘總線
- sbit s1=P1^0;//定義設(shè)置按鈕
- sbit s2=P1^1;//定義調(diào)時按鈕
- sbit s3=P1^2;//定義確定按鈕
- sbit s4=P1^3;
- 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[]={" 2012- - "};//要寫入1602液晶的數(shù)據(jù)
- uchar code table1[]={" : : : "};//字庫中的字可直接以外加""號的形式直接寫入
- uchar code table2[]={" Welcome To Lcd!"};//歡迎界面
- uchar code table3[]={"Happy Every Day!"}; //歡迎界面
- /*******************************************************************************
- 時函數(shù),z的取值為這個函數(shù)的延時ms數(shù),delay(200);大約延時200ms. delay(500);大約延時500ms
- *******************************************************************************/
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*********************蜂鳴器函數(shù)************************************************/
- void didi()
- {
- uchar i;
- for(i=0;i<60;i++)
- {
- BELL = 0;
- delay(1);
- BELL = 1;
- delay(1);
- }
- }
-
- /*******************向1602液晶中寫一個指令**************************************/
- void write_com(uchar com)
- {
- lcdwr=0; //lcdwr為讀寫控制端,lcdwr=0,這里可不寫
- lcdrs=0; //液晶rs接口為0時,寫指令,rs為1時寫數(shù)據(jù)
- P0=com; //將要寫的指令賦給P0口,
- delay(5); //由1602讀寫操作時序圖,先將指令賦給P0口,延時后將使能
- lcden=1; // 端lcden置高,再延時一段時間,然后將lcden置低,這樣指令
- delay(5); // 就寫入到LCD了
- lcden=0;
- }
- /****************************向液晶寫數(shù)據(jù)***************************************/
- void write_data(uchar date)//與寫指令類似,這里lcdrs設(shè)為1
- {
- lcdrs=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點陣、8位數(shù)據(jù)接口模式
- write_com(0x0c);//開顯示、不顯示光標(biāo)
- write_com(0x06);//寫一個字符后,地址指針加1
- write_com(0x01);//顯示清0
- }
- /*******************************************************************************/
- 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]);
- }
- /**************************顯示歡迎界面函數(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ù)*********************************/
- void write_sfm(uchar add,uchar time)//用于在1602上顯示年、月、日、時、分、秒。Add為顯示位置,time為要顯示的內(nèi)容
- {
- uchar shiwei,gewei;
- shiwei=time/16; //將從DS1302中讀取的BCD碼數(shù)據(jù)轉(zhuǎn)化成10進制個位和10
- gewei=time%16; //進制十位
- write_com(add+0x80);//定義顯示在液晶的什么位置
- write_data(0x30+shiwei);//由1602液晶字庫可知,0~9的數(shù)據(jù)碼分別對應(yīng)0x30~0x39
- write_data(0x30+gewei); //初使化中設(shè)定了寫一個字符后,地址指針加1,因此這里
- } // 不用重新光標(biāo)寫位
- /**************************顯示周子函數(shù)*****************************************/
- void write_zhou(uchar time1)//用于在1602上顯示周信息,與顯示
- { //時間日期子函數(shù)類似
- uchar gewei;
- gewei=time1%16;//一周七天,因此只需個位
- write_com(0x80+13);
- 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);//禁止寫保護
- write_1302(0x90,0xaa);//定義充電
- write_1302(0x80,0x53);//秒
- write_1302(0x84,0x13);//時
- write_1302(0x82,0x43);//分
- write_1302(0x8c,0x12);//年
- write_1302(0x88,0x06);//月
- write_1302(0x86,0x03);//日
- write_1302(0x8a,0x06);//星期
- write_1302(0xc0,0x08);//鬧鐘小時初始化
- write_1302(0xfc,0x00);//鬧鐘分鐘初始化
- write_1302(0x8e,0x80);//開保護
-
- }
- /********************************************************************************
- 掃描函數(shù)
- ********************************************************************************/
-
- void keyscan()
- {
- if(s1==0&&s4num==0) //按鍵1按下且s4再次之前未曾按過
- {
- delay(5);
- if(s1==0&&s4num==0)
- {
- flag1=1;
- s1num++;
- while(!s1);didi();
- if(s1num==1)
- {
- write_com(0x80+0x40+8);//光標(biāo)移動到**位置
- write_com(0x0f);//顯示光標(biāo)
- }
-
- if(s1num==2)
- {
- write_1302(0x8e,0x00);//禁止寫保護
- write_1302(0x80,miao);//寫入秒信息
- write_1302(0x8e,0x80);//開寫保護
- 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+13);
- }
- 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再次之前未曾按過
- {
- 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+13);
-
- }
- 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) //延時并重新檢測S3是否按下,用于差小誤差
- {
- if(s1num!=0)
- {
- while(!s3);didi();//在松手時將調(diào)整后的時間、日期及周信息寫入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;
- }
- if(s4num!=0)
- {
- while(!s3);didi();//在松手時將調(diào)整后的時間、日期及周信息寫入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;
- s4num=0;
- write_com(0x0c);
- }
-
- }
- }
- }
-
- if(s4==0&&s1num==0)//按鍵4按下*次且s1再次之前未曾按過
- {
-
- delay(5);
- if(s4==0&&s1num==0)
- {
- s4num++;
- flag2=1;
- while(!s4);didi();
- if(s4num==1)
- {
-
- write_com(0x80+0x40+14);
- write_com(0x0f);
- }
-
- if(s4num==2)
- {
- write_1302(0x8e,0x00);//禁止寫保護
- write_1302(0xfc,lfen);//鬧鐘初始化
- write_1302(0x8e,0x80);//開寫保護
- write_com(0x80+0x40+11);
- }
- if(s4num==3)
- {
- s4num=0;
- flag2=0;
- write_1302(0x8e,0x00);//禁止寫保護
- write_1302(0xc0,lshi);//鬧鐘初始化
- write_1302(0x8e,0x80);//開寫保護
- write_com(0x0c);//不顯示光標(biāo)
- }
- }
- }
-
- if(s4num!=0&&s1num==0)
- {
- if(s2==0)
- {
- delay(5);
- if(s2==0)
- {
- while(!s2);didi();
- if(s4num==1)
- {
- int x1,x2;
- x1=lfen%16;
- x2=lfen/16;
- x1++;
- if(x1==10)
- {
- x1=0;
- x2++;
- if(x2>=6)
- x2=0;
- }
- lfen=x1+x2*16;
- write_sfm(13+0x40,lfen);
- write_com(0x80+0x40+14);
- }
- if(s4num==2)
- {
- int x5,x6;
- x5=lshi%16;
- x6=lshi/16;
- x5++;
- if(x6>=2&&x5>=4)
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
以上全部Word格式文檔51hei提供下載:
電子時鐘設(shè)計-DS1302 1602 可調(diào)鬧鐘.doc
(3.36 MB, 下載次數(shù): 572)
2021-4-27 02:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者: hlwekopiy 時間: 2019-2-7 21:24
謝謝介紹的很詳細(xì)了,適合初學(xué)者。。
作者: wangshengs 時間: 2019-4-5 20:34
這個最后出現(xiàn)亂碼是不是程序的問題?我的供電5V沒有問題啊,用萬用表測了,所以有人能告訴我這個程序哪兒有問題嗎?
作者: Toxic_pill 時間: 2019-4-28 20:14
我下載的里頭怎么沒有程序 只有設(shè)計報告啊。。。
作者: 喜樂 時間: 2019-5-4 21:37
只有word
作者: 123456@QQ 時間: 2019-7-27 14:32
系統(tǒng)原理圖怎么沒有DS1302的晶振呀求解
作者: 17378576505 時間: 2019-8-15 19:16
為什么LCD1602沒顯示
作者: 17378576505 時間: 2019-8-15 19:19
LCD沒顯示和按鍵不管用,只有1302管用是代碼的問題嗎
作者: caifei9280 時間: 2019-9-27 10:52
高手啊 ,辛苦了,內(nèi)容很詳細(xì) 。
作者: jnshuhe 時間: 2019-9-27 11:24
謝謝樓主分享,學(xué)習(xí)了!
作者: pangshe 時間: 2019-12-24 12:36
高手 確實是高手
作者: 呆憨 時間: 2020-12-11 09:37
哇,超詳細(xì)的喔,要是有Proteus仿真就好了
作者: 呆憨 時間: 2020-12-11 09:39
要是加上仿真就好了
作者: 霖木語 時間: 2021-4-26 23:12
只有一個文檔
作者: A60885262 時間: 2021-5-1 00:32
很好,怎么沒給加分
作者: ltsg 時間: 2023-5-30 10:27
怎么燒錄不了?有解決辦法嗎
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |