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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、<p><b>  教學(xué)單位 </b></p><p>  學(xué)生學(xué)號 </p><p><b>  XXX大學(xué)(學(xué)院)</b></p><p>  畢 業(yè) 設(shè) 計(jì) (論文)</p><p>  題 目: </p>

2、<p>  年 級: </p><p>  學(xué) 號: </p><p>  姓 名: </p><p>  專 業(yè): </p><p>  指導(dǎo)教師:

3、 </p><p>  2011 年 6 月 19 日</p><p><b>  摘 要</b></p><p>  單片機(jī),是集CPU ,RAM ,ROM ,計(jì)數(shù)和多種接口于一體的微控制器。自20世紀(jì)70年代問世以來,以其極高的性能價(jià)格比,受到人們的重視和關(guān)注。它體積小、重量輕、抗干擾能力強(qiáng)、環(huán)境要求

4、不高、價(jià)格低廉、可靠性高、靈活性好、開發(fā)較為容易,廣泛應(yīng)用于智能生產(chǎn)和工業(yè)自動(dòng)化上。</p><p>  本課題通過MCS-51單片機(jī)來設(shè)計(jì),采用匯編語言進(jìn)行編程,可以實(shí)現(xiàn)以下一些功能:小時(shí),分,秒和年,月,的顯示、定時(shí)報(bào)警功能。本次設(shè)計(jì)的電子時(shí)鐘系統(tǒng)由時(shí)鐘電路,LCD顯示電路,定時(shí)報(bào)警電路,按鍵調(diào)整電路四部分組成。51單片機(jī)通過軟件編程,在LCD1602液晶屏上實(shí)現(xiàn)小時(shí),分,秒和年,月,的顯示;利用時(shí)鐘芯片DS

5、1302來實(shí)現(xiàn)計(jì)時(shí),定時(shí)功能;通過兩個(gè)按鍵開關(guān),一個(gè)用于時(shí)鐘的調(diào)節(jié),一個(gè)用于鬧鐘的調(diào)節(jié),來實(shí)現(xiàn)參數(shù)設(shè)置和調(diào)節(jié)功能;到達(dá)設(shè)置的鬧鐘時(shí)間時(shí),由蜂鳴器發(fā)聲,起報(bào)警作用。本次設(shè)計(jì)的電子時(shí)鐘,經(jīng)過對比測試,發(fā)現(xiàn)實(shí)際計(jì)時(shí)的走時(shí)精度較高,可滿足多種場合的應(yīng)用需求。</p><p>  本文詳細(xì)介紹了AT89C51單片機(jī)的基本原理,分析了AT89C51各個(gè)管腳的功能及它在設(shè)計(jì)電路中的作用。本文論述了LCD1602液晶屏和時(shí)鐘芯片

6、DS1302的工作原理及其軟件設(shè)計(jì)過程。</p><p>  關(guān)鍵詞:單片機(jī);電子時(shí)鐘;時(shí)鐘芯片;LCD1602</p><p><b>  1 引 言</b></p><p>  單片機(jī),亦稱單片微電腦或單片微型計(jì)算機(jī)。它是把中央處理器(CPU)、隨機(jī)存取存儲(chǔ)器(RAM)、只讀存儲(chǔ)器(ROM)、輸入/輸出端口 (I/0)等主要計(jì)算機(jī)功能部件都

7、集成在一塊集成電路芯片上的微型計(jì)算機(jī)。單片機(jī)是把主要計(jì)算機(jī)功能部件都集成在一塊芯片上的微型計(jì)算機(jī)。它是一種集計(jì)數(shù)和多中接口于一體的微控制器,被廣泛應(yīng)用在智能產(chǎn)品和工業(yè)自動(dòng)化上,而52單片機(jī)是個(gè)單片機(jī)中最為典型和最有代表性的一種。</p><p>  現(xiàn)在高精度的計(jì)時(shí)工具大多數(shù)都使用了石英晶體振蕩器,由于電子鐘、石英鐘、石英表都采用了石英技術(shù),因此走時(shí)精度高,穩(wěn)定性好,使用方便,不需要經(jīng)常調(diào)試,數(shù)字式電子鐘用集成電

