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

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論