版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 單片機課程設(shè)計報告</b></p><p> 題目名稱: 智能電子數(shù)字鐘設(shè)計 </p><p> 系 : 電氣工程系 </p><p> 專 業(yè): 建筑電氣與智能化 </p><p> 班 級: 電智
2、112 </p><p> 學(xué) 號: </p><p> 學(xué)生姓名: </p><p> 指導(dǎo)教師: </p><p> 職 稱: 講師
3、 </p><p> 2014年 1月 10日</p><p><b> 目 錄</b></p><p> 摘 要………………………………………………………………………………1</p><p> 一、系統(tǒng)總體方案設(shè)計……………………………………………………………2</p><
4、;p> 1、系統(tǒng)結(jié)構(gòu)框圖……………………………………………………………………2</p><p> 2、系統(tǒng)的基本原理及設(shè)計思想……………………………………………………2</p><p> 二、系統(tǒng)硬件設(shè)計…………………………………………………………………3</p><p> 1、電源模塊…………………………………………………………………………3<
5、/p><p> 2、單片機模塊………………………………………………………………………4</p><p> 3、晶振電路模塊……………………………………………………………………4</p><p> 4、LED顯示電路模塊………………………………………………………………5</p><p> 5、獨立鍵盤模塊………………………………………………
6、……………………6</p><p> 6、復(fù)位電路模塊……………………………………………………………………7</p><p> 7、報時電路模塊……………………………………………………………………7</p><p> 8、實時時鐘電路模塊………………………………………………………………7</p><p> 三、系統(tǒng)軟件設(shè)計………………
7、…………………………………………………10</p><p> 1、編程軟件選擇……………………………………………………………………10</p><p> 2、軟件設(shè)計流程……………………………………………………………………11</p><p> 結(jié) 論………………………………………………………………………………14</p><p>
8、; 參考文獻………………………………………………………………………………15</p><p> 附 錄………………………………………………………………………………16</p><p> 1、電路原理圖……………………………………………………………………16</p><p> 2、C語言程序………………………………………………………………………17<
9、;/p><p><b> 摘 要</b></p><p> 近年來,隨著電子產(chǎn)品的發(fā)展,單片機的應(yīng)用正在不斷地走向深入,由于它具有功能強,體積小,功耗低,價格便宜,工作可靠,使用方便等特點,因此越來越廣泛地應(yīng)用于各個領(lǐng)域.本文針對人們對數(shù)字時鐘的這一需求,設(shè)計了一種由單片機控制的智能化數(shù)字時鐘,功能強大,界面友好,更好的滿足了人們對數(shù)字時鐘的智能化要求。智能電子
10、數(shù)字鐘是采用AT89C51單片機對專用時鐘芯片DS1302控制來實現(xiàn)時鐘功能,通過專用LED顯示驅(qū)動芯片MAX7219實現(xiàn)LED的驅(qū)動控制,通過增量鍵盤預(yù)置和調(diào)整時間、星期。秒計數(shù)器滿60向分計數(shù)器進位,分計數(shù)器滿60向時計數(shù)器進位,時計數(shù)器以24為一個周期。AT89C51單片機通過控制專用時鐘芯片DS1302的輸出經(jīng)專用LED顯示驅(qū)動芯片MAX7219控制七位共陰LED顯示器,可將星期、時、分、秒在相應(yīng)位置正確顯示,并實現(xiàn)整點報時功能
11、。</p><p> 關(guān)鍵詞:智能數(shù)字鐘;AT89C51;LED;MAX7219</p><p> 一、系統(tǒng)總體方案設(shè)計</p><p> 由單片機作為數(shù)字鐘的核心控制器,可以通過通過專用時鐘芯片DS1302提供時鐘信號進行計時實現(xiàn)計時功能,將其時間數(shù)據(jù)經(jīng)單片機輸出,利用顯示器顯示出來。通過鍵盤可以進行定時、校時功能。輸出設(shè)備顯示器可以用液晶顯示技術(shù)和數(shù)碼管顯
12、示技術(shù)。單片機芯片作為控制系統(tǒng)的核心部件,它除了具備微機CPU的數(shù)值計算功能外,還具有靈活強大的控制功能,以便實時檢測系統(tǒng)的輸入量、控制系統(tǒng)的輸出量,實現(xiàn)自動控制。</p><p> 設(shè)計中采用單片機技術(shù)來實現(xiàn)數(shù)字鐘的功能。采用AT89C51單片機,用由LED顯示驅(qū)動芯片MAX7219控制7位共陰極LED的顯示電路。還有一些其他控制電路,如:晶振電路,復(fù)位電路,報時電路和鍵盤電路。</p><
13、;p><b> 1、系統(tǒng)結(jié)構(gòu)框圖</b></p><p> 系統(tǒng)由六個模塊組成,既:單片機模塊、晶振電路模塊、復(fù)位電路模塊、獨立鍵盤模塊、報時電路模塊和顯示電路模塊。按照系統(tǒng)設(shè)計功能的要求。電路系統(tǒng)構(gòu)成框圖如圖1所示。</p><p><b> 圖1 系統(tǒng)構(gòu)成框圖</b></p><p> 2、系統(tǒng)的基本原理
14、及設(shè)計思想</p><p> 使用9V干電池經(jīng)LM7805穩(wěn)壓,再經(jīng)穩(wěn)壓管D1穩(wěn)壓后輸出+5V直流電,供給AT89C51單片機模塊、晶振電路模塊、復(fù)位電路模塊、獨立鍵盤模塊、顯示電路模塊和報時電路模塊所需的工作電源。</p><p> 使用專用時鐘芯片DS1302為AT89C51單片機提供時鐘源,然后嚴(yán)格地按時序執(zhí)行指令進行工作。在執(zhí)行指令時,CPU首先到程序存儲器中取出需要執(zhí)行的指令
15、操作碼,然后譯碼,并由時序電路產(chǎn)生一系列控制信號完成指令所規(guī)定的操作。</p><p> 復(fù)位是單片機的初始化操作,只需給AT89C51的復(fù)位引腳RESET加上大于2個機器周期的高電平就可使AT89C51復(fù)位。當(dāng)AT89C51進行復(fù)位時,PC初始化為0000H,使AT89C51單片機從程序存儲器的0000H單元開始執(zhí)行程序。除了進入系統(tǒng)的正常初始化之外,當(dāng)程序運行出錯(如程序“跑飛”)或操作錯誤使系統(tǒng)處于“死鎖
16、”狀態(tài)時,也需要按復(fù)位鍵即RESET為高電平,使AT89C51擺脫“跑飛”或“死鎖”狀態(tài)而重新啟動程序。</p><p> 鍵盤的任務(wù)有三項:(1)首先判別是否有鍵按下。若有,進入下一步工作。(2)識別哪一個鍵被按下,并求出相應(yīng)的鍵值。(3)根據(jù)鍵值,找到相應(yīng)鍵值的處理程序入口。在本設(shè)計中,鍵盤具有向單片機輸入數(shù)據(jù)、命令等功能,是人與單片機對話的主要手段。通過鍵盤,可以預(yù)置時間、星期。</p>&
17、lt;p> 常見的LED數(shù)碼管為“8”字型的,共計8段。每一個段對應(yīng)一個發(fā)光二極管。這種數(shù)碼管顯示器有共陽極和共陰極兩種,本文采用共陰極接法。共陰極LED數(shù)碼管的發(fā)光二極管的陰極連接在一起,通常此公共陰極接地。當(dāng)某個發(fā)光二極管的陽極為高電平時,發(fā)光二極管點亮,相應(yīng)的段被顯示。采用MC14543作為LED驅(qū)動器來實現(xiàn)LED的動態(tài)掃描驅(qū)動,通過七位共陰LED顯示星期、時、分、秒。</p><p> 通過加入
18、一個使用晶體管驅(qū)動的蜂鳴器報時電路,當(dāng)時間到達整點時,報警電路進行報時。工作原理為:P1.7接晶體管基極輸入端,當(dāng)P1.7輸出高電平時,晶體管導(dǎo)通,壓電式蜂鳴器兩端獲得+5V電壓而鳴叫;當(dāng)P1.7輸出低電平時,晶體管截止,蜂鳴器停止發(fā)聲。</p><p><b> 二、系統(tǒng)硬件設(shè)計</b></p><p> 系統(tǒng)是以AT89C51為核心控制器,外加一些控制電路來實
19、現(xiàn)數(shù)字鐘的基本功能。</p><p><b> 1、電源模塊</b></p><p> 電源模塊如圖2 電源電路,考慮到測量儀器的應(yīng)用方便,本設(shè)計采用9V干電池經(jīng)LM7805穩(wěn)壓,再經(jīng)穩(wěn)壓管D1穩(wěn)壓后輸出+5V直流電,供給AT89C51單片機模塊、晶振電路模塊、復(fù)位電路模塊、獨立鍵盤模塊、顯示電路模塊和報時電路模塊所需的工作電源,電源正常工作由LED指示燈指示。&
20、lt;/p><p><b> 圖2 電源模塊</b></p><p><b> 2、單片機模塊</b></p><p> 本設(shè)計采用AT89C51單片機。AT89C51單片機是一種低功耗、高性能CMOS8位微控制器,具有8K在線可編程存儲器。AT89C51有5個中斷源,2個可編程的16位定時器/計數(shù)器。低功耗節(jié)電模式有空
21、閑模式和掉電模式。AT89C51的引腳圖如圖3所示:</p><p> (1)RESET:復(fù)位信號輸入端,高電平有效。</p><p> (2)/VP: 是外部程序存儲器訪問允許控制端。</p><p> ?。?)XTAL1/XTAL2:片內(nèi)振蕩器反向放大器和時鐘發(fā)生器電路的輸入/輸出端。</p><p> ?。?):片外程序存儲器的讀選
22、通信號,低電平有效。</p><p> ?。?)ALE/:ALE為CPU訪問外部程序存儲器或外部數(shù)據(jù)存儲器提供一個地址鎖存信號,將低8位地址鎖存在片外的地址鎖存器中。</p><p> (6)P0口:8位,漏極開路的雙向I/O口。</p><p> ?。?)P1口:8位,準(zhǔn)雙向I/O口,具有內(nèi)部上拉電阻。</p><p> ?。?)P2口:
23、8位,準(zhǔn)雙向I/O口,具有內(nèi)部上拉電阻。</p><p> ?。?)P3口:8位,準(zhǔn)雙向I/O口,具有內(nèi)部上拉電阻。還可提供第二功能。</p><p> 圖3 AT89C51單片機</p><p><b> 3、晶振電路模塊</b></p><p> 晶體振蕩器電路給數(shù)字鐘提供一個頻率穩(wěn)定準(zhǔn)確的12MHz的方波信號
24、。AT89C51內(nèi)部有一個用于構(gòu)成振蕩器的高增益反相放大器,它的輸入端為芯片引腳XTAL1,輸出端為引腳XTAL2。這兩個引腳跨接石英晶體和微調(diào)電容,構(gòu)成一個穩(wěn)定 的自激振蕩器,圖4為AT89C51內(nèi)部時鐘方式的電路。</p><p> 電路中的兩個電容典型值通常選擇為30pF,該電容的大小會影響振蕩器頻率的高低、振蕩器的穩(wěn)定性和起振的快速性。晶體振蕩的范圍通常是在1.212MHZ。晶體的頻率越高,系統(tǒng)的時鐘頻
25、率越高,單片機的運行速度也就越快。</p><p> 4、LED顯示電路模塊</p><p> MAX7219(圖5)是MAXIM公司生產(chǎn)的串行輸入/輸出共陰極數(shù)碼管顯示驅(qū)動芯片,一片MAX7219可驅(qū)動8個7段(包括小數(shù)點共8段)數(shù)字LED、LED條線圖形顯示器、或64個分立的LED發(fā)光二級管。該芯片具有10MHz傳輸率的三線串行接口可與任何微處理器相連,只需一個外接電阻即可設(shè)置所有
26、LED的段電流。它的操作很簡單,MCU只需通過模擬SPI三線接口就可以將相關(guān)的指令寫入MAX7219的內(nèi)部指令和數(shù)據(jù)寄存器,同時它還允許用戶選擇多種譯碼方式和譯碼位。此外它還支持多片7219串聯(lián)方式,這樣MCU就可以通過3根線(即串行數(shù)據(jù)線、串行時鐘線和芯片選通線)控制更多的數(shù)碼管顯示。</p><p> 圖5 MAX7219</p><p><b> 各引腳的功能為:<
27、;/b></p><p> DIN:串行數(shù)據(jù)輸入端</p><p> DOUT:串行數(shù)據(jù)輸出端,用于級連擴展</p><p> LOAD:裝載數(shù)據(jù)輸入CLK:串行時鐘輸入</p><p> DIG0~DIG7:8位LED位選線,從共陰極LED中吸入電流</p><p> SEG A~SEG G DP7
28、段驅(qū)動和小數(shù)點驅(qū)動</p><p> ISET:通過一個10k電阻和Vcc相連,設(shè)置段電流</p><p> MAX7219同樣允許用戶對每一個數(shù)據(jù)選擇編碼或者不編碼。整個設(shè)備包含一個150μA的低功耗關(guān)閉模式,模擬和數(shù)字亮度控制,一個掃描限制寄存器允許用戶顯示1-8位數(shù)據(jù),還有一個讓所有LED發(fā)光的檢測模式。電路圖如下圖6所示。</p><p> 圖6 L
29、ED顯示電路</p><p><b> 5、獨立鍵盤模塊</b></p><p> 獨立式鍵盤的特點是:一鍵一線,各鍵相互獨立,每個按鍵各接一條I/O口線,通過檢測I/O輸入線的電平狀態(tài),可以很容易地判斷哪個按鍵被按下。圖7中的上拉電阻保證按鍵釋放時,輸入檢測線上有穩(wěn)定的高電平,當(dāng)某一按鍵按下時,對應(yīng)</p><p> 的檢測線就變成了低
30、電平,與其它按鍵相連的檢測線仍為高電平,只需讀入I/O輸入線的狀態(tài),判別哪一條I/O輸入線為低電平,就很容易識別出哪個按鍵被按下。</p><p> 在本設(shè)計中,用四個鍵來實現(xiàn)對星期和時間的校對,按K week來調(diào)節(jié)星期,按K hour來調(diào)節(jié)小時的時間,按K min來調(diào)節(jié)分針的時間,按K sec來調(diào)節(jié)秒的時間。</p><p><b> 6、復(fù)位電路模塊</b>&
31、lt;/p><p> 圖8所示為復(fù)位電路原理圖,復(fù)位是單片機的初始化操作,其主要功能是把PC初始化為0000H,使單片機從0000H單元開始執(zhí)行程序,并使其它功能單元處于一個確定的初始狀態(tài)。按鍵手動復(fù)位有電平和脈沖兩種方式,本設(shè)計采用按鍵電平復(fù)位電路,它是通過復(fù)位端RESET經(jīng)電阻與Vcc電源接通而實現(xiàn)的,它兼具上電復(fù)位功能。因本系統(tǒng)的晶振的頻率為12MHz,所以,復(fù)位信號持續(xù)時間應(yīng)當(dāng)超過2μS才能完成復(fù)位操作。&
32、lt;/p><p><b> 7、報時電路模塊</b></p><p> 當(dāng)LED顯示器所顯示的時間為整點時,單片機系統(tǒng)能夠發(fā)出提醒聲音使人們警覺,使用單片機系統(tǒng)的I/O口很容易實現(xiàn)該功能。在圖9中,P1.7接晶體管的基極輸入端。當(dāng)P1.7輸出高電平時,晶體管導(dǎo)通,壓電蜂鳴器兩端獲得約+5V電壓而鳴叫;當(dāng)P1.7輸出低電平時,晶體管截止,蜂鳴器停止發(fā)聲。[8]<
33、/p><p><b> 實時時鐘電路模塊</b></p><p> DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。</p><
34、p> 圖10 DS1302的引腳</p><p> 圖10表出DS1302的引腳排列,其中Vcc1為后備電源,VCC2為主電源。在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當(dāng)Vcc2大于Vcc1+0.2V時,Vcc2給DS1302供電。當(dāng)Vcc2小于Vcc1時,DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768kHz晶振。RST是復(fù)位
35、/片選線,通過把RST輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)RST為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對DS1302進行操作。如果在傳送過程中RST置為低電平,則會終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運行時,在Vcc≥2.5V之前,RST必須保持低電平。只有在SCLK為低電平時,才能將RST置
36、為高電平。I/O為串行數(shù)據(jù)輸入輸出端(雙向),SCLK始終是輸入端。</p><p><b> 三、系統(tǒng)軟件設(shè)計</b></p><p><b> 1、編程軟件選擇</b></p><p> 本設(shè)計的軟件全部采用C語言進行編寫。C語言編輯、編譯軟件選擇的是Keil uVision3。 Keil公司成立于1986年,主
37、要開發(fā)、制造和銷售嵌入式8051、251、ARM、XC16x/C16x/ST10等微控制器軟件開發(fā)工具,提供ANSI C編譯器、宏匯編程序、實時管理、調(diào)試和模擬器、綜合評估板等。Keil公司的uVision把編輯、編譯、鏈接和仿真等模式打包成集成開發(fā)環(huán)境,當(dāng)然其集成的C51編譯器肯定跟Franklin公司的相關(guān)模塊肯定有交叉性,uVision還包含項目管理和調(diào)試器等非常有用的功能。</p><p><b&g
38、t; 2、 軟件設(shè)計流程</b></p><p> 主程序的功能主要是讀時間,將時間數(shù)據(jù)送到LED數(shù)碼管顯示,再判斷是否有按鍵按下,從而進行校時功能。當(dāng)?shù)竭_整點時,發(fā)出報時音。其流程圖如圖3-1所示。</p><p> 時鐘數(shù)據(jù)讀寫程序流程</p><p> 對時鐘芯片的操作主要包括:一是將芯片中的日期等數(shù)據(jù)讀出來,二是在進行日期等設(shè)置時將設(shè)置的
39、數(shù)據(jù)寫入芯片,這也是按鍵處理時的主要內(nèi)容。無論是讀數(shù)據(jù)還是寫數(shù)據(jù),均應(yīng)滿足DS1302 對時序的要求。對芯片各個數(shù)據(jù)部分的訪問是通過地址進行的,且讀和寫的地址不一樣。讀出的數(shù)據(jù)同樣要轉(zhuǎn)為ASC II碼,然后儲存起來,等待送去顯示,流程圖如下圖所示:</p><p> 圖3-2 時鐘數(shù)據(jù)讀寫程序流程</p><p><b> LED顯示程序流程</b></p
40、><p> 系統(tǒng)的日期和時間信息顯示在7片8段LED數(shù)碼管上,在LED顯示器的第1片顯示星期,第2、3片顯示“時”,第4、5片顯示“分”、第6、7片顯示“秒”。</p><p> 液晶顯示程序流程如下圖所示:</p><p> 圖3-3 LED顯示程序流程</p><p><b> 按鍵處理程序流程</b><
41、/p><p> 本設(shè)計使用5個獨立式按鍵來控制時間和日期的調(diào)整,以及12小時/24小時計時方式的切換。當(dāng)“SET”鍵按下時進入時間、日期的調(diào)整模式,每按 “UP”鍵一次,當(dāng)前數(shù)值增1;每按 “DOWN”鍵一次,當(dāng)前數(shù)值減1;調(diào)整完畢后按下“OK”鍵進行確認(rèn)?!癕ODE”鍵為12小時/24小時計時方式的切換按鍵,若當(dāng)前為12小時計時方式,按下“MODE”鍵后轉(zhuǎn)變?yōu)?4小時方式;若當(dāng)前為24小時計時方式,則按下“MOD
42、E”鍵后轉(zhuǎn)變?yōu)?2小時方式。</p><p> 圖3-4 按鍵處理程序流程</p><p><b> 四、結(jié)論</b></p><p> 本設(shè)計在功能上基本上完成了本次智能化電子系統(tǒng)設(shè)計的要求,但是也尚存在一些問題。由于時間倉促和自身水平有限,對于電路的可靠性,穩(wěn)定性等參數(shù)還未做過詳細的測試。還可以通過修改程序,完成字符或數(shù)字的滾動顯示
43、。這些是我們組尚未完成的附加功能。</p><p> 在本次設(shè)計中,我們最終完成本次智能化電子系統(tǒng)設(shè)計系的基本要求及功能,并在此基礎(chǔ)了對系統(tǒng)功能作了擴展,增加了鬧鐘設(shè)置以及溫度測試等部分。在設(shè)計開始前我們對各個模塊進行了詳細的分析和設(shè)計準(zhǔn)備工作,設(shè)計過程中,積極參與完成各個技術(shù)實現(xiàn)的難點,更進一步地熟悉了芯片的結(jié)構(gòu)及掌握了各芯片的工作原理和具體的使用方法。</p><p> 通過本次設(shè)
44、計,我們對單片機有了更深刻的認(rèn)識,也從實踐的例子中去感受到了單片機設(shè)計給我們設(shè)計帶來的改變與進步。我們不僅掌握protel99se軟件的使用。與此同時,我們還對電子設(shè)計的思路有了更多的認(rèn)識。這次對多功能數(shù)字鐘的設(shè)計與制作,讓我了解設(shè)計電路的程序,也了解了關(guān)于智能電子鐘的原理與設(shè)計理念。在此次的智能電子鐘設(shè)計過程中,更進一步地熟悉了芯片的結(jié)構(gòu)及掌握了各芯片的工作原理和具體的使用方法??傊鞘芤娣藴\。這為自己今后進一步深化學(xué)習(xí),積累了一定寶
45、貴經(jīng)驗。</p><p> 此次智能電子鐘設(shè)計中,我要特別感謝我的指導(dǎo)老師的熱情關(guān)懷和悉心指導(dǎo)。讓我從中更加的認(rèn)識了單片機的功能的實現(xiàn),同時也要感謝班內(nèi)的一些同學(xué)的幫助,在設(shè)計中幫我解決一些設(shè)計方面的困難。</p><p><b> 參考文獻</b></p><p> [1] 李朝青. 單片機原理及接口技術(shù)(簡明修訂版) [M]. 杭州:
46、 北京航空航天大學(xué)出版社,1998.</p><p> [2] 李廣弟. 單片機基礎(chǔ)[M]. 北京: 北京航空航天大學(xué)出版社,1994.</p><p> [3] 高吉祥. 電子技術(shù)基礎(chǔ)實驗與課程設(shè)計[M]. 電子工業(yè)出版社,2002.</p><p> [4] 康華光. 電子技術(shù)基礎(chǔ)[M]. 北京:高等教育出版社,2002.</p><
47、;p> [5] 陳忠平. 基于Proteus的51系列單片機設(shè)計與仿真(第二版)[M]. 北京:電子工業(yè)出版社,2012</p><p> [6] 清源科技.Protel 99 SE電路原理圖與PCB設(shè)計仿真[M].北京:機械工業(yè)出版社,2007.</p><p> [7] 康光華. 電子技術(shù)基礎(chǔ)模擬部分[M]. 北京:高等教育出版社,2006.</p>&
48、lt;p> [8] 梅麗鳳、王艷秋等. 單片機原理及接口技術(shù)[M]. 北京:清華大學(xué)出版社,2004.</p><p> [9] 閻石. 數(shù)字電子技術(shù)基礎(chǔ)(第四版) [M]. 北京:高等教育出版社,1998.</p><p> [10] 郁漢琪. 數(shù)字電子技術(shù)實驗及課程設(shè)計[M]. 北京:高等教育出版社,1995.</p><p> [11]張毅
49、剛.單片機原理及應(yīng)用[M]. 北京:高等教育出版社,2010.</p><p> [12]陸彬.21天學(xué)通51單片機開發(fā)[M]. 北京:電子工業(yè)出版社,2011</p><p><b> 附錄</b></p><p><b> 電路原理圖</b></p><p><b> C語言
50、程序</b></p><p> #include <reg52.H></p><p> #include <intrins.h></p><p> sbit LOAD=P1^1; </p><p> sbit DIN=P1^0; </p><p> sbit CL
51、K=P1^2; </p><p> sbit SCK=P3^4;</p><p> sbit SDA=P3^3;</p><p> sbit RST=P3^5;</p><p> sbit KEY1=P1^4; </p><p> sbit KEY2=P1^5;</p&g
52、t;<p> sbit KEY3=P1^6;</p><p> sbit KEY4=P1^7;</p><p> #define DECODE_MODE 0x09 </p><p> #define INTENSITY 0x0A </p><p> #define SCAN_LIMIT 0x0B &
53、lt;/p><p> #define SHUT_DOWN 0x0C </p><p> #define DISPLAY_TEST 0x0F </p><p> #define RST_CLRRST=0/*電平置低*/</p><p> #define RST_SETRST=1/*電平置高*/</p><p&
54、gt; #define IO_CLRSDA=0/*電平置低*/</p><p> #define IO_SETSDA=1/*電平置高*/</p><p> #define IO_RSDA/*電平讀取*/</p><p> #define SCK_CLRSCK=0/*時鐘信號*/</p><p> #define SCK_SE
55、TSCK=1/*電平置高*/</p><p> #define ds1302_sec_add0x80</p><p> #define ds1302_min_add0x82</p><p> #define ds1302_hr_add0x84</p><p> #define ds1302_control_add0x8
56、e</p><p> #define ds1302_charger_add0x90 </p><p> #define ds1302_clkburst_add0xbe</p><p> #define time 10000 </p><p><b> //函數(shù)聲明</b></p&g
57、t;<p> void Write7219(unsigned char address,unsigned char dat);</p><p> void Initial(void);</p><p> void Write_Ds1302_byte(unsigned char temp); </p><p> void Write_Ds1302
58、(unsigned char address,unsigned char dat );</p><p> unsigned char Read_Ds1302 ( unsigned char address );</p><p> void ds1302_write_time(void);</p><p> void ds1302_read_time(void)
59、;</p><p> void keyscan(void);</p><p> void Read_RTC(void);//read RTC </p><p> void Set_RTC(void); //set RTC </p><p> void InitTIMER0(void);//inital timer0</p>
60、<p> bit ReadRTC_Flag;</p><p> unsigned char time_buf1[4]={20,16,30};</p><p> unsigned int time_buf[4] ;</p><p> unsigned char l_tmpdisplay[8];</p><p> unsi
61、gned char keydat,temp;</p><p> //地址、數(shù)據(jù)發(fā)送子程序</p><p> void Write7219(unsigned char address,unsigned char dat)</p><p><b> { </b></p><p> unsigned char i;
62、</p><p> LOAD=0; </p><p><b> //發(fā)送地址</b></p><p> for (i=0;i<8;i++) </p><p> { CLK=0; </p><p> DIN=(bit)(address&0
63、x80); </p><p> address<<=1; CLK=1; }</p><p> for (i=0;i<8;i++) </p><p><b> { </b></p><p><b> CLK=
64、0;</b></p><p> DIN=(bit)(dat&0x80); </p><p> dat<<=1; </p><p> CLK=1; }</p><p> LOAD=1; </p><p><b> }</b&
65、gt;</p><p> /void Initial(void) </p><p><b> { </b></p><p> Write7219(SHUT_DOWN,0x01); //開啟正常工作模式(0xX1)</p><p> Write7219(DISPLAY
66、_TEST,0x00); //選擇工作模式(0xX0)</p><p> Write7219(DECODE_MODE,0xff); //選用全譯碼模式</p><p> Write7219(SCAN_LIMIT,0x07); //8只LED全用 </p><p><b> }</b></p>
67、;<p> void delay(unsigned int cnt)</p><p><b> {</b></p><p> while(--cnt);</p><p><b> }</b></p><p> void main(void) </p>&l
68、t;p><b> {</b></p><p> InitTIMER0(); </p><p> Initial(); ds1302_write_time(); </p><p><b> while(1)</b></p><p>
69、<b> {</b></p><p> if(ReadRTC_Flag)</p><p><b> {</b></p><p> ReadRTC_Flag=0;</p><p> ds1302_read_time();</p><p> l_tmpdisplay
70、[0]=time_buf1[1]/10;l_tmpdisplay[1]=time_buf1[1]%10;l_tmpdisplay[2]=10;l_tmpdisplay[3]=time_buf1[2]/10;</p><p> l_tmpdisplay[4]=time_buf1[2]%10;</p><p> l_tmpdisplay[5]=10;</p>
71、;<p> l_tmpdisplay[6]=time_buf1[3]/10;</p><p> l_tmpdisplay[7]=time_buf1[3]%10;</p><p><b> }</b></p><p> keyscan();</p><p><b> }</b>
72、;</p><p><b> }</b></p><p> void InitTIMER0(void)</p><p><b> {</b></p><p> TMOD|=0x01;//定時器設(shè)置 16位</p><p> TH0=0xef;//初始化值</p
73、><p><b> TL0=0xf0;</b></p><p><b> ET0=1;</b></p><p><b> TR0=1;</b></p><p><b> EA=1;</b></p><p><b>
74、}</b></p><p> /*向DS1302寫入一字節(jié)數(shù)據(jù)*/</p><p> void ds1302_write_byte(unsigned char addr, unsigned char d) {</p><p> unsigned char i;</p><p> RST_SET;</p&g
75、t;<p> addr = addr & 0xFE;</p><p> for (i = 0; i < 8; i ++) </p><p><b> {</b></p><p> if (addr & 0x01) {</p><p><b> IO_SET;<
76、/b></p><p><b> }</b></p><p><b> else {</b></p><p><b> IO_CLR;</b></p><p><b> }</b></p><p><b>
77、 SCK_SET;</b></p><p><b> SCK_CLR;</b></p><p> addr = addr >> 1;</p><p><b> }</b></p><p> for (i = 0; i < 8; i ++) {</p>
78、<p> if (d & 0x01) {</p><p><b> IO_SET;</b></p><p><b> }</b></p><p><b> else {</b></p><p><b> IO_CLR;</b>
79、;</p><p><b> }</b></p><p><b> SCK_SET;</b></p><p><b> SCK_CLR;</b></p><p> d = d >> 1;</p><p><b> }<
80、;/b></p><p> RST_CLR;}</p><p> unsigned char ds1302_read_byte(unsigned char addr) {</p><p> unsigned char i;</p><p> unsigned char temp;</p><p>
81、 RST_SET;</p><p> addr = addr | 0x01;</p><p> for (i = 0; i < 8; i ++)</p><p><b> {</b></p><p> if (addr & 0x01) {</p><p><
82、b> IO_SET;</b></p><p><b> }</b></p><p><b> else {</b></p><p><b> IO_CLR;</b></p><p><b> }</b></p>&
83、lt;p><b> SCK_SET;</b></p><p><b> SCK_CLR;</b></p><p> addr = addr >> 1;</p><p><b> }</b></p><p> for (i = 0; i < 8;
84、 i ++) {</p><p> temp = temp >> 1;</p><p> if (IO_R) {</p><p> temp |= 0x80;</p><p><b> }</b></p><p><b> else {</b></
85、p><p> temp &= 0x7F;</p><p><b> }</b></p><p><b> SCK_SET;</b></p><p><b> SCK_CLR;</b></p><p><b> }</b>
86、;</p><p> RST_CLR;return temp;</p><p><b> }</b></p><p> void ds1302_write_time(void) {</p><p> unsigned char i,tmp;</p><p> for(i=0;
87、i<4;i++){ //BCD處理</p><p> tmp=time_buf1[i]/10;</p><p> time_buf[i]=time_buf1[i]%10;</p><p> time_buf[i]=time_buf[i]+tmp*16;</p><p><b> }</b>
88、;</p><p> ds1302_write_byte(ds1302_control_add,0x00); </p><p> ds1302_write_byte(ds1302_sec_add,0x80); </p><p> ds1302_write_byte(ds1302_charger_add,0xa9); </p><
89、;p> ds1302_write_byte(ds1302_hr_add,time_buf[1]);ds1302_write_byte(ds1302_min_add,time_buf[2]);ds1302_write_byte(ds1302_sec_add,time_buf[3]);</p><p> ds1302_write_byte(ds1302_control_add,0x80);
90、}</p><p> void ds1302_read_time(void) </p><p> { unsigned char i,tmp;</p><p> time_buf[1]=ds1302_read_byte(ds1302_hr_add);//時 </p><p> time_buf[2]=ds1302_read_by
91、te(ds1302_min_add);//分 </p><p> time_buf[3]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒 </p><p> for(i=0;i<4;i++){ tmp=time_buf[i]/16;</p><p> time_buf1[i]=time_
92、buf[i]%16;</p><p> time_buf1[i]=time_buf1[i]+tmp*10;</p><p><b> }</b></p><p><b> }</b></p><p> void tim(void) interrupt 1 using 1
93、 </p><p><b> {</b></p><p> static unsigned char i,num;</p><p> unsigned char j;</p><p><b> TH0=0xf5;</b></p><p>
94、<b> TL0=0xe0;</b></p><p> for(j=1;j<9;j++)</p><p> { </p><p> Write7219(j,l_tmpdisplay[j-1]); </p><p><b> }</b></p>&l
95、t;p><b> i++;</b></p><p><b> if(i==8)</b></p><p><b> {</b></p><p><b> i=0;</b></p><p><b> num++;</b>&
96、lt;/p><p> if(10==num) {</p><p> ReadRTC_Flag=1; num=0;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b&g
97、t;</p><p> void keyscan(void)</p><p><b> {</b></p><p> if(!KEY1) {</p><p> delay(time);</p><p><b> if(!KEY1)</b></p>
98、<p> { while(!KEY1) ; </p><p><b> keydat++;</b></p><p> if(keydat==4)</p><p><b> keydat=1;</b></p><p><b> }</b><
99、;/p><p><b> }</b></p><p> if( keydat==1)</p><p><b> {</b></p><p><b> P0=0XFE;</b></p><p><b> if(!KEY2)</b>
100、;</p><p><b> {</b></p><p> delay(time);</p><p><b> if(!KEY2)</b></p><p> { while(!KEY2) ; </p><p> time_buf1[1]++;if
101、(time_buf1[1]==24)time_buf1[1]=0; ds1302_write_time(); </p><p><b> }</b></p><p><b> } </b></p><p> if(!KEY3) </p><p><b>
102、; {</b></p><p> delay(time);</p><p><b> if(!KEY3)</b></p><p> { while(!KEY3) ; </p><p> time_buf1[1]--;if(time_buf1[1]==255)time_buf1[1]=23;
103、 </p><p> ds1302_write_time(); </p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> if( keydat==2)
104、 {</p><p><b> P0=0Xfd;</b></p><p> if(!KEY2){</p><p> delay(time);</p><p><b> if(!KEY2)</b></p><p> { while(!KEY2) ; <
105、/p><p> time_buf1[2]++;if(time_buf1[2]==60)time_buf1[2]=0;//分加1</p><p> ds1302_write_time(); </p><p><b> }</b></p><p><b> }</b></p><
106、p> if(!KEY3) </p><p><b> {</b></p><p> delay(time);</p><p><b> if(!KEY3)</b></p><p> { while(!KEY3) ; </p><p> time_buf1[
107、2]--;if(time_buf1[2]==255)time_buf1[2]=59; ds1302_write_time(); </p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p>
108、 if( keydat==3) </p><p><b> {</b></p><p><b> P0=0XFB;</b></p><p> if(!KEY2){</p><p> delay(time);</p><p><b> if(!KEY2)
109、</b></p><p> { while(!KEY2) ; </p><p> time_buf1[3]++;if(time_buf1[3]==60)time_buf1[3]=0;ds1302_write_time(); </p><p><b> }</b></p><p><b&g
110、t; }</b></p><p> if(!KEY3) {</p><p> delay(time);</p><p><b> if(!KEY3)</b></p><p> { while(!KEY3) ; </p><p> time_buf1[3]--;if(t
111、ime_buf1[3]==255)time_buf1[3]=59;ds1302_write_time(); </p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> if(KEY4==0
112、)</p><p><b> {</b></p><p> delay(time);</p><p><b> if(!KEY4)</b></p><p><b> {</b></p><p><b> keydat=0;</b
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)字電子課程設(shè)計---數(shù)字鐘
- 電力電子課程設(shè)計-- 數(shù)字鐘
- 單片機課程設(shè)計--智能電子數(shù)字鐘設(shè)計
- 電工電子課程設(shè)計---數(shù)字鐘設(shè)計
- 電子鐘課程設(shè)計報告--數(shù)字鐘設(shè)計
- 數(shù)字鐘課程設(shè)計
- 數(shù)字鐘課程設(shè)計
- 課程設(shè)計---多功能電子數(shù)字鐘
- 數(shù)字鐘課程設(shè)計
- 數(shù)字鐘課程設(shè)計
- 數(shù)字鐘課程設(shè)計
- 數(shù)字電子電路課程設(shè)計---數(shù)字鐘
- 課程設(shè)計--多功能電子數(shù)字鐘
- 數(shù)字鐘課程設(shè)計
- 數(shù)字鐘課程設(shè)計
- 數(shù)字電子技術(shù)課程設(shè)計--數(shù)字鐘
- 電子技術(shù)課程設(shè)計 數(shù)字鐘設(shè)計
- 數(shù)字鐘課程設(shè)計 (2)
- 課程設(shè)計數(shù)字鐘
- eda數(shù)字鐘課程設(shè)計
評論
0/150
提交評論