8、路計(jì)時(shí)時(shí),譯碼代替機(jī)械式傳動(dòng),用LED顯示器代替指針顯示進(jìn)而顯示時(shí)間,減小了計(jì)時(shí)誤差,這種表具有時(shí)、分、秒顯示時(shí)間的功能,還可以進(jìn)行時(shí)和分的校對,片選的靈活性好。</p><p><b>  2 系統(tǒng)結(jié)構(gòu)</b></p><p>  整個(gè)電子時(shí)鐘系統(tǒng)電路可分為五大部分:中央處理單元(CPU)、顯示部分、鍵盤輸入部分、溫度采集部分。</p><p&g

9、t;<b>  1 中央處理單元</b></p><p>  CPU選用AT89C52對整個(gè)系統(tǒng)進(jìn)行控制:</p><p>  1)它將定時(shí)數(shù)據(jù)輸出到LED,實(shí)現(xiàn)時(shí)間的顯示;</p><p>  2)根據(jù)鍵盤輸入調(diào)用相應(yīng)鍵處理子程序,實(shí)現(xiàn)時(shí)間的調(diào)整設(shè)定;</p><p>  3)接收溫度傳感器輸入的溫度數(shù)據(jù),進(jìn)行一定轉(zhuǎn)換

10、,輸出到LCD顯示器顯示。</p><p><b>  2.2 顯示部分</b></p><p>  顯示部分是整個(gè)電子時(shí)鐘最為重要的部分,它分為時(shí)間的顯示和溫度的顯示兩部分,采用動(dòng)態(tài)顯示方式,動(dòng)態(tài)顯示方式是時(shí)間數(shù)字在LED上逐個(gè)顯示,通過位選端控制在哪個(gè)LED上顯示數(shù)字,由于LED數(shù)字顯示之間的時(shí)間非常的短,人眼看來是一起顯示時(shí)間數(shù)字的,并且動(dòng)態(tài)顯示方式所用的接口少

11、,節(jié)省了CPU的管腳。由于端口的問題以及動(dòng)態(tài)顯示方式的優(yōu)越性,在此設(shè)計(jì)的連接方式上采用共陰級接法。</p><p><b>  2.3 鍵盤部分</b></p><p>  它是整個(gè)系統(tǒng)中最簡單的部分,根據(jù)功能要求,本系統(tǒng)共需四個(gè)按鍵:功能移位鍵、功能加鍵、功能減鍵、立刻跳出調(diào)整模式鍵采用獨(dú)立式按鍵。</p><p>  2.4 溫度采集部分&

12、lt;/p><p>  此部分選用DS18B20傳感器,主要由四部分組成:64位ROM、溫度傳感器、非揮發(fā)的溫度報(bào)警觸發(fā)器TH和TL、配置寄存器。有三個(gè)管腳:DQ為數(shù)字信號輸入/輸出端;GND為電源地;VDD為外接供電電源輸入端。它是支持“一線總線”接口的溫度傳感器,測量溫度范圍為-55°C~+125°C,在-10~+85°C范圍內(nèi),可編程為9位—12位A/D轉(zhuǎn)換精度,工作電壓在3V—5

13、V之間。現(xiàn)場溫度直接以“一線總線”的數(shù)字方式傳輸,大大提高了系統(tǒng)的抗干擾性。</p><p><b>  2.電路制作</b></p><p>  根據(jù)電路圖(如圖示1)將元器件布置在電路板上:</p><p><b>  如圖(1)</b></p><p><b>  系統(tǒng)程序設(shè)計(jì)<

14、;/b></p><p>  #include <REG51.H></p><p>  #include <intrins.h></p><p>  //#include "LCD1602.h"</p><p>  //#include "DS1302.h"</p&g

15、t;<p>  #define uint unsigned int</p><p>  #define uchar unsigned char</p><p>  sbit DS1302_CLK = P1^7; //實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳 </p><p>  sbit DS1302_IO = P1^6;

16、 //實(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;</p><p>  sbit wireless_

17、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_min,hide_hour,hide_day,hide_week,hide_

18、month,hide_year; //秒,分,時(shí)到日,月,年位閃的計(jì)數(shù)</p><p>  sbit Set = P2^0; //模式切換鍵</p><p>  sbit Up = P2^1; //加法按鈕</p><p>  sbit Down = P2^2; //減法按鈕</p><p>  sbit

19、 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>  uchar temp_value; //溫度值</p>&l

