2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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>  課程名稱: 單片機(jī)課程設(shè)計(jì) </p><p>  設(shè)計(jì)內(nèi)容: 萬年歷電子時(shí)鐘 </p><p>  實(shí)驗(yàn)時(shí)間: 2011年12月

2、 </p><p>  專業(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ì)說明書: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è)計(jì)過程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)化過程的實(shí)時(shí)控制和數(shù)據(jù)處理,以及我們生活中廣泛使用的各種智能IC卡等,這些都離不開單片機(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>  萬年歷在日常生活中最常見,應(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語言來實(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>  萬年歷是采用數(shù)字電路實(shí)現(xiàn)對(duì)年、月、日,時(shí)、分、秒,數(shù)字顯示的計(jì)時(shí)裝置,廣泛用于個(gè)人家庭,車站, 碼頭辦

10、公室等公共場(chǎng)所,成為人們?nèi)粘I钪胁豢缮俚谋匦杵?由于數(shù)字集成電路的發(fā)展和石英晶體振蕩器的廣泛應(yīng)用,使得數(shù)字鐘的精度,遠(yuǎn)遠(yuǎn)超過老式鐘表, 鐘表的數(shù)字化給人們生產(chǎn)生活帶來了極大的方便,而且大大地?cái)U(kuò)展了鐘表原先的報(bào)時(shí)功能。諸如定時(shí)自動(dòng)報(bào)警、按時(shí)自動(dòng)打鈴、時(shí)間程序自動(dòng)控制、定時(shí)廣播、自動(dòng)起閉路燈、定時(shí)開關(guān)烘箱、通斷動(dòng)力設(shè)備、甚至各種定時(shí)電氣的自動(dòng)啟用等,所有這些,都是以鐘表數(shù)字化為基礎(chǔ)的。因此,研究數(shù)字鐘及擴(kuò)大其應(yīng)用,有著非?,F(xiàn)實(shí)的意義。&l

11、t;/p><p>  一開始接觸到實(shí)驗(yàn)箱的時(shí)候大家都很陌生,因?yàn)槭堑谝淮问褂?,所以?shí)驗(yàn)箱很多模塊的功能及使用方法都要我們自己去掌握。在沒有實(shí)質(zhì)說明書的情況下,我們先后使用萬用表測(cè)電壓、電阻的方法得到了實(shí)驗(yàn)箱主芯片與單片機(jī)P口的引腳對(duì)應(yīng)圖,為接下來的軟件編程和硬件接口連接打下了基礎(chǔ)。萬年歷電子時(shí)鐘的實(shí)現(xiàn)主要硬件模塊是單片機(jī),本實(shí)驗(yàn)箱使用的的AT89S51單片機(jī),此外還有顯示模塊四位數(shù)碼管,還有時(shí)間切換和調(diào)整模塊按鈕和鬧

12、鈴模塊蜂鳴器。起初我們想用實(shí)驗(yàn)箱上原有的HD7279芯片來驅(qū)動(dòng)數(shù)碼管顯示和鍵盤控制,但由于對(duì)這款芯片的認(rèn)識(shí)不足,雖然從網(wǎng)上找到了很多關(guān)于HD7279的資料,但仍不能正確的使用它,于是我們想到通過對(duì)TFT彩屏液晶顯示器的控制來顯示時(shí)間,但對(duì)于它的顯示原理也不能掌握,最后我們想到了用單片機(jī)直接控制數(shù)碼管來顯示時(shí)間。</p><p>  單片機(jī)P0的八個(gè)口分別接到數(shù)碼管的八個(gè)段選位。通過按下按鈕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è)萬年歷,主要以單片機(jī)和數(shù)碼管為硬件基礎(chǔ),載入用C語言編寫的程序,設(shè)計(jì)出功能完善的萬年歷。該萬年歷通

