版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 電子課程設(shè)計報告</b></p><p> 課程名稱: 單片機課程設(shè)計 </p><p> 設(shè)計內(nèi)容: 萬年歷電子時鐘 </p><p> 實驗時間: 2011年12月
2、 </p><p> 專業(yè)班級: 09電子(2)班 </p><p> 姓 名: </p><p> 學(xué) 號: </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è)計思路3</p><p> 第二章 系統(tǒng)設(shè)計4</p><p><b> 2.14</b></p><p> 2.2 系統(tǒng)硬件設(shè)計4</p><p> 2.2.1系統(tǒng)總體框架4
5、</p><p> 2.2.2 模塊二5</p><p> 2.3系統(tǒng)軟件設(shè)計5</p><p> 2.4設(shè)計說明書:6</p><p> 2.4.1模塊劃分:6</p><p> 2.5使用說明書:6</p><p> 2.6元件清單:6</p><
6、;p><b> 第三章總結(jié)7</b></p><p><b> 3.1設(shè)計過程7</b></p><p> 3.2心得體會7</p><p><b> 附錄8</b></p><p><b> 摘要</b></p>
7、<p> 單片機應(yīng)用技術(shù)飛速發(fā)展,縱觀我們現(xiàn)在生活的各個領(lǐng)域,從導(dǎo)彈的導(dǎo)航裝置到飛機上的各種儀表的控制,從計算機的網(wǎng)絡(luò)通訊與數(shù)據(jù)傳輸,到工業(yè)自動化過程的實時控制和數(shù)據(jù)處理,以及我們生活中廣泛使用的各種智能IC卡等,這些都離不開單片機。單片機是集CPU、RAM、ROM、定時、計數(shù)和多種接口于一體的微控制器。它體積小,成本低,功能強,廣泛應(yīng)用于智能產(chǎn)業(yè)和工業(yè)自動化上。而51系列單片機是各單片機中最為典型和最有代表性的一種。&l
8、t;/p><p> 萬年歷在日常生活中最常見,應(yīng)用也最廣泛。本次課程設(shè)計主要就是設(shè)計一款數(shù)字鐘,以89S51單片機為核心,配備數(shù)碼管,按鍵,蜂鳴器。數(shù)字鐘采用24小時制方式顯示時間,年、月、日、秒及毫秒。 文章的核心主要從硬件設(shè)計和軟件編程兩個大的方面。硬件電路設(shè)計主要包括中央處理單元電路、時鐘電路、人機接口電路、信號處理電路、執(zhí)行電路等幾部分組成。軟件用C語言來實現(xiàn),主要包括主程序、時間設(shè)置子程序,按鍵切
9、換程序,校時程序等軟件模塊。</p><p> 關(guān)鍵字: 單片機 時間 小時 分鐘 秒</p><p><b> 第一章 緒論</b></p><p> 1.1引言及設(shè)計思路</p><p> 萬年歷是采用數(shù)字電路實現(xiàn)對年、月、日,時、分、秒,數(shù)字顯示的計時裝置,廣泛用于個人家庭,車站, 碼頭辦
10、公室等公共場所,成為人們?nèi)粘I钪胁豢缮俚谋匦杵?由于數(shù)字集成電路的發(fā)展和石英晶體振蕩器的廣泛應(yīng)用,使得數(shù)字鐘的精度,遠(yuǎn)遠(yuǎn)超過老式鐘表, 鐘表的數(shù)字化給人們生產(chǎn)生活帶來了極大的方便,而且大大地擴展了鐘表原先的報時功能。諸如定時自動報警、按時自動打鈴、時間程序自動控制、定時廣播、自動起閉路燈、定時開關(guān)烘箱、通斷動力設(shè)備、甚至各種定時電氣的自動啟用等,所有這些,都是以鐘表數(shù)字化為基礎(chǔ)的。因此,研究數(shù)字鐘及擴大其應(yīng)用,有著非常現(xiàn)實的意義。&l
11、t;/p><p> 一開始接觸到實驗箱的時候大家都很陌生,因為是第一次使用,所以實驗箱很多模塊的功能及使用方法都要我們自己去掌握。在沒有實質(zhì)說明書的情況下,我們先后使用萬用表測電壓、電阻的方法得到了實驗箱主芯片與單片機P口的引腳對應(yīng)圖,為接下來的軟件編程和硬件接口連接打下了基礎(chǔ)。萬年歷電子時鐘的實現(xiàn)主要硬件模塊是單片機,本實驗箱使用的的AT89S51單片機,此外還有顯示模塊四位數(shù)碼管,還有時間切換和調(diào)整模塊按鈕和鬧
12、鈴模塊蜂鳴器。起初我們想用實驗箱上原有的HD7279芯片來驅(qū)動數(shù)碼管顯示和鍵盤控制,但由于對這款芯片的認(rèn)識不足,雖然從網(wǎng)上找到了很多關(guān)于HD7279的資料,但仍不能正確的使用它,于是我們想到通過對TFT彩屏液晶顯示器的控制來顯示時間,但對于它的顯示原理也不能掌握,最后我們想到了用單片機直接控制數(shù)碼管來顯示時間。</p><p> 單片機P0的八個口分別接到數(shù)碼管的八個段選位。通過按下按鈕1,可以實現(xiàn)從年—月日—
13、時分—秒毫秒的顯示切換,按下按鈕2,可實現(xiàn)年份、月份日期,時分的加減,以實現(xiàn)時間的校正。</p><p><b> 第二章 系統(tǒng)設(shè)計</b></p><p><b> 2.1設(shè)計任務(wù):</b></p><p> 設(shè)計一個萬年歷,主要以單片機和數(shù)碼管為硬件基礎(chǔ),載入用C語言編寫的程序,設(shè)計出功能完善的萬年歷。該萬年歷通
14、過按鍵可切換顯示時間與日期、月份、日期、年份;能自動準(zhǔn)確的計時;能通過判斷年份和月份來顯示相應(yīng)的天數(shù)(即能判斷閏年,大月和小月)。</p><p> 2.2 系統(tǒng)硬件設(shè)計和顯示</p><p> 2.2.1系統(tǒng)總體框架</p><p> 2.2.2 模塊二</p><p><b> 萬年歷的原理圖</b><
15、;/p><p><b> 2.3系統(tǒng)軟件設(shè)計</b></p><p> 3、1數(shù)字電子鐘設(shè)計用到很多子程序,它們的流程圖如下所示。 主程序是先開始,然后啟動定時器,定時器啟動后在進(jìn)行按鍵檢測,檢測完后,就可以顯示時間。</p><p><b> 2.4設(shè)計說明書:</b></p><p> 2
16、.4.1模塊劃分:</p><p><b> 1、顯示模塊</b></p><p> 利用單片機來控制數(shù)碼管的顯示。通過單片機P0口來控制數(shù)碼管的八段,P1口來控制4位數(shù)碼管。本程序采用方式0譯碼。在主程序中進(jìn)行。</p><p><b> 2、切換模塊</b></p><p> 主要靠按鍵
17、來切換顯示時間和日期,采用中斷方式來進(jìn)行。</p><p><b> 3、計時模塊</b></p><p> 本程序采用定時計數(shù)器T0,定時10ms,即50ms進(jìn)一次中斷,100次后達(dá)到1秒,秒位加一,達(dá)到60秒后分位加一,一次類推周而復(fù)始的進(jìn)行計數(shù)。該模塊也是采用中斷方式進(jìn)行采用12M的晶振。</p><p><b> 4、校
18、時模塊</b></p><p> 該模塊也是通過按鍵來對時間和日期進(jìn)行校時。先通過一個按鍵來選擇要校時的部分,再通過另外兩個按鍵來對該部分進(jìn)行加減,調(diào)整到正確的時間和日期。</p><p> 日期在校時過程中還要對年份和月份進(jìn)行判斷是不是閏年,是大月還是小月。進(jìn)過判斷后來顯示相應(yīng)的日期。上述計時過程中也要進(jìn)行判斷。該模塊也采用中斷方式。</p><p&g
19、t;<b> 2.5使用說明書:</b></p><p> 打開電源,1602液晶屏顯示時間。按鍵S1用來控制切換,即按下S1就顯示日期,再按一次就顯示時間,依次循環(huán)。按鍵S2用來控制校時部分的選擇,第一次按下,分位或時位會閃爍,表示以選擇該位,同時計數(shù)器會停止計數(shù);第二次按下,月位或日位會閃爍;第三次按下,年的高位或年的低位會閃爍;第四次按下時,會退出選擇功能,計數(shù)器恢復(fù)計時,依次循環(huán)
20、。按鍵S3和S4分別用來控制時間或日期的加、減,使用該功能時,按鍵S2必須先按下選擇某一位進(jìn)行加減,按鍵S2第四次按下時,也同時退出該功能。</p><p><b> 2.6元件清單:</b></p><p> AT89S51單片機</p><p> 1602顯示屏一個、電阻電容若干,5個獨立按鍵,12M晶振一個,記憶電池一塊</p
21、><p><b> 總結(jié)</b></p><p><b> 3.1設(shè)計過程</b></p><p> 通過老師給我們講解了課程設(shè)計的內(nèi)容后,我們便投入了緊張的課設(shè)中,</p><p> 萬事開頭難,面對著完全陌生的實驗箱,我們首先要做的就是收集資料,以便弄清實驗箱各功能模塊及使用方法,第一天就這
22、么過去了,對實驗箱的模塊有了大致的了解。星期二,我們開始對主芯片的串口進(jìn)行測試,找到了它與單片機引腳對應(yīng)圖。對于萬年歷,我們首先想到的是用單片機,89sc51芯片,液晶屏和按鍵來實現(xiàn),查閱了很多關(guān)于芯片的資料后仍對其顯示原理搞不清楚,于是我們只好放棄使用該芯片,最后我們想到了直接用單片機控制液晶屏,采用動態(tài)掃描的方式來實現(xiàn)時間顯示,用按鍵切換來實現(xiàn)。但這樣的話,編程就相對來說復(fù)雜了很多。星期三,上午開始了編程,8個段選和4個位選就占了1
23、2個I/O口,定時和中斷占2個口,四個按鍵也占了4個口,這樣一來串行口就顯得很緊張。但這不是最主要的,編程是塊難啃的骨頭,連續(xù)編了三天的程序,周五晚上進(jìn)行仿真調(diào)試通過,7月18號的周一來實驗室進(jìn)行硬件調(diào)試,硬件調(diào)試也經(jīng)歷了數(shù)碼管顯示錯位,亂碼,按鍵不靈的問題,通過線路的重新連接,消抖的程序的修改,一一把這些問題解決了。經(jīng)過經(jīng)過一上午辛苦的調(diào)試,終于成功的把萬年歷設(shè)計出來了!</p><p><b>
24、心得體會</b></p><p> 回顧起此次單片機課程設(shè)計,至今我仍感慨頗多,的確,從理論到實踐,在整整兩星期的日子里,可以說得是苦多于甜,但是可以學(xué)到很多很多的東西,同時不僅可以鞏固了以前所學(xué)過的知識,而且學(xué)到了很多在書本上所沒有學(xué)到過的知識。通過這次課程設(shè)計使我懂得了理論與實際相結(jié)合是很重要的,只有理論知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會服務(wù)
25、,從而提高自己的實際動手能力和獨立思考的能力。在設(shè)計的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會遇到過各種各樣的問題,同時在設(shè)計的過程中發(fā)現(xiàn)了自己的不足之處,對以前所學(xué)過的知識理解得不夠深刻,掌握得不夠牢固,比如說單片機的動態(tài)掃描原理,不懂分得二極管的正負(fù)極,不知道數(shù)碼管是共陰極還是共陽極,對單片機匯編語言掌握得不好……通過這次課程設(shè)計之后,一定把以前所學(xué)過的知識重新溫故。 本次課程設(shè)計,真可謂是感慨萬千,從一開
26、始的一無所知,到后來的輕車熟路,其中所經(jīng)歷的波折真是無以言表。堅持不懈是我最大的收獲,在課設(shè)過程中我曾一度有想放棄的念頭,但理智戰(zhàn)勝了沖動,我還是堅持下來了,堅持就是勝利!同時也再一次讓我體會了</p><p> 這次課程設(shè)計終于順利完成了,在設(shè)計中遇到了很多編程問題,最后在XX同學(xué)的幫助下解決了難題,對給過我?guī)椭乃型瑢W(xué)和指導(dǎo)老師再次表示忠心的感謝!也感謝學(xué)校為我們課程設(shè)計提供了這么好的設(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; //實時時鐘時鐘線引腳 </p><p>
29、; sbit DS1302_IO = P1^6; //實時時鐘數(shù)據(jù)線引腳 </p><p> sbit DS1302_RST = P1^5; //實時時鐘復(fù)位線引腳</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ù)</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寫入命令或數(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)返回原點</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 //顯示開</p><p> #define LCD_HIDE0x00
42、//顯示關(guān) </p><p> #define LCD_CURSOR0x02 //顯示光標(biāo)</p><p> #define LCD_NO_CURSOR0x00 //無光標(biāo) </p><p> #define LCD_FLASH0x01 //光標(biāo)閃動</p><p> #define LC
43、D_NO_FLASH0x00 //光標(biāo)不閃動</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 // 畫面可平移</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點陣</p&
48、gt;<p> LCD_Write(LCD_COMMAND,0x38);</p><p> LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //開啟顯示, 無光標(biāo)</p><p> LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏</p><p> LCD_Se
49、tInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫面不動</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時鐘部分子程序******************/</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;//定義的時間類型</p><p> SYSTEMTIME CurrentTime; //</p><p> #define AM(X)X</p><p> #define PM(X)(X+12) // 轉(zhuǎn)成24小時制</p><p> #define DS1302_SECOND0x80
57、 //時鐘芯片的寄存器位置,存放時間</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) //實時時鐘寫入一字節(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) //實時時鐘讀取一字節(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: 要寫的數(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); // 寫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ù)據(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ù)據(jù)轉(zhuǎn)換成液晶顯示字符串,放到數(shù)組里DateString[]</p&g
75、t;<p> { if(hide_year<2) //這里的if,else語句都是判斷位閃爍,<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ù)組里,跟年,月,日的分開存放,因為等一下要在最后顯示</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ù)據(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) //時鐘芯片初始化</p><p><b> { </b></p><p> unsigned char Second=Read1302(DS1302_SECOND);</p><p> if(Second&0x80
97、) //判斷時鐘芯片是否關(guān)閉 </p><p><b> {</b></p><p> Write1302(0x8e,0x00); //寫入允許</p><p> Write1302(0x8c,0x07); //以下寫入初始化時間 日期:07/07/25.星期: 3. 時間: 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); //禁止寫入</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); //稍做延時</p><p> DQ = 0; //單片機將DQ拉低</p><p> delay_18B20(80)
103、; //精確延時 大于 480us</p><p> DQ = 1; //拉高總線</p><p> delay_18B20(14);</p><p> x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗</p><p> delay_18B20(20);</p>
104、<p><b> }</b></p><p> /***********ds18b20讀一個字節(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; // 給脈沖信號</p><p> dat>>=1; //數(shù)據(jù)
106、右移一位</p><p> DQ = 1; // 給脈沖信號</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寫一個字節(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); // 跳過讀序號列號的操作</p><p> Wr
112、iteOneChar(0x44); // 啟動溫度轉(zhuǎn)換</p><p> delay_18B20(100); // this message is wery important</p><p> Init_DS18B20();</p><p> WriteOneChar(0xCC); //跳過讀序號列號的操作</p><p&
113、gt; WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度</p><p> delay_18B20(100);</p><p> a=ReadOneChar(); //讀取溫度值低位</p><p> b=ReadOneChar(); //讀取溫度值高位</p><p>
114、; temp_value=b<<4; //左移四位,擴大16倍,變?yōu)橐粋€字節(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、/個位</p><p> TempBuffer[2]=0xdf; //溫度符號</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> /*延時子程序*/</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延時.</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、寫入允許</p><p> Write1302(0x80,Second&0x7f);</p><p> Write1302(0x8E,0x80); //禁止寫入</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) //超過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) //超過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ù)</p><p> temp=temp+1; //小時數(shù)加1</p><p> up_flag=1;</p><p> if(temp>0x23) //超過23小時,清零</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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子萬年歷
- 萬年歷課程設(shè)計
- 萬年歷課程設(shè)計
- 單片機萬年歷課程設(shè)計--基于1602液晶顯示的電子時鐘萬年歷
- 萬年歷課程設(shè)計
- 萬年歷課程設(shè)計
- 萬年歷課程設(shè)計
- 萬年歷課程設(shè)計
- 電子萬年歷設(shè)計
- 萬年歷課程設(shè)計
- 萬年歷電子時鐘溫度畢業(yè)設(shè)計
- 課程設(shè)計報告--電子萬年歷
- 電子萬年歷課程設(shè)計 (2)
- java萬年歷課程設(shè)計
- 萬年歷課程設(shè)計報告
- proteus課程設(shè)計--電子萬年歷
- 電子萬年歷課程設(shè)計報告
- 數(shù)字萬年歷課程設(shè)計
- java課程設(shè)計--萬年歷
- 萬年歷課程設(shè)計論文
評論
0/150
提交評論