20、t;p>  uchar TempBuffer[5],week_value[2];</p><p>  void show_time(); //液晶顯示程序</p><p>  /***********1602液晶顯示部分子程序****************/</p><p>  //Port Definitions********************

21、**************************************</p><p>  sbit LcdRs= P2^5;</p><p>  sbit LcdRw= P2^6;</p><p>  sbit LcdEn = P2^7;</p><p>  sfr DBPort = 0x80;//P0=0x80,

22、P1=0x90,P2=0xA0,P3=0xB0.數(shù)據(jù)端口</p><p>  //內(nèi)部等待函數(shù)***********************************************************</p><p>  unsigned char LCD_Wait(void)</p><p><b>  {</b></p&g

23、t;<p><b>  LcdRs=0;</b></p><p>  LcdRw=1;_nop_();</p><p>  LcdEn=1;_nop_();</p><p><b>  LcdEn=0;</b></p><p>  return DBPort;</p>

24、;<p><b>  }</b></p><p>  //LCD寫入命令或數(shù)據(jù)******************************************************</p><p>  #define LCD_COMMAND0 // Command</p><p>  #define LCD_

25、DATA1 // Data</p><p>  #define LCD_CLEAR_SCREEN0x01 // 清屏</p><p>  #define LCD_HOMING 0x02 // 光標(biāo)返回原點(diǎn)</p><p>  void LCD_Write(bit style, unsigned char input)<

26、;/p><p><b>  {</b></p><p><b>  LcdEn=0;</b></p><p>  LcdRs=style;</p><p>  LcdRw=0;_nop_();</p><p>  DBPort=input;_nop_();//注意順序<

27、;/p><p>  LcdEn=1;_nop_();//注意順序</p><p>  LcdEn=0;_nop_();</p><p>  LCD_Wait();</p><p><b>  }</b></p><p>  //設(shè)置顯示模***************************

28、*********************************</p><p>  #define LCD_SHOW0x04 //顯示開</p><p>  #define LCD_HIDE0x00 //顯示關(guān) </p><p>  #define LCD_CURSOR0x02 //顯示光標(biāo)</p><p&

29、gt;  #define LCD_NO_CURSOR0x00 //無光標(biāo) </p><p>  #define LCD_FLASH0x01 //光標(biāo)閃動(dòng)</p><p>  #define LCD_NO_FLASH0x00 //光標(biāo)不閃動(dòng)</p><p>  void LCD_SetDisplay(unsigned cha

30、r DisplayMode)</p><p><b>  {</b></p><p>  LCD_Write(LCD_COMMAND, 0x08|DisplayMode);</p><p><b>  }</b></p><p>  //設(shè)置輸入模*************************

31、***********************************</p><p>  #define LCD_AC_UP0x02</p><p>  #define LCD_AC_DOWN0x00 // default</p><p>  #define LCD_MOVE0x01 // 畫面可平移</p>&

32、lt;p>  #define LCD_NO_MOVE0x00 //default</p><p>  void LCD_SetInput(unsigned char InputMode)</p><p><b>  {</b></p><p>  LCD_Write(LCD_COMMAND, 0x04|InputMode)

33、;</p><p><b>  }</b></p><p>  //初始化LCD************************************************************</p><p>  void LCD_Initial()</p><p><b>  {</b>&

34、lt;/p><p><b>  LcdEn=0;</b></p><p>  LCD_Write(LCD_COMMAND,0x38); //8位數(shù)據(jù)端口,2行顯示,5*7點(diǎn)陣</p><p>  LCD_Write(LCD_COMMAND,0x38);</p><p>  LCD_SetDisplay(L

35、CD_SHOW|LCD_NO_CURSOR); //開啟顯示, 無光標(biāo)</p><p>  LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏</p><p>  LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫面不動(dòng)</p><p><b>  }&

36、lt;/b></p><p>  //液晶字符輸入的位置****************************************************</p><p>  void GotoXY(unsigned char x, unsigned char y)</p><p><b>  {</b></p>&l

37、t;p><b>  if(y==0)</b></p><p>  LCD_Write(LCD_COMMAND,0x80|x);</p><p><b>  if(y==1)</b></p><p>  LCD_Write(LCD_COMMAND,0x80|(x-0x40));</p><p>