14、過按鍵可切換顯示時(shí)間與日期、月份、日期、年份;能自動(dòng)準(zhǔn)確的計(jì)時(shí);能通過判斷年份和月份來顯示相應(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>  萬年歷的原理圖</b><

15、;/p><p><b>  2.3系統(tǒng)軟件設(shè)計(jì)</b></p><p>  3、1數(shù)字電子鐘設(shè)計(jì)用到很多子程序,它們的流程圖如下所示。 主程序是先開始,然后啟動(dòng)定時(shí)器,定時(shí)器啟動(dòng)后在進(jìn)行按鍵檢測(cè),檢測(cè)完后,就可以顯示時(shí)間。</p><p><b>  2.4設(shè)計(jì)說明書:</b></p><p>  2

16、.4.1模塊劃分:</p><p><b>  1、顯示模塊</b></p><p>  利用單片機(jī)來控制數(shù)碼管的顯示。通過單片機(jī)P0口來控制數(shù)碼管的八段,P1口來控制4位數(shù)碼管。本程序采用方式0譯碼。在主程序中進(jìn)行。</p><p><b>  2、切換模塊</b></p><p>  主要靠按鍵

17、來切換顯示時(shí)間和日期,采用中斷方式來進(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秒后分位加一,一次類推周而復(fù)始的進(jìn)行計(jì)數(shù)。該模塊也是采用中斷方式進(jìn)行采用12M的晶振。</p><p><b>  4、校

18、時(shí)模塊</b></p><p>  該模塊也是通過按鍵來對(duì)時(shí)間和日期進(jìn)行校時(shí)。先通過一個(gè)按鍵來選擇要校時(shí)的部分,再通過另外兩個(gè)按鍵來對(duì)該部分進(jìn)行加減,調(diào)整到正確的時(shí)間和日期。</p><p>  日期在校時(shí)過程中還要對(duì)年份和月份進(jìn)行判斷是不是閏年,是大月還是小月。進(jìn)過判斷后來顯示相應(yīng)的日期。上述計(jì)時(shí)過程中也要進(jìn)行判斷。該模塊也采用中斷方式。</p><p&g

19、t;<b>  2.5使用說明書:</b></p><p>  打開電源,1602液晶屏顯示時(shí)間。按鍵S1用來控制切換,即按下S1就顯示日期,再按一次就顯示時(shí)間,依次循環(huán)。按鍵S2用來控制校時(shí)部分的選擇,第一次按下,分位或時(shí)位會(huì)閃爍,表示以選擇該位,同時(shí)計(jì)數(shù)器會(huì)停止計(jì)數(shù);第二次按下,月位或日位會(huì)閃爍;第三次按下,年的高位或年的低位會(huì)閃爍;第四次按下時(shí),會(huì)退出選擇功能,計(jì)數(shù)器恢復(fù)計(jì)時(shí),依次循環(huán)

20、。按鍵S3和S4分別用來控制時(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ì)過程</b></p><p>  通過老師給我們講解了課程設(shè)計(jì)的內(nèi)容后,我們便投入了緊張的課設(shè)中,</p><p>  萬事開頭難,面對(duì)著完全陌生的實(shí)驗(yàn)箱,我們首先要做的就是收集資料,以便弄清實(shí)驗(yàn)箱各功能模塊及使用方法,第一天就這

22、么過去了,對(duì)實(shí)驗(yàn)箱的模塊有了大致的了解。星期二,我們開始對(duì)主芯片的串口進(jìn)行測(cè)試,找到了它與單片機(jī)引腳對(duì)應(yīng)圖。對(duì)于萬年歷,我們首先想到的是用單片機(jī),89sc51芯片,液晶屏和按鍵來實(shí)現(xiàn),查閱了很多關(guān)于芯片的資料后仍對(duì)其顯示原理搞不清楚,于是我們只好放棄使用該芯片,最后我們想到了直接用單片機(jī)控制液晶屏,采用動(dòng)態(tài)掃描的方式來實(shí)現(xiàn)時(shí)間顯示,用按鍵切換來實(shí)現(xiàn)。但這樣的話,編程就相對(duì)來說復(fù)雜了很多。星期三,上午開始了編程,8個(gè)段選和4個(gè)位選就占了1

23、2個(gè)I/O口,定時(shí)和中斷占2個(gè)口,四個(gè)按鍵也占了4個(gè)口,這樣一來串行口就顯得很緊張。但這不是最主要的,編程是塊難啃的骨頭,連續(xù)編了三天的程序,周五晚上進(jìn)行仿真調(diào)試通過,7月18號(hào)的周一來實(shí)驗(yàn)室進(jìn)行硬件調(diào)試,硬件調(diào)試也經(jīng)歷了數(shù)碼管顯示錯(cuò)位,亂碼,按鍵不靈的問題,通過線路的重新連接,消抖的程序的修改,一一把這些問題解決了。經(jīng)過經(jīng)過一上午辛苦的調(diào)試,終于成功的把萬年歷設(shè)計(jì)出來了!</p><p><b>  

24、心得體會(huì)</b></p><p>  回顧起此次單片機(jī)課程設(shè)計(jì),至今我仍感慨頗多,的確,從理論到實(shí)踐,在整整兩星期的日子里,可以說得是苦多于甜,但是可以學(xué)到很多很多的東西,同時(shí)不僅可以鞏固了以前所學(xué)過的知識(shí),而且學(xué)到了很多在書本上所沒有學(xué)到過的知識(shí)。通過這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會(huì)服務(wù)

25、,從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。在設(shè)計(jì)的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會(huì)遇到過各種各樣的問題,同時(shí)在設(shè)計(jì)的過程中發(fā)現(xiàn)了自己的不足之處,對(duì)以前所學(xué)過的知識(shí)理解得不夠深刻,掌握得不夠牢固,比如說單片機(jī)的動(dòng)態(tài)掃描原理,不懂分得二極管的正負(fù)極,不知道數(shù)碼管是共陰極還是共陽極,對(duì)單片機(jī)匯編語言掌握得不好……通過這次課程設(shè)計(jì)之后,一定把以前所學(xué)過的知識(shí)重新溫故。 本次課程設(shè)計(jì),真可謂是感慨萬千,從一開

26、始的一無所知,到后來的輕車熟路,其中所經(jīng)歷的波折真是無以言表。堅(jiān)持不懈是我最大的收獲,在課設(shè)過程中我曾一度有想放棄的念頭,但理智戰(zhàn)勝了沖動(dòng),我還是堅(jiān)持下來了,堅(jiān)持就是勝利!同時(shí)也再一次讓我體會(huì)了</p><p>  這次課程設(shè)計(jì)終于順利完成了,在設(shè)計(jì)中遇到了很多編程問題,最后在XX同學(xué)的幫助下解決了難題,對(duì)給過我?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í)鐘線引腳 </p><p>

29、;  sbit DS1302_IO = P1^6; //實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳 </p><p>  sbit DS1302_RST = P1^5; //實(shí)時(shí)時(shí)鐘復(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í)到日,月,年位閃的計(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寫入命令或數(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 //顯示開</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)閃動(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 // 畫面可平移</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); //開啟顯示, 無光標(biāo)</p><p>  LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏</p><p>  LCD_Se

49、tInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫面不動(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í)間類型</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í)鐘寫入一字節(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: 要寫的數(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í)鐘芯片的時(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語句都是判斷位閃爍,<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ù)組里,跟年,月,日的分開存放,因?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); //寫入允許</p><p>  Write1302(0x8c,0x07); //以下寫入初始化時(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); //禁止寫入</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; //拉高總線</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寫一個(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); // 跳過讀序號(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); //跳過讀序號(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、寫入允許</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í)數(shù)</p><p>  temp=temp+1; //小時(shí)數(shù)加1</p><p>  up_flag=1;</p><p>  if(temp>0x23) //超過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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論