版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 電子課程設計報告</b></p><p> 課程名稱: 單片機課程設計 </p><p> 設計內容: 萬年歷電子時鐘 </p><p> 實驗時間: 2011年12月
2、 </p><p> 專業(yè)班級: 09電子(2)班 </p><p> 姓 名: </p><p> 學 號: </p><p> 同 組 人:
3、 </p><p> 指導老師: </p><p> 2011年 12月 29 日</p><p><b> 目錄</b></p><p><b> 摘要2</b></p><p
4、><b> 第一章 緒論3</b></p><p> 1.1引言及設計思路3</p><p> 第二章 系統(tǒng)設計4</p><p><b> 2.14</b></p><p> 2.2 系統(tǒng)硬件設計4</p><p> 2.2.1系統(tǒng)總體框架4
5、</p><p> 2.2.2 模塊二5</p><p> 2.3系統(tǒng)軟件設計5</p><p> 2.4設計說明書:6</p><p> 2.4.1模塊劃分:6</p><p> 2.5使用說明書:6</p><p> 2.6元件清單:6</p><
6、;p><b> 第三章總結7</b></p><p><b> 3.1設計過程7</b></p><p> 3.2心得體會7</p><p><b> 附錄8</b></p><p><b> 摘要</b></p>
7、<p> 單片機應用技術飛速發(fā)展,縱觀我們現(xiàn)在生活的各個領域,從導彈的導航裝置到飛機上的各種儀表的控制,從計算機的網(wǎng)絡通訊與數(shù)據(jù)傳輸,到工業(yè)自動化過程的實時控制和數(shù)據(jù)處理,以及我們生活中廣泛使用的各種智能IC卡等,這些都離不開單片機。單片機是集CPU、RAM、ROM、定時、計數(shù)和多種接口于一體的微控制器。它體積小,成本低,功能強,廣泛應用于智能產(chǎn)業(yè)和工業(yè)自動化上。而51系列單片機是各單片機中最為典型和最有代表性的一種。&l
8、t;/p><p> 萬年歷在日常生活中最常見,應用也最廣泛。本次課程設計主要就是設計一款數(shù)字鐘,以89S51單片機為核心,配備數(shù)碼管,按鍵,蜂鳴器。數(shù)字鐘采用24小時制方式顯示時間,年、月、日、秒及毫秒。 文章的核心主要從硬件設計和軟件編程兩個大的方面。硬件電路設計主要包括中央處理單元電路、時鐘電路、人機接口電路、信號處理電路、執(zhí)行電路等幾部分組成。軟件用C語言來實現(xiàn),主要包括主程序、時間設置子程序,按鍵切
9、換程序,校時程序等軟件模塊。</p><p> 關鍵字: 單片機 時間 小時 分鐘 秒</p><p><b> 第一章 緒論</b></p><p> 1.1引言及設計思路</p><p> 萬年歷是采用數(shù)字電路實現(xiàn)對年、月、日,時、分、秒,數(shù)字顯示的計時裝置,廣泛用于個人家庭,車站, 碼頭辦
10、公室等公共場所,成為人們日常生活中不可少的必需品,由于數(shù)字集成電路的發(fā)展和石英晶體振蕩器的廣泛應用,使得數(shù)字鐘的精度,遠遠超過老式鐘表, 鐘表的數(shù)字化給人們生產(chǎn)生活帶來了極大的方便,而且大大地擴展了鐘表原先的報時功能。諸如定時自動報警、按時自動打鈴、時間程序自動控制、定時廣播、自動起閉路燈、定時開關烘箱、通斷動力設備、甚至各種定時電氣的自動啟用等,所有這些,都是以鐘表數(shù)字化為基礎的。因此,研究數(shù)字鐘及擴大其應用,有著非?,F(xiàn)實的意義。&l
11、t;/p><p> 一開始接觸到實驗箱的時候大家都很陌生,因為是第一次使用,所以實驗箱很多模塊的功能及使用方法都要我們自己去掌握。在沒有實質說明書的情況下,我們先后使用萬用表測電壓、電阻的方法得到了實驗箱主芯片與單片機P口的引腳對應圖,為接下來的軟件編程和硬件接口連接打下了基礎。萬年歷電子時鐘的實現(xiàn)主要硬件模塊是單片機,本實驗箱使用的的AT89S51單片機,此外還有顯示模塊四位數(shù)碼管,還有時間切換和調整模塊按鈕和鬧
12、鈴模塊蜂鳴器。起初我們想用實驗箱上原有的HD7279芯片來驅動數(shù)碼管顯示和鍵盤控制,但由于對這款芯片的認識不足,雖然從網(wǎng)上找到了很多關于HD7279的資料,但仍不能正確的使用它,于是我們想到通過對TFT彩屏液晶顯示器的控制來顯示時間,但對于它的顯示原理也不能掌握,最后我們想到了用單片機直接控制數(shù)碼管來顯示時間。</p><p> 單片機P0的八個口分別接到數(shù)碼管的八個段選位。通過按下按鈕1,可以實現(xiàn)從年—月日—
13、時分—秒毫秒的顯示切換,按下按鈕2,可實現(xiàn)年份、月份日期,時分的加減,以實現(xiàn)時間的校正。</p><p><b> 第二章 系統(tǒng)設計</b></p><p><b> 2.1設計任務:</b></p><p> 設計一個萬年歷,主要以單片機和數(shù)碼管為硬件基礎,載入用C語言編寫的程序,設計出功能完善的萬年歷。該萬年歷通
14、過按鍵可切換顯示時間與日期、月份、日期、年份;能自動準確的計時;能通過判斷年份和月份來顯示相應的天數(shù)(即能判斷閏年,大月和小月)。</p><p> 2.2 系統(tǒng)硬件設計和顯示</p><p> 2.2.1系統(tǒng)總體框架</p><p> 2.2.2 模塊二</p><p><b> 萬年歷的原理圖</b><
15、;/p><p><b> 2.3系統(tǒng)軟件設計</b></p><p> 3、1數(shù)字電子鐘設計用到很多子程序,它們的流程圖如下所示。 主程序是先開始,然后啟動定時器,定時器啟動后在進行按鍵檢測,檢測完后,就可以顯示時間。</p><p><b> 2.4設計說明書:</b></p><p> 2
16、.4.1模塊劃分:</p><p><b> 1、顯示模塊</b></p><p> 利用單片機來控制數(shù)碼管的顯示。通過單片機P0口來控制數(shù)碼管的八段,P1口來控制4位數(shù)碼管。本程序采用方式0譯碼。在主程序中進行。</p><p><b> 2、切換模塊</b></p><p> 主要靠按鍵
17、來切換顯示時間和日期,采用中斷方式來進行。</p><p><b> 3、計時模塊</b></p><p> 本程序采用定時計數(shù)器T0,定時10ms,即50ms進一次中斷,100次后達到1秒,秒位加一,達到60秒后分位加一,一次類推周而復始的進行計數(shù)。該模塊也是采用中斷方式進行采用12M的晶振。</p><p><b> 4、校
18、時模塊</b></p><p> 該模塊也是通過按鍵來對時間和日期進行校時。先通過一個按鍵來選擇要校時的部分,再通過另外兩個按鍵來對該部分進行加減,調整到正確的時間和日期。</p><p> 日期在校時過程中還要對年份和月份進行判斷是不是閏年,是大月還是小月。進過判斷后來顯示相應的日期。上述計時過程中也要進行判斷。該模塊也采用中斷方式。</p><p&g
19、t;<b> 2.5使用說明書:</b></p><p> 打開電源,1602液晶屏顯示時間。按鍵S1用來控制切換,即按下S1就顯示日期,再按一次就顯示時間,依次循環(huán)。按鍵S2用來控制校時部分的選擇,第一次按下,分位或時位會閃爍,表示以選擇該位,同時計數(shù)器會停止計數(shù);第二次按下,月位或日位會閃爍;第三次按下,年的高位或年的低位會閃爍;第四次按下時,會退出選擇功能,計數(shù)器恢復計時,依次循環(huán)
20、。按鍵S3和S4分別用來控制時間或日期的加、減,使用該功能時,按鍵S2必須先按下選擇某一位進行加減,按鍵S2第四次按下時,也同時退出該功能。</p><p><b> 2.6元件清單:</b></p><p> AT89S51單片機</p><p> 1602顯示屏一個、電阻電容若干,5個獨立按鍵,12M晶振一個,記憶電池一塊</p
21、><p><b> 總結</b></p><p><b> 3.1設計過程</b></p><p> 通過老師給我們講解了課程設計的內容后,我們便投入了緊張的課設中,</p><p> 萬事開頭難,面對著完全陌生的實驗箱,我們首先要做的就是收集資料,以便弄清實驗箱各功能模塊及使用方法,第一天就這
22、么過去了,對實驗箱的模塊有了大致的了解。星期二,我們開始對主芯片的串口進行測試,找到了它與單片機引腳對應圖。對于萬年歷,我們首先想到的是用單片機,89sc51芯片,液晶屏和按鍵來實現(xiàn),查閱了很多關于芯片的資料后仍對其顯示原理搞不清楚,于是我們只好放棄使用該芯片,最后我們想到了直接用單片機控制液晶屏,采用動態(tài)掃描的方式來實現(xiàn)時間顯示,用按鍵切換來實現(xiàn)。但這樣的話,編程就相對來說復雜了很多。星期三,上午開始了編程,8個段選和4個位選就占了1
23、2個I/O口,定時和中斷占2個口,四個按鍵也占了4個口,這樣一來串行口就顯得很緊張。但這不是最主要的,編程是塊難啃的骨頭,連續(xù)編了三天的程序,周五晚上進行仿真調試通過,7月18號的周一來實驗室進行硬件調試,硬件調試也經(jīng)歷了數(shù)碼管顯示錯位,亂碼,按鍵不靈的問題,通過線路的重新連接,消抖的程序的修改,一一把這些問題解決了。經(jīng)過經(jīng)過一上午辛苦的調試,終于成功的把萬年歷設計出來了!</p><p><b>
24、心得體會</b></p><p> 回顧起此次單片機課程設計,至今我仍感慨頗多,的確,從理論到實踐,在整整兩星期的日子里,可以說得是苦多于甜,但是可以學到很多很多的東西,同時不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服務
25、,從而提高自己的實際動手能力和獨立思考的能力。在設計的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會遇到過各種各樣的問題,同時在設計的過程中發(fā)現(xiàn)了自己的不足之處,對以前所學過的知識理解得不夠深刻,掌握得不夠牢固,比如說單片機的動態(tài)掃描原理,不懂分得二極管的正負極,不知道數(shù)碼管是共陰極還是共陽極,對單片機匯編語言掌握得不好……通過這次課程設計之后,一定把以前所學過的知識重新溫故。 本次課程設計,真可謂是感慨萬千,從一開
26、始的一無所知,到后來的輕車熟路,其中所經(jīng)歷的波折真是無以言表。堅持不懈是我最大的收獲,在課設過程中我曾一度有想放棄的念頭,但理智戰(zhàn)勝了沖動,我還是堅持下來了,堅持就是勝利!同時也再一次讓我體會了</p><p> 這次課程設計終于順利完成了,在設計中遇到了很多編程問題,最后在XX同學的幫助下解決了難題,對給過我?guī)椭乃型瑢W和指導老師再次表示忠心的感謝!也感謝學校為我們課程設計提供了這么好的設備,這么好的環(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; //實時時鐘復位線引腳</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; //立刻跳出調整模式按鈕</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> //內部等待函數(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、// 光標返回原點</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> //設置顯示模式************************************************************</p><p> #define LCD_SHOW0x04 //顯示開</p><p> #define LCD_HIDE0x00
42、//顯示關 </p><p> #define LCD_CURSOR0x02 //顯示光標</p><p> #define LCD_NO_CURSOR0x00 //無光標 </p><p> #define LCD_FLASH0x01 //光標閃動</p><p> #define LC
43、D_NO_FLASH0x00 //光標不閃動</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> //設置輸入模式************************************************************</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); //開啟顯示, 無光標</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) // 轉成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é)(內部函數(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、 //相當于匯編中的 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é)(內部函數(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; //相當于匯編中的 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ù)到自定義的結構型數(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ù)轉換成液晶顯示字符串,放到數(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' ,判斷結
87、束字符</p><p><b> }</b></p><p> void TimeToStr(SYSTEMTIME *Time) //將時,分,秒數(shù)據(jù)轉換成液晶顯示字符放到數(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、) //判斷時鐘芯片是否關閉 </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復位</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當前溫度************/</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); // 啟動溫度轉換</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ù)轉換成液晶字符顯示</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() //跳出調整模式,返回默認顯示</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ù)調整后更新標志</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); //讀取分數(shù)</p><p> temp=temp+1; //分數(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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論