38、<b>  }</b></p><p>  void Print(unsigned char *str)</p><p><b>  {</b></p><p>  while(*str!='\0')</p><p><b>  {</b></p>

39、<p>  LCD_Write(LCD_DATA,*str);</p><p><b>  str++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /***********DS1302時(shí)鐘部分子程序*

40、*****************/</p><p>  typedef struct __SYSTEMTIME__</p><p><b>  {</b></p><p>  unsigned char Second;</p><p>  unsigned char Minute;</p><p&g

41、t;  unsigned char Hour;</p><p>  unsigned char Week;</p><p>  unsigned char Day;</p><p>  unsigned char Month;</p><p>  unsigned char Year;</p><p>  unsig

42、ned char DateString[11];</p><p>  unsigned char TimeString[9];</p><p>  }SYSTEMTIME;//定義的時(shí)間類型</p><p>  SYSTEMTIME CurrentTime;</p><p>  #define AM(X)X</p><

43、p>  #define PM(X)(X+12) // 轉(zhuǎn)成24小時(shí)制</p><p>  #define DS1302_SECOND0x80 //時(shí)鐘芯片的寄存器位置,存放時(shí)間</p><p>  #define DS1302_MINUTE0x82</p><p>  #define DS1302_HOUR

44、0x84 </p><p>  #define DS1302_WEEK0x8A</p><p>  #define DS1302_DAY0x86</p><p>  #define DS1302_MONTH0x88</p><p>  #define DS1302_YEAR0x8C </p><p> 

45、 void DS1302InputByte(unsigned char d) //實(shí)時(shí)時(shí)鐘寫入一字節(jié)(內(nèi)部函數(shù))</p><p><b>  { </b></p><p>  unsigned char i;</p><p><b>  ACC = d;</b></p><p>  for(i=8

46、; i>0; i--)</p><p><b>  {</b></p><p>  DS1302_IO = ACC0; //相當(dāng)于匯編中的 RRC</p><p>  DS1302_CLK = 1;</p><p>  DS1302_CLK = 0;</p><p> 

47、 ACC = ACC >> 1; </p><p><b>  } </b></p><p><b>  }</b></p><p>  unsigned char DS1302OutputByte(void) //實(shí)時(shí)時(shí)鐘讀取一字節(jié)(內(nèi)部函數(shù))</p><p><b>  

48、{ </b></p><p>  unsigned char i;</p><p>  for(i=8; i>0; i--)</p><p><b>  {</b></p><p>  ACC = ACC >>1; //相當(dāng)于匯編中的 RRC </p>&

49、lt;p>  ACC7 = DS1302_IO;</p><p>  DS1302_CLK = 1;</p><p>  DS1302_CLK = 0;</p><p><b>  } </b></p><p>  return(ACC); </p><p><b>  }<

50、/b></p><p>  void Write1302(unsigned char ucAddr, unsigned char ucDa) {</p><p>  DS1302_RST = 0;</p><p>  DS1302_CLK = 0;</p><p>  DS1302_RST = 1;</p

51、><p>  DS1302InputByte(ucAddr); // 地址,命令 </p><p>  DS1302InputByte(ucDa); // 寫1Byte數(shù)據(jù)</p><p>  DS1302_CLK = 1;</p><p>  DS1302_RST = 0;</p><p>&

52、lt;b>  } </b></p><p>  unsigned char Read1302(unsigned char ucAddr)//讀取DS1302某地址的數(shù)據(jù)</p><p><b>  {</b></p><p>  unsigned char ucData;</p><p>  DS13

53、02_RST = 0;</p><p>  DS1302_CLK = 0;</p><p>  DS1302_RST = 1;</p><p>  DS1302InputByte(ucAddr|0x01); // 地址,命令 </p><p>  ucData = DS1302OutputByte(); // 讀

54、1Byte數(shù)據(jù)</p><p>  DS1302_CLK = 1;</p><p>  DS1302_RST = 0;</p><p>  return(ucData);</p><p><b>  }</b></p><p>  void DS1302_GetTime(SYSTEMTIME *T

55、ime) //獲取時(shí)鐘芯片的時(shí)鐘數(shù)據(jù)</p><p><b>  {</b></p><p>  unsigned char ReadValue;</p><p>  ReadValue = Read1302(DS1302_SECOND);</p><p>  Time->Second = ((ReadValue

