版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 電子課程設(shè)計(jì)報(bào)告</b></p><p> 課程名稱(chēng): 單片機(jī)課程設(shè)計(jì) </p><p> 設(shè)計(jì)內(nèi)容: 萬(wàn)年歷電子時(shí)鐘 </p><p> 實(shí)驗(yàn)時(shí)間: 2011年12月
2、 </p><p> 專(zhuān)業(yè)班級(jí): 09電子(2)班 </p><p> 姓 名: </p><p> 學(xué) 號(hào): </p><p> 同 組 人:
3、 </p><p> 指導(dǎo)老師: </p><p> 2011年 12月 29 日</p><p><b> 目錄</b></p><p><b> 摘要2</b></p><p
4、><b> 第一章 緒論3</b></p><p> 1.1引言及設(shè)計(jì)思路3</p><p> 第二章 系統(tǒng)設(shè)計(jì)4</p><p><b> 2.14</b></p><p> 2.2 系統(tǒng)硬件設(shè)計(jì)4</p><p> 2.2.1系統(tǒng)總體框架4
5、</p><p> 2.2.2 模塊二5</p><p> 2.3系統(tǒng)軟件設(shè)計(jì)5</p><p> 2.4設(shè)計(jì)說(shuō)明書(shū):6</p><p> 2.4.1模塊劃分:6</p><p> 2.5使用說(shuō)明書(shū):6</p><p> 2.6元件清單:6</p><
6、;p><b> 第三章總結(jié)7</b></p><p><b> 3.1設(shè)計(jì)過(guò)程7</b></p><p> 3.2心得體會(huì)7</p><p><b> 附錄8</b></p><p><b> 摘要</b></p>
7、<p> 單片機(jī)應(yīng)用技術(shù)飛速發(fā)展,縱觀我們現(xiàn)在生活的各個(gè)領(lǐng)域,從導(dǎo)彈的導(dǎo)航裝置到飛機(jī)上的各種儀表的控制,從計(jì)算機(jī)的網(wǎng)絡(luò)通訊與數(shù)據(jù)傳輸,到工業(yè)自動(dòng)化過(guò)程的實(shí)時(shí)控制和數(shù)據(jù)處理,以及我們生活中廣泛使用的各種智能IC卡等,這些都離不開(kāi)單片機(jī)。單片機(jī)是集CPU、RAM、ROM、定時(shí)、計(jì)數(shù)和多種接口于一體的微控制器。它體積小,成本低,功能強(qiáng),廣泛應(yīng)用于智能產(chǎn)業(yè)和工業(yè)自動(dòng)化上。而51系列單片機(jī)是各單片機(jī)中最為典型和最有代表性的一種。&l
8、t;/p><p> 萬(wàn)年歷在日常生活中最常見(jiàn),應(yīng)用也最廣泛。本次課程設(shè)計(jì)主要就是設(shè)計(jì)一款數(shù)字鐘,以89S51單片機(jī)為核心,配備數(shù)碼管,按鍵,蜂鳴器。數(shù)字鐘采用24小時(shí)制方式顯示時(shí)間,年、月、日、秒及毫秒。 文章的核心主要從硬件設(shè)計(jì)和軟件編程兩個(gè)大的方面。硬件電路設(shè)計(jì)主要包括中央處理單元電路、時(shí)鐘電路、人機(jī)接口電路、信號(hào)處理電路、執(zhí)行電路等幾部分組成。軟件用C語(yǔ)言來(lái)實(shí)現(xiàn),主要包括主程序、時(shí)間設(shè)置子程序,按鍵切
9、換程序,校時(shí)程序等軟件模塊。</p><p> 關(guān)鍵字: 單片機(jī) 時(shí)間 小時(shí) 分鐘 秒</p><p><b> 第一章 緒論</b></p><p> 1.1引言及設(shè)計(jì)思路</p><p> 萬(wàn)年歷是采用數(shù)字電路實(shí)現(xiàn)對(duì)年、月、日,時(shí)、分、秒,數(shù)字顯示的計(jì)時(shí)裝置,廣泛用于個(gè)人家庭,車(chē)站, 碼頭辦
10、公室等公共場(chǎng)所,成為人們?nèi)粘I钪胁豢缮俚谋匦杵?由于數(shù)字集成電路的發(fā)展和石英晶體振蕩器的廣泛應(yīng)用,使得數(shù)字鐘的精度,遠(yuǎn)遠(yuǎn)超過(guò)老式鐘表, 鐘表的數(shù)字化給人們生產(chǎn)生活帶來(lái)了極大的方便,而且大大地?cái)U(kuò)展了鐘表原先的報(bào)時(shí)功能。諸如定時(shí)自動(dòng)報(bào)警、按時(shí)自動(dòng)打鈴、時(shí)間程序自動(dòng)控制、定時(shí)廣播、自動(dòng)起閉路燈、定時(shí)開(kāi)關(guān)烘箱、通斷動(dòng)力設(shè)備、甚至各種定時(shí)電氣的自動(dòng)啟用等,所有這些,都是以鐘表數(shù)字化為基礎(chǔ)的。因此,研究數(shù)字鐘及擴(kuò)大其應(yīng)用,有著非?,F(xiàn)實(shí)的意義。&l
11、t;/p><p> 一開(kāi)始接觸到實(shí)驗(yàn)箱的時(shí)候大家都很陌生,因?yàn)槭堑谝淮问褂茫詫?shí)驗(yàn)箱很多模塊的功能及使用方法都要我們自己去掌握。在沒(méi)有實(shí)質(zhì)說(shuō)明書(shū)的情況下,我們先后使用萬(wàn)用表測(cè)電壓、電阻的方法得到了實(shí)驗(yàn)箱主芯片與單片機(jī)P口的引腳對(duì)應(yīng)圖,為接下來(lái)的軟件編程和硬件接口連接打下了基礎(chǔ)。萬(wàn)年歷電子時(shí)鐘的實(shí)現(xiàn)主要硬件模塊是單片機(jī),本實(shí)驗(yàn)箱使用的的AT89S51單片機(jī),此外還有顯示模塊四位數(shù)碼管,還有時(shí)間切換和調(diào)整模塊按鈕和鬧
12、鈴模塊蜂鳴器。起初我們想用實(shí)驗(yàn)箱上原有的HD7279芯片來(lái)驅(qū)動(dòng)數(shù)碼管顯示和鍵盤(pán)控制,但由于對(duì)這款芯片的認(rèn)識(shí)不足,雖然從網(wǎng)上找到了很多關(guān)于HD7279的資料,但仍不能正確的使用它,于是我們想到通過(guò)對(duì)TFT彩屏液晶顯示器的控制來(lái)顯示時(shí)間,但對(duì)于它的顯示原理也不能掌握,最后我們想到了用單片機(jī)直接控制數(shù)碼管來(lái)顯示時(shí)間。</p><p> 單片機(jī)P0的八個(gè)口分別接到數(shù)碼管的八個(gè)段選位。通過(guò)按下按鈕1,可以實(shí)現(xiàn)從年—月日—
13、時(shí)分—秒毫秒的顯示切換,按下按鈕2,可實(shí)現(xiàn)年份、月份日期,時(shí)分的加減,以實(shí)現(xiàn)時(shí)間的校正。</p><p><b> 第二章 系統(tǒng)設(shè)計(jì)</b></p><p><b> 2.1設(shè)計(jì)任務(wù):</b></p><p> 設(shè)計(jì)一個(gè)萬(wàn)年歷,主要以單片機(jī)和數(shù)碼管為硬件基礎(chǔ),載入用C語(yǔ)言編寫(xiě)的程序,設(shè)計(jì)出功能完善的萬(wàn)年歷。該萬(wàn)年歷通
14、過(guò)按鍵可切換顯示時(shí)間與日期、月份、日期、年份;能自動(dòng)準(zhǔn)確的計(jì)時(shí);能通過(guò)判斷年份和月份來(lái)顯示相應(yīng)的天數(shù)(即能判斷閏年,大月和小月)。</p><p> 2.2 系統(tǒng)硬件設(shè)計(jì)和顯示</p><p> 2.2.1系統(tǒng)總體框架</p><p> 2.2.2 模塊二</p><p><b> 萬(wàn)年歷的原理圖</b><
15、;/p><p><b> 2.3系統(tǒng)軟件設(shè)計(jì)</b></p><p> 3、1數(shù)字電子鐘設(shè)計(jì)用到很多子程序,它們的流程圖如下所示。 主程序是先開(kāi)始,然后啟動(dòng)定時(shí)器,定時(shí)器啟動(dòng)后在進(jìn)行按鍵檢測(cè),檢測(cè)完后,就可以顯示時(shí)間。</p><p><b> 2.4設(shè)計(jì)說(shuō)明書(shū):</b></p><p> 2
16、.4.1模塊劃分:</p><p><b> 1、顯示模塊</b></p><p> 利用單片機(jī)來(lái)控制數(shù)碼管的顯示。通過(guò)單片機(jī)P0口來(lái)控制數(shù)碼管的八段,P1口來(lái)控制4位數(shù)碼管。本程序采用方式0譯碼。在主程序中進(jìn)行。</p><p><b> 2、切換模塊</b></p><p> 主要靠按鍵
17、來(lái)切換顯示時(shí)間和日期,采用中斷方式來(lái)進(jìn)行。</p><p><b> 3、計(jì)時(shí)模塊</b></p><p> 本程序采用定時(shí)計(jì)數(shù)器T0,定時(shí)10ms,即50ms進(jìn)一次中斷,100次后達(dá)到1秒,秒位加一,達(dá)到60秒后分位加一,一次類(lèi)推周而復(fù)始的進(jìn)行計(jì)數(shù)。該模塊也是采用中斷方式進(jìn)行采用12M的晶振。</p><p><b> 4、校
18、時(shí)模塊</b></p><p> 該模塊也是通過(guò)按鍵來(lái)對(duì)時(shí)間和日期進(jìn)行校時(shí)。先通過(guò)一個(gè)按鍵來(lái)選擇要校時(shí)的部分,再通過(guò)另外兩個(gè)按鍵來(lái)對(duì)該部分進(jìn)行加減,調(diào)整到正確的時(shí)間和日期。</p><p> 日期在校時(shí)過(guò)程中還要對(duì)年份和月份進(jìn)行判斷是不是閏年,是大月還是小月。進(jìn)過(guò)判斷后來(lái)顯示相應(yīng)的日期。上述計(jì)時(shí)過(guò)程中也要進(jìn)行判斷。該模塊也采用中斷方式。</p><p&g
19、t;<b> 2.5使用說(shuō)明書(shū):</b></p><p> 打開(kāi)電源,1602液晶屏顯示時(shí)間。按鍵S1用來(lái)控制切換,即按下S1就顯示日期,再按一次就顯示時(shí)間,依次循環(huán)。按鍵S2用來(lái)控制校時(shí)部分的選擇,第一次按下,分位或時(shí)位會(huì)閃爍,表示以選擇該位,同時(shí)計(jì)數(shù)器會(huì)停止計(jì)數(shù);第二次按下,月位或日位會(huì)閃爍;第三次按下,年的高位或年的低位會(huì)閃爍;第四次按下時(shí),會(huì)退出選擇功能,計(jì)數(shù)器恢復(fù)計(jì)時(shí),依次循環(huán)
20、。按鍵S3和S4分別用來(lái)控制時(shí)間或日期的加、減,使用該功能時(shí),按鍵S2必須先按下選擇某一位進(jìn)行加減,按鍵S2第四次按下時(shí),也同時(shí)退出該功能。</p><p><b> 2.6元件清單:</b></p><p> AT89S51單片機(jī)</p><p> 1602顯示屏一個(gè)、電阻電容若干,5個(gè)獨(dú)立按鍵,12M晶振一個(gè),記憶電池一塊</p
21、><p><b> 總結(jié)</b></p><p><b> 3.1設(shè)計(jì)過(guò)程</b></p><p> 通過(guò)老師給我們講解了課程設(shè)計(jì)的內(nèi)容后,我們便投入了緊張的課設(shè)中,</p><p> 萬(wàn)事開(kāi)頭難,面對(duì)著完全陌生的實(shí)驗(yàn)箱,我們首先要做的就是收集資料,以便弄清實(shí)驗(yàn)箱各功能模塊及使用方法,第一天就這
22、么過(guò)去了,對(duì)實(shí)驗(yàn)箱的模塊有了大致的了解。星期二,我們開(kāi)始對(duì)主芯片的串口進(jìn)行測(cè)試,找到了它與單片機(jī)引腳對(duì)應(yīng)圖。對(duì)于萬(wàn)年歷,我們首先想到的是用單片機(jī),89sc51芯片,液晶屏和按鍵來(lái)實(shí)現(xiàn),查閱了很多關(guān)于芯片的資料后仍對(duì)其顯示原理搞不清楚,于是我們只好放棄使用該芯片,最后我們想到了直接用單片機(jī)控制液晶屏,采用動(dòng)態(tài)掃描的方式來(lái)實(shí)現(xiàn)時(shí)間顯示,用按鍵切換來(lái)實(shí)現(xiàn)。但這樣的話(huà),編程就相對(duì)來(lái)說(shuō)復(fù)雜了很多。星期三,上午開(kāi)始了編程,8個(gè)段選和4個(gè)位選就占了1
23、2個(gè)I/O口,定時(shí)和中斷占2個(gè)口,四個(gè)按鍵也占了4個(gè)口,這樣一來(lái)串行口就顯得很緊張。但這不是最主要的,編程是塊難啃的骨頭,連續(xù)編了三天的程序,周五晚上進(jìn)行仿真調(diào)試通過(guò),7月18號(hào)的周一來(lái)實(shí)驗(yàn)室進(jìn)行硬件調(diào)試,硬件調(diào)試也經(jīng)歷了數(shù)碼管顯示錯(cuò)位,亂碼,按鍵不靈的問(wèn)題,通過(guò)線(xiàn)路的重新連接,消抖的程序的修改,一一把這些問(wèn)題解決了。經(jīng)過(guò)經(jīng)過(guò)一上午辛苦的調(diào)試,終于成功的把萬(wàn)年歷設(shè)計(jì)出來(lái)了!</p><p><b>
24、心得體會(huì)</b></p><p> 回顧起此次單片機(jī)課程設(shè)計(jì),至今我仍感慨頗多,的確,從理論到實(shí)踐,在整整兩星期的日子里,可以說(shuō)得是苦多于甜,但是可以學(xué)到很多很多的東西,同時(shí)不僅可以鞏固了以前所學(xué)過(guò)的知識(shí),而且學(xué)到了很多在書(shū)本上所沒(méi)有學(xué)到過(guò)的知識(shí)。通過(guò)這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),從理論中得出結(jié)論,才能真正為社會(huì)服務(wù)
25、,從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。在設(shè)計(jì)的過(guò)程中遇到問(wèn)題,可以說(shuō)得是困難重重,這畢竟第一次做的,難免會(huì)遇到過(guò)各種各樣的問(wèn)題,同時(shí)在設(shè)計(jì)的過(guò)程中發(fā)現(xiàn)了自己的不足之處,對(duì)以前所學(xué)過(guò)的知識(shí)理解得不夠深刻,掌握得不夠牢固,比如說(shuō)單片機(jī)的動(dòng)態(tài)掃描原理,不懂分得二極管的正負(fù)極,不知道數(shù)碼管是共陰極還是共陽(yáng)極,對(duì)單片機(jī)匯編語(yǔ)言掌握得不好……通過(guò)這次課程設(shè)計(jì)之后,一定把以前所學(xué)過(guò)的知識(shí)重新溫故。 本次課程設(shè)計(jì),真可謂是感慨萬(wàn)千,從一開(kāi)
26、始的一無(wú)所知,到后來(lái)的輕車(chē)熟路,其中所經(jīng)歷的波折真是無(wú)以言表。堅(jiān)持不懈是我最大的收獲,在課設(shè)過(guò)程中我曾一度有想放棄的念頭,但理智戰(zhàn)勝了沖動(dòng),我還是堅(jiān)持下來(lái)了,堅(jiān)持就是勝利!同時(shí)也再一次讓我體會(huì)了</p><p> 這次課程設(shè)計(jì)終于順利完成了,在設(shè)計(jì)中遇到了很多編程問(wèn)題,最后在XX同學(xué)的幫助下解決了難題,對(duì)給過(guò)我?guī)椭乃型瑢W(xué)和指導(dǎo)老師再次表示忠心的感謝!也感謝學(xué)校為我們課程設(shè)計(jì)提供了這么好的設(shè)備,這么好的環(huán)境。
27、</p><p><b> 附錄</b></p><p> #include <reg52.h></p><p> #include <intrins.h></p><p> //#include "LCD1602.h"</p><p> //
28、#include "DS1302.h"</p><p> #define uint unsigned int</p><p> #define uchar unsigned char</p><p> sbit DS1302_CLK = P1^7; //實(shí)時(shí)時(shí)鐘時(shí)鐘線(xiàn)引腳 </p><p>
29、; sbit DS1302_IO = P1^6; //實(shí)時(shí)時(shí)鐘數(shù)據(jù)線(xiàn)引腳 </p><p> sbit DS1302_RST = P1^5; //實(shí)時(shí)時(shí)鐘復(fù)位線(xiàn)引腳</p><p> sbit wireless_1 = P3^0;</p><p> sbit wireless_2 = P3^1;&
30、lt;/p><p> sbit wireless_3 = P3^2;</p><p> sbit wireless_4 = P3^3;</p><p> sbit ACC0 = ACC^0;</p><p> sbit ACC7 = ACC^7;</p><p> char hide_sec,hide_m
31、in,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,時(shí)到日,月,年位閃的計(jì)數(shù)</p><p> sbit Set = P2^0; //模式切換鍵</p><p> sbit Up = P2^1; //加法按鈕</p><p> sbit Down = P2^2;
32、 //減法按鈕</p><p> sbit out = P2^3; //立刻跳出調(diào)整模式按鈕</p><p> sbit DQ = P1^0; //溫度傳送數(shù)據(jù)IO口</p><p> char done,count,temp,flag,up_flag,down_flag; //</p><p>
33、 uchar temp_value; //溫度值</p><p> uchar TempBuffer[5],week_value[2]; //</p><p> void show_time(); //液晶顯示程序</p><p> /***********1602液晶顯示部分子程序****************/&l
34、t;/p><p> //Port Definitions**********************************************************</p><p> sbit LcdRs= P2^6;</p><p> sbit LcdRw= P2^5;</p><p> sbit LcdEn = P
35、2^7;</p><p> sfr DBPort = 0x80;//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數(shù)據(jù)端口</p><p> //內(nèi)部等待函數(shù)**************************************************************************</p><p> unsig
36、ned char LCD_Wait(void)</p><p><b> {</b></p><p><b> LcdRs=0;</b></p><p> LcdRw=1;_nop_();</p><p> LcdEn=1;_nop_();</p><p><
37、;b> LcdEn=0;</b></p><p> return DBPort;</p><p><b> }</b></p><p> //向LCD寫(xiě)入命令或數(shù)據(jù)************************************************************</p><
38、p> #define LCD_COMMAND0 // Command</p><p> #define LCD_DATA1 // Data</p><p> #define LCD_CLEAR_SCREEN0x01 // 清屏</p><p> #define LCD_HOMING 0x02
39、// 光標(biāo)返回原點(diǎn)</p><p> void LCD_Write(bit style, unsigned char input)</p><p><b> {</b></p><p><b> LcdEn=0;</b></p><p> LcdRs=style;</p>&l
40、t;p> LcdRw=0;_nop_();</p><p> DBPort=input;_nop_();//注意順序</p><p> LcdEn=1;_nop_();//注意順序</p><p> LcdEn=0;_nop_();</p><p> LCD_Wait();</p><p&g
41、t;<b> }</b></p><p> //設(shè)置顯示模式************************************************************</p><p> #define LCD_SHOW0x04 //顯示開(kāi)</p><p> #define LCD_HIDE0x00
42、//顯示關(guān) </p><p> #define LCD_CURSOR0x02 //顯示光標(biāo)</p><p> #define LCD_NO_CURSOR0x00 //無(wú)光標(biāo) </p><p> #define LCD_FLASH0x01 //光標(biāo)閃動(dòng)</p><p> #define LC
43、D_NO_FLASH0x00 //光標(biāo)不閃動(dòng)</p><p> void LCD_SetDisplay(unsigned char DisplayMode)</p><p><b> {</b></p><p> LCD_Write(LCD_COMMAND, 0x08|DisplayMode);</p><
44、p><b> }</b></p><p> //設(shè)置輸入模式************************************************************</p><p> #define LCD_AC_UP0x02</p><p> #define LCD_AC_DOWN0x00
45、// default</p><p> #define LCD_MOVE0x01 // 畫(huà)面可平移</p><p> #define LCD_NO_MOVE0x00 //default</p><p> void LCD_SetInput(unsigned char InputMode)</p><p>
46、<b> {</b></p><p> LCD_Write(LCD_COMMAND, 0x04|InputMode);</p><p><b> }</b></p><p> //初始化LCD************************************************************&l
47、t;/p><p> void LCD_Initial()</p><p><b> {</b></p><p><b> LcdEn=0;</b></p><p> LCD_Write(LCD_COMMAND,0x38); //8位數(shù)據(jù)端口,2行顯示,5*7點(diǎn)陣</p&
48、gt;<p> LCD_Write(LCD_COMMAND,0x38);</p><p> LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //開(kāi)啟顯示, 無(wú)光標(biāo)</p><p> LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏</p><p> LCD_Se
49、tInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫(huà)面不動(dòng)</p><p><b> }</b></p><p> //液晶字符輸入的位置************************</p><p> void GotoXY(unsigned char x, unsigned char y)&l
50、t;/p><p><b> {</b></p><p><b> if(y==0)</b></p><p> LCD_Write(LCD_COMMAND,0x80|x);</p><p><b> if(y==1)</b></p><p> LCD
51、_Write(LCD_COMMAND,0x80|(x-0x40));</p><p><b> }</b></p><p> //將字符輸出到液晶顯示</p><p> void Print(unsigned char *str)</p><p><b> {</b></p>
52、<p> while(*str!='\0')//while(*str!='\0')</p><p><b> {</b></p><p> LCD_Write(LCD_DATA,*str);</p><p><b> str++;</b></p><p&
53、gt;<b> }</b></p><p><b> }</b></p><p> /***********DS1302時(shí)鐘部分子程序******************/</p><p> typedef struct SYSTEMTIME</p><p><b> {<
54、/b></p><p> unsigned char Second;</p><p> unsigned char Minute;</p><p> unsigned char Hour;</p><p> unsigned char Week;</p><p> unsigned char Day;&
55、lt;/p><p> unsigned char Month;</p><p> unsigned char Year;</p><p> unsigned char DateString[11];</p><p> unsigned char TimeString[9];</p><p> }SYSTEMTIM
56、E;//定義的時(shí)間類(lèi)型</p><p> SYSTEMTIME CurrentTime; //</p><p> #define AM(X)X</p><p> #define PM(X)(X+12) // 轉(zhuǎn)成24小時(shí)制</p><p> #define DS1302_SECOND0x80
57、 //時(shí)鐘芯片的寄存器位置,存放時(shí)間</p><p> #define DS1302_MINUTE0x82</p><p> #define DS1302_HOUR0x84 </p><p> #define DS1302_WEEK0x8A</p><p> #define DS1302_DAY0x86&
58、lt;/p><p> #define DS1302_MONTH0x88</p><p> #define DS1302_YEAR0x8C </p><p> void DS1302InputByte(unsigned char d) //實(shí)時(shí)時(shí)鐘寫(xiě)入一字節(jié)(內(nèi)部函數(shù))</p><p><b> { </b>&
59、lt;/p><p> unsigned char i;</p><p><b> ACC = d;</b></p><p> for(i=8; i>0; i--)</p><p><b> {</b></p><p> DS1302_IO = ACC0;
60、 //相當(dāng)于匯編中的 RRC</p><p> DS1302_CLK = 1;</p><p> DS1302_CLK = 0;</p><p> ACC = ACC >> 1; </p><p><b> } </b></p><p><b> }&l
61、t;/b></p><p> unsigned char DS1302OutputByte(void) //實(shí)時(shí)時(shí)鐘讀取一字節(jié)(內(nèi)部函數(shù))</p><p><b> { </b></p><p> unsigned char i;</p><p> for(i=8; i>0; i--)</p&
62、gt;<p><b> {</b></p><p> ACC = ACC >>1; //相當(dāng)于匯編中的 RRC </p><p> ACC7 = DS1302_IO;</p><p> DS1302_CLK = 1;</p><p> DS1302_CLK = 0
63、;</p><p><b> } </b></p><p> return(ACC); </p><p><b> }</b></p><p> void Write1302(unsigned char ucAddr, unsigned char ucDa)//ucAddr: DS1302
64、地址, ucData: 要寫(xiě)的數(shù)據(jù)</p><p><b> {</b></p><p> DS1302_RST = 0;</p><p> DS1302_CLK = 0;</p><p> DS1302_RST = 1;</p><p> DS1302InputByte(ucAddr)
65、; // 地址,命令 </p><p> DS1302InputByte(ucDa); // 寫(xiě)1Byte數(shù)據(jù)</p><p> DS1302_CLK = 1;</p><p> DS1302_RST = 0;</p><p><b> } </b></p><p&
66、gt; unsigned char Read1302(unsigned char ucAddr)//讀取DS1302某地址的數(shù)據(jù)</p><p><b> {</b></p><p> unsigned char ucData;</p><p> DS1302_RST = 0;</p><p> DS1302
67、_CLK = 0;</p><p> DS1302_RST = 1;</p><p> DS1302InputByte(ucAddr|0x01); // 地址,命令 </p><p> ucData = DS1302OutputByte(); // 讀1Byte數(shù)據(jù)</p><p> DS1302_CLK
68、 = 1;</p><p> DS1302_RST = 0;</p><p> return(ucData);</p><p><b> }</b></p><p> void DS1302_GetTime(SYSTEMTIME *Time) //獲取時(shí)鐘芯片的時(shí)鐘數(shù)據(jù)到自定義的結(jié)構(gòu)型數(shù)組</p>
69、<p><b> {</b></p><p> unsigned char ReadValue;</p><p> ReadValue = Read1302(DS1302_SECOND);</p><p> Time->Second = ((ReadValue&0x70)>>4)*10 + (Rea
70、dValue&0x0F);</p><p> ReadValue = Read1302(DS1302_MINUTE);</p><p> Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p> ReadValue = Read1302(D
71、S1302_HOUR);</p><p> Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p> ReadValue = Read1302(DS1302_DAY);</p><p> Time->Day = ((ReadValue&0
72、x70)>>4)*10 + (ReadValue&0x0F);</p><p> ReadValue = Read1302(DS1302_WEEK);</p><p> Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p> R
73、eadValue = Read1302(DS1302_MONTH);</p><p> Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p> ReadValue = Read1302(DS1302_YEAR);</p><p> Time->
74、;Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p><b> }</b></p><p> void DateToStr(SYSTEMTIME *Time) //將時(shí)間年,月,日,星期數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符串,放到數(shù)組里DateString[]</p&g
75、t;<p> { if(hide_year<2) //這里的if,else語(yǔ)句都是判斷位閃爍,<2顯示數(shù)據(jù),>2就不顯示,輸出字符串為 2007/07/22</p><p> { </p><p> Time->DateString[0] = '
76、;2';</p><p> Time->DateString[1] = '0'; </p><p> Time->DateString[2] = Time->Year/10 + '0';</p><p> Time->DateString[3] = Time->Year%10 + '
77、;0';</p><p><b> }</b></p><p><b> else</b></p><p><b> { </b></p><p> Time->DateString[0] = ' ';</p><p&g
78、t; Time->DateString[1] = ' '; </p><p> Time->DateString[2] = ' ';</p><p> Time->DateString[3] = ' ';</p><p><b> }</b></p>&
79、lt;p> Time->DateString[4] = '/';</p><p> if(hide_month<2)</p><p><b> {</b></p><p> Time->DateString[5] = Time->Month/10 + '0';</p&g
80、t;<p> Time->DateString[6] = Time->Month%10 + '0';</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><
81、p> Time->DateString[5] = ' ';</p><p> Time->DateString[6] = ' ';</p><p><b> }</b></p><p> Time->DateString[7] = '/';</p>&
82、lt;p> if(hide_day<2)</p><p><b> {</b></p><p> Time->DateString[8] = Time->Day/10 + '0';</p><p> Time->DateString[9] = Time->Day%10 + '0
83、';</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> Time->DateString[8] = ' ';</p><p>
84、 Time->DateString[9] = ' '; </p><p><b> }</b></p><p> if(hide_week<2)</p><p><b> {</b></p><p> week_value[0] = Time->We
85、ek%10 + '0'; //星期的數(shù)據(jù)另外放到 week_value[]數(shù)組里,跟年,月,日的分開(kāi)存放,因?yàn)榈纫幌乱谧詈箫@示</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><
86、;p> week_value[0] = ' ';</p><p><b> }</b></p><p> week_value[1] = '\0';</p><p> Time->DateString[10] = '\0'; //字符串末尾加 '\0' ,判斷結(jié)
87、束字符</p><p><b> }</b></p><p> void TimeToStr(SYSTEMTIME *Time) //將時(shí),分,秒數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符放到數(shù)組 TimeString[];</p><p> { if(hide_hour<2)</p><p><b> {&l
88、t;/b></p><p> Time->TimeString[0] = Time->Hour/10 + '0';</p><p> Time->TimeString[1] = Time->Hour%10 + '0';</p><p><b> }</b></p>
89、<p><b> else</b></p><p><b> {</b></p><p> Time->TimeString[0] = ' ';</p><p> Time->TimeString[1] = ' ';</p><p>&
90、lt;b> }</b></p><p> Time->TimeString[2] = ':';</p><p> if(hide_min<2)</p><p><b> {</b></p><p> Time->TimeString[3] = Time->
91、;Minute/10 + '0';</p><p> Time->TimeString[4] = Time->Minute%10 + '0';</p><p><b> }</b></p><p><b> else</b></p><p><
92、b> {</b></p><p> Time->TimeString[3] = ' ';</p><p> Time->TimeString[4] = ' ';</p><p><b> }</b></p><p> Time->TimeStr
93、ing[5] = ':';</p><p> if(hide_sec<2)</p><p><b> {</b></p><p> Time->TimeString[6] = Time->Second/10 + '0';</p><p> Time->Tim
94、eString[7] = Time->Second%10 + '0';</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> Time->TimeString
95、[6] = ' ';</p><p> Time->TimeString[7] = ' ';</p><p><b> }</b></p><p> Time->DateString[8] = '\0';</p><p><b> }</
96、b></p><p> void Initial_DS1302(void) //時(shí)鐘芯片初始化</p><p><b> { </b></p><p> unsigned char Second=Read1302(DS1302_SECOND);</p><p> if(Second&0x80
97、) //判斷時(shí)鐘芯片是否關(guān)閉 </p><p><b> {</b></p><p> Write1302(0x8e,0x00); //寫(xiě)入允許</p><p> Write1302(0x8c,0x07); //以下寫(xiě)入初始化時(shí)間 日期:07/07/25.星期: 3. 時(shí)間: 23:59:55</p><
98、;p> Write1302(0x88,0x07);</p><p> Write1302(0x86,0x25);</p><p> Write1302(0x8a,0x07); //xingqi</p><p> Write1302(0x84,0x23);</p><p> Write1302(0x82
99、,0x59);</p><p> Write1302(0x80,0x55);</p><p> Write1302(0x8e,0x80); //禁止寫(xiě)入</p><p><b> }</b></p><p><b> }</b></p><p> /********
100、***ds18b20子程序*************************/</p><p> /***********ds18b20延遲子函數(shù)(晶振12MHz )*******/ </p><p> void delay_18B20(unsigned int i)</p><p><b> {</b></p><p
101、> while(i--);</p><p><b> }</b></p><p> /**********ds18b20初始化函數(shù)**********************/</p><p> void Init_DS18B20(void) </p><p><b> {</b>&
102、lt;/p><p> unsigned char x=0;</p><p> DQ = 1; //DQ復(fù)位</p><p> delay_18B20(8); //稍做延時(shí)</p><p> DQ = 0; //單片機(jī)將DQ拉低</p><p> delay_18B20(80)
103、; //精確延時(shí) 大于 480us</p><p> DQ = 1; //拉高總線(xiàn)</p><p> delay_18B20(14);</p><p> x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗</p><p> delay_18B20(20);</p>
104、<p><b> }</b></p><p> /***********ds18b20讀一個(gè)字節(jié)**************/ </p><p> unsigned char ReadOneChar(void)</p><p><b> {</b></p><p> uch
105、ar i=0;</p><p> uchar dat = 0;</p><p> for (i=8;i>0;i--)</p><p><b> {</b></p><p> DQ = 0; // 給脈沖信號(hào)</p><p> dat>>=1; //數(shù)據(jù)
106、右移一位</p><p> DQ = 1; // 給脈沖信號(hào)</p><p><b> if(DQ)</b></p><p> dat|=0x80; //按位或,取最高位</p><p> delay_18B20(4);</p><p><b> }</b&
107、gt;</p><p> return(dat);</p><p><b> }</b></p><p> /*************ds18b20寫(xiě)一個(gè)字節(jié)****************/ </p><p> void WriteOneChar(uchar dat)</p><p>
108、;<b> {</b></p><p> unsigned char i=0;</p><p> for (i=8; i>0; i--)</p><p><b> {</b></p><p><b> DQ = 0;</b></p><p&g
109、t; DQ = dat&0x01; //取最低位</p><p> delay_18B20(5);</p><p> DQ = 1; //上升沿將數(shù)據(jù)送入</p><p><b> dat>>=1;</b></p><p><b> }</b&g
110、t;</p><p><b> }</b></p><p> /**************讀取ds18b20當(dāng)前溫度************/</p><p> void ReadTemp(void)</p><p><b> {</b></p><p> uns
111、igned char a=0;</p><p> unsigned char b=0;</p><p> unsigned char t=0;</p><p> Init_DS18B20();</p><p> WriteOneChar(0xCC); // 跳過(guò)讀序號(hào)列號(hào)的操作</p><p> Wr
112、iteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換</p><p> delay_18B20(100); // this message is wery important</p><p> Init_DS18B20();</p><p> WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作</p><p&
113、gt; WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度</p><p> delay_18B20(100);</p><p> a=ReadOneChar(); //讀取溫度值低位</p><p> b=ReadOneChar(); //讀取溫度值高位</p><p>
114、; temp_value=b<<4; //左移四位,擴(kuò)大16倍,變?yōu)橐粋€(gè)字節(jié)的高四位</p><p> temp_value+=(a&0xf0)>>4;//取溫度值的地位的高四位,右移四位后與溫度的高四位相加得到溫度值 </p><p><b> }</b></p><p
115、> void temp_to_str() //溫度數(shù)據(jù)轉(zhuǎn)換成液晶字符顯示</p><p><b> {</b></p><p> TempBuffer[0]=temp_value/10+'0'; //十位</p><p> TempBuffer[1]=temp_value%10+'0'; /
116、/個(gè)位</p><p> TempBuffer[2]=0xdf; //溫度符號(hào)</p><p> TempBuffer[3]='C';</p><p> TempBuffer[4]='\0';</p><p><b> }</b></p><p> v
117、oid Delay1ms(unsigned int count)</p><p><b> {</b></p><p> unsigned int i,j;</p><p> for(i=0;i<count;i++)</p><p> for(j=0;j<120;j++);</p>&l
118、t;p><b> }</b></p><p><b> /*延時(shí)子程序*/</b></p><p> void mdelay(uint delay)</p><p><b> {uint i;</b></p><p> for(;delay>0;dela
119、y--)</p><p> {for(i=0;i<32;i++) //1ms延時(shí).</p><p><b> {;}</b></p><p><b> }</b></p><p><b> }</b></p><p> void outk
120、ey() //跳出調(diào)整模式,返回默認(rèn)顯示</p><p> { uchar Second;</p><p> if(out==0)//if(out==0||wireless_1==1) // </p><p> { mdelay(8); </p><p><b> coun
121、t=0;</b></p><p> hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;</p><p> Second=Read1302(DS1302_SECOND);</p><p> Write1302(0x8e,0x00); //
122、寫(xiě)入允許</p><p> Write1302(0x80,Second&0x7f);</p><p> Write1302(0x8E,0x80); //禁止寫(xiě)入</p><p> done=0; </p><p> while(out==0);</p><p>
123、//while(wireless_1==1);</p><p><b> }</b></p><p><b> }</b></p><p> ////////////////////////////////////////////////////////////////////////////////////////
124、////////////////////</p><p> void Upkey()//升序按鍵</p><p><b> { </b></p><p><b> Up=1;</b></p><p> if(Up==0)//if(Up==0||wireless_2==1)</p&
125、gt;<p><b> {</b></p><p> mdelay(8);</p><p> switch(count)</p><p><b> {case 1:</b></p><p> temp=Read1302(DS1302_SECOND); //讀取秒數(shù)</
126、p><p> temp=temp+1; //秒數(shù)加1</p><p> up_flag=1; //數(shù)據(jù)調(diào)整后更新標(biāo)志</p><p> if((temp&0x7f)>0x59) //超過(guò)59秒,清零</p><p> temp=0; </p><p><b>
127、 break;</b></p><p><b> case 2:</b></p><p> temp=Read1302(DS1302_MINUTE); //讀取分?jǐn)?shù)</p><p> temp=temp+1; //分?jǐn)?shù)加1</p><p> up_flag=1;</p><p&
128、gt; if(temp>0x59) //超過(guò)59分,清零</p><p><b> temp=0;</b></p><p><b> break;</b></p><p><b> case 3:</b></p><p> temp=Read1
129、302(DS1302_HOUR); //讀取小時(shí)數(shù)</p><p> temp=temp+1; //小時(shí)數(shù)加1</p><p> up_flag=1;</p><p> if(temp>0x23) //超過(guò)23小時(shí),清零</p><p><b> temp=0;</b></p><
130、;p><b> break;</b></p><p><b> case 4:</b></p><p> temp=Read1302(DS1302_WEEK); //讀取星期數(shù)</p><p> temp=temp+1; //星期數(shù)加1</p><p> up_flag=1;&l
131、t;/p><p> if(temp>0x7) </p><p><b> temp=1;</b></p><p><b> break;</b></p><p><b> case 5:</b></p><p> temp=Read1302
132、(DS1302_DAY); //讀取日數(shù)</p><p> temp=temp+1; //日數(shù)加1</p><p> up_flag=1;</p><p> if(temp>0x31)</p><p><b> temp=1;</b></p><p><b> bre
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子萬(wàn)年歷
- 萬(wàn)年歷課程設(shè)計(jì)
- 萬(wàn)年歷課程設(shè)計(jì)
- 單片機(jī)萬(wàn)年歷課程設(shè)計(jì)--基于1602液晶顯示的電子時(shí)鐘萬(wàn)年歷
- 萬(wàn)年歷課程設(shè)計(jì)
- 萬(wàn)年歷課程設(shè)計(jì)
- 萬(wàn)年歷課程設(shè)計(jì)
- 萬(wàn)年歷課程設(shè)計(jì)
- 電子萬(wàn)年歷設(shè)計(jì)
- 萬(wàn)年歷課程設(shè)計(jì)
- 萬(wàn)年歷電子時(shí)鐘溫度畢業(yè)設(shè)計(jì)
- 課程設(shè)計(jì)報(bào)告--電子萬(wàn)年歷
- 電子萬(wàn)年歷課程設(shè)計(jì) (2)
- java萬(wàn)年歷課程設(shè)計(jì)
- 萬(wàn)年歷課程設(shè)計(jì)報(bào)告
- proteus課程設(shè)計(jì)--電子萬(wàn)年歷
- 電子萬(wàn)年歷課程設(shè)計(jì)報(bào)告
- 數(shù)字萬(wàn)年歷課程設(shè)計(jì)
- java課程設(shè)計(jì)--萬(wàn)年歷
- 萬(wàn)年歷課程設(shè)計(jì)論文
評(píng)論
0/150
提交評(píng)論