56、&0x70)>>4)*10 + (ReadValue&0x0F);</p><p>  ReadValue = Read1302(DS1302_MINUTE);</p><p>  Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><

57、;p>  ReadValue = Read1302(DS1302_HOUR);</p><p>  Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p>  ReadValue = Read1302(DS1302_DAY);</p><p>  Ti

58、me->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p>  ReadValue = Read1302(DS1302_WEEK);</p><p>  Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&

59、0x0F);</p><p>  ReadValue = Read1302(DS1302_MONTH);</p><p>  Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p>  ReadValue = Read1302(DS1302_YEAR);&

60、lt;/p><p>  Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p><b>  }</b></p><p>  void DateToStr(SYSTEMTIME *Time) //將時(shí)間年,月,日,星期數(shù)據(jù)轉(zhuǎn)換成液晶顯

61、示字符串,放到數(shù)組里DateString[]</p><p>  { if(hide_year<2) //這里的if,else語句都是判斷位閃爍,<2顯示數(shù)據(jù),>2就不顯示,輸出字符串為 2007/07/22</p><p>  { </p><p> 

62、 Time->DateString[0] = '2';</p><p>  Time->DateString[1] = '0'; </p><p>  Time->DateString[2] = Time->Year/10 + '0';</p><p>  Time->DateStrin

63、g[3] = Time->Year%10 + '0';</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  { </b></p><p>  Time->DateString[0] = &

64、#39; ';</p><p>  Time->DateString[1] = ' '; </p><p>  Time->DateString[2] = ' ';</p><p>  Time->DateString[3] = ' ';</p><p><b

65、>  }</b></p><p>  Time->DateString[4] = '/';</p><p>  if(hide_month<2)</p><p><b>  {</b></p><p>  Time->DateString[5] = Time->M

66、onth/10 + '0';</p><p>  Time->DateString[6] = Time->Month%10 + '0';</p><p><b>  }</b></p><p><b>  else</b></p><p><b>

67、;  {</b></p><p>  Time->DateString[5] = ' ';</p><p>  Time->DateString[6] = ' ';</p><p><b>  }</b></p><p>  Time->DateString[

68、7] = '/';</p><p>  if(hide_day<2)</p><p><b>  {</b></p><p>  Time->DateString[8] = Time->Day/10 + '0';</p><p>  Time->DateString

69、[9] = Time->Day%10 + '0';</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  Time->DateString[8] = '

70、; ';</p><p>  Time->DateString[9] = ' '; </p><p><b>  }</b></p><p>  if(hide_week<2)</p><p><b>  {</b></p><p>

71、;  week_value[0] = Time->Week%10 + '0'; //星期的數(shù)據(jù)另外放到 week_value[]數(shù)組里,跟年,月,日的分開存放,因?yàn)榈纫幌乱谧詈箫@示</p><p><b>  }</b></p><p><b>  else</b></p><p><b&g

72、t;  {</b></p><p>  week_value[0] = ' ';</p><p><b>  }</b></p><p>  week_value[1] = '\0';</p><p>  Time->DateString[10] = '\0

73、9;; //字符串末尾加 '\0' ,判斷結(jié)束字符</p><p><b>  }</b></p><p>  void TimeToStr(SYSTEMTIME *Time) //將時(shí),分,秒數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符{ if(hide_hour<2)</p><p><b>  {</b><

74、;/p><p>  Time->TimeString[0] = Time->Hour/10 + '0';</p><p>  Time->TimeString[1] = Time->Hour%10 + '0';</p><p><b>  }</b></p><p>&

75、lt;b>  else</b></p><p><b>  {</b></p><p>  Time->TimeString[0] = ' ';</p><p>  Time->TimeString[1] = ' ';</p><p><b>  }

76、</b></p><p>  Time->TimeString[2] = ':';</p><p>  if(hide_min<2)</p><p><b>  {</b></p><p>  Time->TimeString[3] = Time->Minute/10

77、+ '0';</p><p>  Time->TimeString[4] = Time->Minute%10 + '0';</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {<

78、;/b></p><p>  Time->TimeString[3] = ' ';</p><p>  Time->TimeString[4] = ' ';</p><p><b>  }</b></p><p>  Time->TimeString[5] = &#

79、39;:';</p><p>  if(hide_sec<2)</p><p><b>  {</b></p><p>  Time->TimeString[6] = Time->Second/10 + '0';</p><p>  Time->TimeString[7]

80、= Time->Second%10 + '0';</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  Time->TimeString[6] = '

81、 ';</p><p>  Time->TimeString[7] = ' ';</p><p><b>  }</b></p><p>  Time->DateString[8] = '\0';</p><p><b>  }</b></p

82、><p>  void Initial_DS1302(void) //時(shí)鐘芯片初始化</p><p><b>  { </b></p><p>  unsigned char Second=Read1302(DS1302_SECOND);</p><p>  if(Second&0x80) //判

83、斷時(shí)鐘芯片是否關(guān)閉 </p><p><b>  {</b></p><p>  Write1302(0x8e,0x00); //寫入允許</p><p>  Write1302(0x8c,0x07);//寫入初始化值07/07/25.星期:3.時(shí)間: 23:59:55</p><p>  Write1302(0x8

84、8,0x07);</p><p>  Write1302(0x86,0x25);</p><p>  Write1302(0x8a,0x07);</p><p>  Write1302(0x84,0x23);</p><p>  Write1302(0x82,0x59);</p><p>  Write1302(0x8

85、0,0x55);</p><p>  Write1302(0x8e,0x80); //禁止寫入</p><p><b>  }</b></p><p><b>  }</b></p><p>  /***********ds18b20子程序*************************/<

86、/p><p>  /***********ds18b20延遲子函數(shù)(晶振12MHz )*******/ </p><p>  void delay_18B20(unsigned int i)</p><p><b>  {</b></p><p>  while(i--);</p><p><b

87、>  }</b></p><p>  /**********ds18b20初始化函數(shù)**********************/</p><p>  void Init_DS18B20(void) </p><p><b>  {</b></p><p>  unsigned char x=0;<

88、;/p><p>  DQ = 1; //DQ復(fù)位</p><p>  delay_18B20(8); //稍做延時(shí)</p><p>  DQ = 0; //單片機(jī)將DQ拉低</p><p>  delay_18B20(80); //精確延時(shí) 大于 480us</p><p>  DQ

89、= 1; //拉高總線</p><p>  delay_18B20(14);</p><p>  x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗</p><p>  delay_18B20(20);</p><p><b>  }</b></p>

90、<p>  /***********ds18b20讀一個(gè)字節(jié)**************/ </p><p>  unsigned char ReadOneChar(void)</p><p><b>  {</b></p><p>  uchar i=0;</p><p>  uchar dat = 0

91、;</p><p>  for (i=8;i>0;i--)</p><p><b>  {</b></p><p>  DQ = 0; // 給脈沖信號</p><p><b>  dat>>=1;</b></p><p>  DQ = 1; // 給脈沖信

92、號</p><p><b>  if(DQ)</b></p><p>  dat|=0x80;</p><p>  delay_18B20(4);</p><p><b>  }</b></p><p>  return(dat);</p><p>&

93、lt;b>  }</b></p><p>  /*************ds18b20寫一個(gè)字節(jié)****************/ </p><p>  void WriteOneChar(uchar dat)</p><p><b>  {</b></p><p>  unsigned char

94、i=0;</p><p>  for (i=8; i>0; i--)</p><p><b>  {</b></p><p><b>  DQ = 0;</b></p><p>  DQ = dat&0x01;</p><p>  delay_18B20(5);

95、</p><p><b>  DQ = 1;</b></p><p><b>  dat>>=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /*****

96、*********讀取ds18b20當(dāng)前溫度************/</p><p>  void ReadTemp(void)</p><p><b>  {</b></p><p>  unsigned char a=0;</p><p>  unsigned char b=0;</p><p&

97、gt;  unsigned char t=0;</p><p>  Init_DS18B20();</p><p>  WriteOneChar(0xCC); // 跳過讀序號列號的操作</p><p>  WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換</p><p>  delay_18B20(100);

98、 // this message is wery important</p><p>  Init_DS18B20();</p><p>  WriteOneChar(0xCC); //跳過讀序號列號的操作</p><p>  WriteOneChar(0xBE); //讀取溫度寄存器兩個(gè)就是溫度</p><p>  delay_18B2

99、0(100);</p><p>  a=ReadOneChar(); //讀取溫度值低位</p><p>  b=ReadOneChar(); //讀取溫度值高位</p><p>  temp_value=b<<4;</p><p>  temp_value+=(a&0xf0)>>4;

100、 </p><p><b>  }</b></p><p>  void temp_to_str() //溫度數(shù)據(jù)轉(zhuǎn)換成液晶字符顯示</p><p><b>  {</b></p><p>  TempBuffer[0]=temp_value/10+'0';

101、//十位</p><p>  TempBuffer[1]=temp_value%10+'0'; //個(gè)位</p><p>  TempBuffer[2]=0xdf; //溫度符號</p><p>  TempBuffer[3]='C';</p><p>  TempBuffer[4]='\0

102、9;;</p><p><b>  }</b></p><p>  void Delay1ms(unsigned int count)</p><p><b>  {</b></p><p>  unsigned int i,j;</p><p>  for(i=0;i<

103、;count;i++)</p><p>  for(j=0;j<120;j++);</p><p><b>  }</b></p><p><b>  /*延時(shí)子程序*/</b></p><p>  void mdelay(uint delay)</p><p><

104、;b>  {uint i;</b></p><p>  for(;delay>0;delay--)</p><p>  {for(i=0;i<62;i++) //1ms延時(shí).</p><p><b>  {;}</b></p><p><b>  }</b></

105、p><p><b>  }</b></p><p>  void outkey() //跳出調(diào)整模式,返回默認(rèn)顯示</p><p>  { uchar Second;</p><p>  if(out==0||wireless_1==1) </p><

106、p>  { mdelay(8); </p><p><b>  count=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

107、_SECOND);</p><p>  Write1302(0x8e,0x00); //寫入允許</p><p>  Write1302(0x80,Second&0x7f);</p><p>  Write1302(0x8E,0x80); //禁止寫入</p><p>  done=0; <

108、/p><p>  while(out==0);</p><p>  while(wireless_1==1);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void Upkey()//升序按鍵</p><

109、p><b>  { </b></p><p><b>  Up=1;</b></p><p>  if(Up==0||wireless_2==1)</p><p><b>  {</b></p><p>  mdelay(8);</p><p&g

110、t;  switch(count)</p><p><b>  {case 1:</b></p><p>  temp=Read1302(DS1302_SECOND);//讀取秒數(shù)</p><p>  temp=temp+1; //秒數(shù)加1</p><p>  up_flag=1; //數(shù)據(jù)調(diào)整后更新標(biāo)志<

111、/p><p>  if((temp&0x7f)>0x59) //超過59秒,清零</p><p>  temp=0; </p><p><b>  break;</b></p><p><b>  case 2:</b></p><p>  t

112、emp=Read1302(DS1302_MINUTE);//讀取分?jǐn)?shù)</p><p>  temp=temp+1; //分?jǐn)?shù)加1</p><p>  up_flag=1;</p><p>  if(temp>0x59) //超過59分,清零</p><p><b>  temp=0;</b>&l

113、t;/p><p><b>  break;</b></p><p><b>  case 3:</b></p><p>  temp=Read1302(DS1302_HOUR);//讀取小時(shí)數(shù)</p><p>  temp=temp+1; //小時(shí)數(shù)加1</p><p>  u

114、p_flag=1;</p><p>  if(temp>0x23) //超過23小時(shí),清零</p><p><b>  temp=0;</b></p><p><b>  break;</b></p><p><b>  case 4:</b></p>

115、<p>  temp=Read1302(DS1302_WEEK);//讀取星期數(shù)</p><p>  temp=temp+1; //星期數(shù)加1</p><p>  up_flag=1;</p><p>  if(temp>0x7) </p><p><b>  temp=1;</b></p>

116、;<p><b>  break;</b></p><p><b>  case 5:</b></p><p>  temp=Read1302(DS1302_DAY); //讀取日數(shù)</p><p>  temp=temp+1; //日數(shù)加1</p><p>  up_flag=1

117、;</p><p>  if(temp>0x31)</p><p><b>  temp=1;</b></p><p><b>  break;</b></p><p><b>  case 6:</b></p><p>  temp=Read13

118、02(DS1302_MONTH);//讀取月數(shù)</p><p>  temp=temp+1; //月數(shù)加1</p><p>  up_flag=1;</p><p>  if(temp>0x12)</p><p><b>  temp=1;</b></p><p><b>  b

119、reak;</b></p><p><b>  case 7:</b></p><p>  temp=Read1302(DS1302_YEAR); //讀取年數(shù)</p><p>  temp=temp+1; //年數(shù)加1</p><p>  up_flag=1;</p><p> 

120、 if(temp>0x85)</p><p><b>  temp=0;</b></p><p><b>  break;</b></p><p>  default:break;</p><p><b>  }</b></p><p>  whi

121、le(Up==0);</p><p>  while(wireless_2==1);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void Downkey()//降序按鍵</p><p><b>  {

122、 </b></p><p><b>  Down=1;</b></p><p>  if(Down==0||wireless_3==1)</p><p><b>  {</b></p><p>  mdelay(8);</p><p>  switch(count

123、)</p><p><b>  {case 1:</b></p><p>  temp=Read1302(DS1302_SECOND);//讀取秒數(shù)</p><p>  temp=temp-1;//秒數(shù)減1</p><p>  down_flag=1; //數(shù)據(jù)調(diào)整后更新標(biāo)志</p>

124、<p>  if(temp==0x7f) //小于0秒,返回59秒</p><p>  temp=0x59;</p><p><b>  break;</b></p><p><b>  case 2:</b></p><p>  temp=Read1302(DS1302_MINU

125、TE);//讀取分?jǐn)?shù)</p><p>  temp=temp-1; //分?jǐn)?shù)減1</p><p>  down_flag=1;</p><p>  if(temp==-1)</p><p>  temp=0x59; //小于0秒,返回59秒</p><p><b>  break;</b&g

126、t;</p><p><b>  case 3:</b></p><p>  temp=Read1302(DS1302_HOUR);//讀取小時(shí)數(shù)</p><p>  temp=temp-1; //小時(shí)數(shù)減1</p><p>  down_flag=1;</p><p>  if(temp==-

127、1)</p><p>  temp=0x23;</p><p><b>  break;</b></p><p><b>  case 4:</b></p><p>  temp=Read1302(DS1302_WEEK);//讀取星期數(shù)</p><p>  temp=tem

128、p-1; //星期數(shù)減1</p><p>  down_flag=1;</p><p>  if(temp==0)</p><p>  temp=0x7;;</p><p><b>  break;</b></p><p><b>  case 5:</b></p&g

129、t;<p>  temp=Read1302(DS1302_DAY); //讀取日數(shù)</p><p>  temp=temp-1; //日數(shù)減1</p><p>  down_flag=1;</p><p>  if(temp==0)</p><p><b>  temp=31;</b></p>

130、;<p><b>  break;</b></p><p><b>  case 6:</b></p><p>  temp=Read1302(DS1302_MONTH); //讀取月數(shù)</p><p>  temp=temp-1; //月數(shù)減1</p><p>  down_fla

131、g=1;</p><p>  if(temp==0)</p><p><b>  temp=12;</b></p><p><b>  break;</b></p><p><b>  case 7:</b></p><p>  temp=Read130

132、2(DS1302_YEAR); //讀取年數(shù)</p><p>  temp=temp-1; //年數(shù)減1</p><p>  down_flag=1;</p><p>  if(temp==-1)</p><p>  temp=0x85;</p><p><b>  break;</b><

133、;/p><p>  default:break;</p><p><b>  }</b></p><p>  while(Down==0);</p><p>  while(wireless_3==1);</p><p><b>  }</b></p><p&

134、gt;<b>  }</b></p><p>  void Setkey()//模式選擇按鍵</p><p><b>  {</b></p><p><b>  Set=1;</b></p><p>  if(Set==0||wireless_4==1)</p>

135、<p><b>  {</b></p><p>  mdelay(8);</p><p>  count=count+1; //Setkey按一次,count就加1</p><p>  done=1; //進(jìn)入調(diào)整模式</p><p>  while(Set==0);</p><p&

136、gt;  while(wireless_4==1);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void keydone()//按鍵功能執(zhí)行</p><p>  { uchar Second;</p><p&

137、gt;  if(flag==0) //關(guān)閉時(shí)鐘,停止計(jì)時(shí)</p><p>  { Write1302(0x8e,0x00); //寫入允許</p><p>  temp=Read1302(0x80);</p><p>  Write1302(0x80,temp|0x80);</p><p>  Write1302(0x8e,0x80);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論