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

下載本文檔

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

文檔簡介

1、<p>  《單片機原理及接口》</p><p><b>  課程設(shè)計報告</b></p><p>  題 目: 智能散熱系統(tǒng) </p><p>  專業(yè)名稱: 通信工程 </p><p>  班 級:

2、 </p><p>  學(xué) 號: </p><p>  姓 名: </p><p>  2015年 12月</p><p><b>  散熱系統(tǒng)</b></p><p>

3、;<b>  信息工程學(xué)院</b></p><p>  摘要:由于單片機體積小、成本低、使用方便,所以被廣泛地應(yīng)用于儀器儀表、現(xiàn)場數(shù)據(jù)的采集和控制。通過本次課程設(shè)計掌握單片機硬件和軟件方面的知識,更深入的了解單片機的實際應(yīng)用。</p><p>  關(guān)鍵詞:單片機,程序,DS18B20溫度傳感器,LCD1602液晶顯示屏,定時器,直流電機等等</p>&l

4、t;p>  1課程設(shè)計的基本內(nèi)容</p><p>  為實現(xiàn)系統(tǒng)能采集當前環(huán)境溫度,當溫度達到一定值時觸發(fā)直流風(fēng)扇的轉(zhuǎn)動進行主動散熱,并且隨著溫度的變化而改變風(fēng)力大小,風(fēng)力與溫度成正比,本系統(tǒng)設(shè)置了三個檔來控制風(fēng)力的大小,20C°--22C°為一檔,22C°--24C°為二檔,24C°--26C°為三檔(為了演示方便而設(shè)計的三檔,在實際用途中可依據(jù)

5、要求來設(shè)置)。本智能散熱系統(tǒng)根據(jù)環(huán)境溫度智能調(diào)控風(fēng)力的功能可以放置在一些硬件中以達到降溫的功能。</p><p><b>  2 方案論證</b></p><p>  2.1 設(shè)計原理及方案選擇</p><p>  通過DS18B20溫度傳感器來采集當前環(huán)境的溫度,通過LCD1602液晶顯示屏來顯示溫度以及工作時間,CPU根據(jù)當前溫度來控制電

6、機的速度。</p><p>  2.2 硬件電路設(shè)計及原理說明</p><p>  使用P1.1口來連接電機,P0口連接LCD1602,P2.5口為讀/寫選擇端,P2.6為命令/數(shù)據(jù)選擇端,P2.7為使能端,P3.7口為數(shù)據(jù)總線,P3.4口為定時器0,P3.5為定時器1.</p><p>  圖為DS18B20原理圖</p><p>  圖

7、為LCD1602原理圖 </p><p>  圖為外部電路接線圖 </p><p><b>  3 設(shè)計過程論述</b></p><p>  3.1 DS18B20溫度傳感器</p><p>  DS18b20采用單總線的結(jié)構(gòu),單總線的特點就是只有一根數(shù)據(jù)線,系統(tǒng)中的數(shù)據(jù)交換都由這根線進行。</p>&l

8、t;p>  DS18B20的一線工作協(xié)議流程是:</p><p>  初始化→ROM操作指令→存儲器操作指令→數(shù)據(jù)傳輸。</p><p><b>  其工作時序包括:</b></p><p><b>  1、初始化時序</b></p><p><b>  2、寫時序</b>

9、;</p><p><b>  3、讀時序</b></p><p>  DS18B20的初始化</p><p>  主機首先發(fā)出一個480-960微秒的低電平脈沖,然后釋放總線變?yōu)楦唠娖?,并在隨后的480微秒時間內(nèi)對總線進行檢測,如果有低電平出現(xiàn)說明總線上有器件已做出應(yīng)答。若無低電平出現(xiàn)一直都是高電平說明總線上無器件應(yīng)答?! ∽鰹閺钠骷腄S

10、18B20在一上電后就一直在檢測總線上是否有480-960微秒的低電平出現(xiàn),如果有,在總線轉(zhuǎn)為高電平后等待15-60微秒后將總線電平拉低60-240微秒做出響應(yīng)存在脈沖,告訴主機本器件已做好準備。若沒有檢測到就一直在檢測等待</p><p><b>  初始化時序圖</b></p><p><b>  初始化程序</b></p>&

11、lt;p>  unsigned char Ds18b20Init()</p><p><b>  {</b></p><p>  unsigned int i;</p><p>  DSIO=0; //將總線拉低480us~960us</p><p><b>  i=70;</b>&l

12、t;/p><p>  while(i--);//延時642us</p><p>  DSIO=1;//然后拉高總線,若DS18B20做出反應(yīng)會將在15us~60us后將總線拉低</p><p><b>  i=0;</b></p><p>  while(DSIO)//等待DS18B20拉低總線</p>&l

13、t;p><b>  {</b></p><p><b>  i++;</b></p><p>  if(i>50000)//等待>50MS</p><p>  return 0;//初始化失敗</p><p><b>  }</b></p>&

14、lt;p>  return 1;//初始化成功</p><p><b>  }</b></p><p>  主機發(fā)出各種操作命令都是向DS18B20寫0和寫1組成的命令字節(jié),接收數(shù)據(jù)時也是從DS18B20讀取0或1的過程。</p><p>  寫周期最少為60微秒,最長不超過120微秒。寫周期一開始做為主機先把總線拉低1微秒表示寫周期開始

15、。隨后若主機想寫0,則將總線置為低電平,若主機想寫1,則將總線置為高電平,持續(xù)時間最少60微秒直至寫周期結(jié)束,然后釋放總線為高電平至少1微秒給總線恢復(fù) 。而DS18B20則在檢測到總線被拉底后等待15微秒然后從15us到45us開始對總線采樣,在采樣期內(nèi)總線為高電平則為1,若采樣期內(nèi)總線為低電平則為0。</p><p><b>  寫操作時序圖</b></p><p>

16、;  向DS18B20寫入一個字節(jié)</p><p>  void Ds18b20WriteByte(unsigned char dat)</p><p><b>  {</b></p><p>  unsigned int i,j;</p><p>  for(j=0;j<8;j++)</p><

17、;p><b>  {</b></p><p>  DSIO=0;//每寫入一位數(shù)據(jù)之前先把總線拉低1us</p><p><b>  i++;</b></p><p>  DSIO=dat&0x01; //然后寫入一個數(shù)據(jù),從最低位開始</p><p><b>  i=

18、6;</b></p><p>  while(i--); //延時68us,持續(xù)時間最少60us</p><p>  DSIO=1;//然后釋放總線,至少1us給總線恢復(fù)時間才能接著寫入第二個數(shù)值</p><p><b>  dat>>=1;</b></p><p><b>  }&l

19、t;/b></p><p><b>  }</b></p><p>  讀周期是從主機把單總線拉低1微秒之后就得釋放單總線為高電平,以讓DS18B20把數(shù)據(jù)傳輸?shù)絾慰偩€上。作為從機DS18B20在檢測到總線被拉低1微秒后,便開始送出數(shù)據(jù),若是要送出0就把總線拉為低電平直到讀周期結(jié)束。若要送出1則釋放總線為高電平。主機在一開始拉低總線1微秒后釋放總線,然后在包括前

20、面的拉低總線電平1微秒在內(nèi)的15微秒時間內(nèi)完成對總線進行采樣檢測,采樣期內(nèi)總線為低電平則確認為0。采樣期內(nèi)總線為高電平則確認為1。完成一個讀時序過程,至少需要60微秒才能完成</p><p><b>  讀操作時序圖</b></p><p><b>  讀取一個字節(jié)</b></p><p>  unsigned char

21、Ds18b20ReadByte()</p><p><b>  {</b></p><p>  unsigned char byte,bi;</p><p>  unsigned int i,j;</p><p>  for(j=8;j>0;j--)</p><p><b>  

22、{</b></p><p>  DSIO=0;//先將總線拉低1us</p><p><b>  i++;</b></p><p>  DSIO=1;//然后釋放總線</p><p><b>  i++;</b></p><p>  i++;//延時6us等待數(shù)據(jù)

23、穩(wěn)定</p><p>  bi=DSIO; //讀取數(shù)據(jù),從最高位開始讀取</p><p>  byte=(byte>>1)|(bi<<7); /*將byte右移一位,然后或上左移7位后的bi,注意移動之后移掉那位補0。*/</p><p>  i=4;//讀取完之后等待48us再接著讀取下一個數(shù)</p><p>

24、;  while(i--);</p><p><b>  }</b></p><p>  return byte;</p><p><b>  }</b></p><p>  DS18B20 內(nèi)部結(jié)構(gòu)主要由四部分組成: 64 位光刻 ROM 、溫度傳感器、非揮發(fā)的溫度報警觸發(fā)器 TH 和 T

25、L 、配置寄存器。</p><p>  光刻 ROM 中的 64 位序列號是出廠前被光刻好的,它可以看作是該 DS18B20 的地址序列碼。 64 位光刻 ROM 的排列是:開始 8 位(地址: 28H )是產(chǎn)品類型標號,接著的 48 位是該 DS18B20 自身的序列號,并且每個 DS18B20 的序列號都不相同,因此它可以看作是該 DS18B20 的地址序列碼;最后 8 位則是前面 56 位的循環(huán)冗余校驗碼(

26、 CRC=X8+X5+X4+1 )。由于每一個 DS18B20 的 ROM 數(shù)據(jù)都各不相同,因此微控制器就可以通過單總線對多個 DS18B20 進行尋址,從而實現(xiàn)一根總線上掛接多個 DS18B20 的目的。</p><p>  DS18B20的存儲器由一個高速暫存RAM和一個非易失性、電可擦除(E2)RAM組成。</p><p>  DS18B20經(jīng)轉(zhuǎn)換所得的溫度值以二字節(jié)補碼形式存放在高

27、速暫存存儲器的第0和第1個字節(jié)。所以當我們只想簡單的讀取溫度值的時候,只用讀取暫存器中的第0和第1個字節(jié)就可以了。</p><p>  簡單的讀取溫度值的步驟如下:</p><p><b>  1、跳過ROM操作</b></p><p>  2、發(fā)送溫度轉(zhuǎn)換命令</p><p><b>  3、跳過ROM操作&

28、lt;/b></p><p>  4、發(fā)送讀取溫度命令</p><p><b>  5、讀取溫度值</b></p><p><b>  開始轉(zhuǎn)換溫度</b></p><p>  void Ds18b20ChangTemp()</p><p><b>  {&

29、lt;/b></p><p>  Ds18b20Init();</p><p>  Delay1ms(1);</p><p>  Ds18b20WriteByte(0xcc);//跳過ROM操作命令 </p><p>  Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令</p><p>

30、;  Delay1ms(100);</p><p><b>  }</b></p><p><b>  發(fā)送讀取溫度命令</b></p><p>  void Ds18b20ReadTempCom()</p><p><b>  {</b></p><p

31、>  Ds18b20Init();</p><p>  Delay1ms(1);</p><p>  Ds18b20WriteByte(0xcc); //跳過ROM操作命令</p><p>  Ds18b20WriteByte(0xbe); //發(fā)送讀取溫度命令</p><p><b>  }</b></

32、p><p><b>  讀取溫度</b></p><p>  int Ds18b20ReadTemp()</p><p><b>  {</b></p><p>  unsigned int temp=0;</p><p>  unsigned char tmh,tml;<

33、/p><p>  Ds18b20ChangTemp();//先寫入轉(zhuǎn)換命令</p><p>  Ds18b20ReadTempCom();//然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令</p><p>  tml=Ds18b20ReadByte();//讀取溫度值共16位,先讀低字節(jié)</p><p>  tmh=Ds18b20ReadByte();/

34、/再讀高字節(jié)</p><p><b>  temp=tmh;</b></p><p><b>  temp<<=8;</b></p><p>  temp|=tml;</p><p>  return temp;</p><p>  }3.2 LCD1602液晶

35、顯示屏</p><p>  LCD1602的引腳</p><p><b>  操作步驟:</b></p><p><b>  1、初始化</b></p><p>  2、寫命令(RS=L)設(shè)置顯示坐標</p><p>  3、寫數(shù)據(jù)(RS=H)</p><

36、p><b>  寫入一個字節(jié)命令</b></p><p>  void LcdWriteCom(unsigned char com) //寫入命令</p><p><b>  {</b></p><p><b>  RS=0;</b></p><p><b>

37、;  RW=0;</b></p><p>  GPIO_LCD=com;</p><p>  Delay1ms(10);</p><p><b>  LCDE=1;</b></p><p>  Delay1ms(10);</p><p><b>  LCDE=0;</b

38、></p><p><b>  }</b></p><p><b>  寫入一個字節(jié)數(shù)據(jù)</b></p><p>  void LcdWriteData(unsigned char dat)//寫入數(shù)據(jù)</p><p><b>  {</b></p>

39、<p><b>  RS=1;</b></p><p><b>  RW=0;</b></p><p>  GPIO_LCD=dat;</p><p>  Delay1ms(10);</p><p><b>  LCDE=1;</b></p><p

40、>  Delay1ms(10);</p><p><b>  LCDE=0;</b></p><p><b>  }</b></p><p><b>  初始化</b></p><p>  void LcdInit() //LCD初始化子程序</p>&l

41、t;p><b>  {</b></p><p>  LcdWriteCom(0x38); //設(shè)置顯示模式</p><p>  LcdWriteCom(0x0c); //開顯示不顯示光標,光標不閃爍</p><p>  LcdWriteCom(0x06); //寫一個指針加1</p><p>  LcdWri

42、teCom(0x01); //清屏</p><p>  LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點</p><p><b>  }</b></p><p><b>  1602的指令碼</b></p><p><b>  DL:</b></p>

43、<p>  0時:選擇4位數(shù)據(jù)總線模式。</p><p>  1時:選擇8位數(shù)據(jù)總線模式。</p><p><b>  N:</b></p><p>  0時:選擇顯示一行。</p><p>  1時:選擇顯示兩行。</p><p>  F:0選擇5*7模式,1選擇5*10模式。一般只

44、有5*7模式。</p><p>  顯示開/關(guān)及按鍵顯示</p><p><b>  RAM地址映射圖</b></p><p>  3.3編程調(diào)試過程出現(xiàn)的問題</p><p>  當控制電機速度的程序放在定時器1的中斷中則會導(dǎo)致液晶顯示屏出現(xiàn)閃爍,這是因為每中斷一次就進入中斷程序,則讀取溫度的程序就沒有運行,所欲顯示就

45、會出錯,而當控制電機的程序放在主程序中,則電機的速度則無法控制,只有轉(zhuǎn)或不轉(zhuǎn)。這個問題無法突破就無法實現(xiàn)調(diào)節(jié)風(fēng)力大小以及正確顯示溫度的功能,嘗試了多種辦法后發(fā)現(xiàn)在讀取溫度的時候先將定時器關(guān)閉,讀取溫度結(jié)束后就開啟定時器。</p><p><b>  4、程序清單</b></p><p>  #include<reg51.h></p><

46、p>  void Time1Config();</p><p>  /*相關(guān)字符的重定義*/</p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  #define LCD1602_DATAPINS P0</p>

47、<p>  sbit LCD1602_E=P2^7; //定義P2.7口為使能端</p><p>  sbit LCD1602_RW=P2^5; //定義P2.5口為讀/寫選擇端(H/L)</p><p>  sbit LCD1602_RS=P2^6; //定義P2.6口為數(shù)據(jù)/命令選擇端(H/L)</p><p>  sbit DSPOR

48、T=P3^7; //定義P3.7口為總線</p><p>  sbit PWM=P1^1; //定義P1.1為電機電壓輸出端</p><p>  /*定義一些相關(guān)變量*/</p><p>  unsigned char timer1;</p><p><b>  float tp;</b></p&g

49、t;<p>  int temp,speed;</p><p>  unsigned char table[]={'0','1','2','3','4','5','6','7','8','9'};</p><p>  

50、int i1=0,n1=0,j1=0,a1,k1=0,m1=0,flag=0,o1=0,p1=0,z1=0;</p><p>  /*LCD1602延時函數(shù)*/</p><p>  void Lcd1602_Delay1ms(uint c) //誤差 0us</p><p><b>  {</b></p><

51、p>  uchar a,b;</p><p>  for (; c>0; c--)</p><p><b>  {</b></p><p>  for (b=199;b>0;b--)</p><p><b>  {</b></p><p>  for(a=1

52、;a>0;a--);</p><p><b>  } </b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /*向LCD1602寫入一個字節(jié)命令*/</p><p>  void L

53、cdWriteCom(uchar com) //寫入命令</p><p><b>  {</b></p><p>  LCD1602_E = 0; //使能</p><p>  LCD1602_RS = 0; //選擇發(fā)送命令</p><p>  LCD1602_RW = 0; //選擇寫入<

54、;/p><p>  LCD1602_DATAPINS = com; //放入命令</p><p>  Lcd1602_Delay1ms(1);//等待數(shù)據(jù)穩(wěn)定</p><p>  LCD1602_E = 1; //寫入時序</p><p>  Lcd1602_Delay1ms(5); //保持時間</p&

55、gt;<p>  LCD1602_E = 0;</p><p><b>  }</b></p><p>  /*向LCD1602寫入一個字節(jié)數(shù)據(jù)*/ </p><p>  void LcdWriteData(uchar dat)//寫入數(shù)據(jù)</p><p><b>  {&

56、lt;/b></p><p>  LCD1602_E = 0;//使能清零</p><p>  LCD1602_RS = 1;//選擇輸入數(shù)據(jù)</p><p>  LCD1602_RW = 0;//選擇寫入</p><p>  LCD1602_DATAPINS = dat; //寫入數(shù)據(jù)</p><p> 

57、 Lcd1602_Delay1ms(1);</p><p>  LCD1602_E = 1; //寫入時序</p><p>  Lcd1602_Delay1ms(5); //保持時間</p><p>  LCD1602_E = 0;</p><p><b>  }</b></p><p>

58、  /*初始化LCD屏*/</p><p>  void LcdInit() //LCD初始化子程序</p><p><b>  {</b></p><p>  LcdWriteCom(0x38); //開顯示</p><p>  LcdWriteCom(0x0c)

59、; //開顯示不顯示光標</p><p>  LcdWriteCom(0x06); //寫一個指針加1</p><p>  LcdWriteCom(0x01); //清屏</p><p>  LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點</p><p><b>  }</b></p>

60、<p>  /*DS18B20的延時函數(shù)*/</p><p>  void Delay1ms(uint y)</p><p><b>  {</b></p><p><b>  uint x;</b></p><p>  for( ; y>0; y--)</p><

61、;p><b>  {</b></p><p>  for(x=110; x>0; x--);</p><p><b>  }</b></p><p><b>  }</b></p><p>  /*DS18B20的初始化*/</p><p>

62、  uchar Ds18b20Init()</p><p><b>  {</b></p><p><b>  uchar i;</b></p><p>  DSPORT = 0; //將總線拉低480us~960us</p><p><b>  i = 70;</b>

63、</p><p>  while(i--);//延時642us</p><p>  DSPORT = 1;//然后拉高總線,如果DS18B20做出反應(yīng)會將在15us~60us后總線拉低</p><p><b>  i = 0;</b></p><p>  while(DSPORT)//等待DS18B20拉低總線&

64、lt;/p><p><b>  {</b></p><p><b>  i++;</b></p><p>  if(i>5)//等待>5MS</p><p><b>  {</b></p><p>  return 0;//初始化失敗</p

65、><p><b>  }</b></p><p>  Delay1ms(1);</p><p><b>  }</b></p><p>  return 1;//初始化成功</p><p><b>  }</b></p><p> 

66、 /*向DS18B20寫入一個字節(jié)*/</p><p>  void Ds18b20WriteByte(uchar dat)</p><p><b>  {</b></p><p>  uint i, j;</p><p>  for(j=0; j<8; j++)</p><p><b

67、>  {</b></p><p>  DSPORT = 0; //每寫入一位數(shù)據(jù)之前先把總線拉低1us</p><p><b>  i++;</b></p><p>  DSPORT = dat & 0x01; //然后寫入一個數(shù)據(jù),從最低位開始</p><p><b&g

68、t;  i=6;</b></p><p>  while(i--); //延時68us,持續(xù)時間最少60us</p><p>  DSPORT = 1;//然后釋放總線,至少1us給總線恢復(fù)時間才能接著寫入第二個數(shù)值</p><p>  dat >>= 1;</p><p><b>  }</b>

69、;</p><p><b>  }</b></p><p>  /*讀取一個字節(jié)*/</p><p>  uchar Ds18b20ReadByte()</p><p><b>  {</b></p><p>  uchar byte, bi;</p><

70、p>  uint i, j;</p><p>  for(j=8; j>0; j--)</p><p><b>  {</b></p><p>  DSPORT = 0;//先將總線拉低1us</p><p><b>  i++;</b></p><p>  D

71、SPORT = 1;//然后釋放總線</p><p><b>  i++;</b></p><p>  i++;//延時6us等待數(shù)據(jù)穩(wěn)定</p><p>  bi = DSPORT; //讀取數(shù)據(jù),從最高位開始讀取</p><p>  /*將byte右移一位,然后與上左移7位后的bi,注意移動之后移掉那位補0。*/&

72、lt;/p><p>  byte = (byte >> 1) | (bi << 7); </p><p>  i = 4;//讀取完之后等待48us再接著讀取下一個數(shù)</p><p>  while(i--);</p><p><b>  }</b></p>&

73、lt;p>  return byte;</p><p><b>  }</b></p><p>  /*開始轉(zhuǎn)換溫度*/</p><p>  void Ds18b20ChangTemp()</p><p><b>  {</b></p><p>  Ds18b20In

74、it();</p><p>  Delay1ms(1);</p><p>  Ds18b20WriteByte(0xcc);//跳過ROM操作命令 </p><p>  Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令</p><p>  //Delay1ms(100);//等待轉(zhuǎn)換成功,而如果你是一直刷著的

75、話,就不用這個延時了</p><p><b>  }</b></p><p>  /*發(fā)送讀取溫度命令*/</p><p>  void Ds18b20ReadTempCom()</p><p><b>  {</b></p><p>  Ds18b20Init();&l

76、t;/p><p>  Delay1ms(1);</p><p>  Ds18b20WriteByte(0xcc); //跳過ROM操作命令</p><p>  Ds18b20WriteByte(0xbe); //發(fā)送讀取溫度命令</p><p><b>  }</b></p><p><b&

77、gt;  /*讀取溫度*/</b></p><p>  int Ds18b20ReadTemp()</p><p><b>  {</b></p><p>  int temp = 0;</p><p>  uchar tmh, tml;</p><p><b>  TR1=

78、0;</b></p><p>  Ds18b20ChangTemp(); //先寫入轉(zhuǎn)換命令</p><p>  Ds18b20ReadTempCom();//然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令</p><p>  tml = Ds18b20ReadByte();//讀取溫度值共16位,先讀低字節(jié)</p><p>

79、  tmh = Ds18b20ReadByte();//再讀高字節(jié)</p><p>  temp = tmh;</p><p>  temp <<= 8;</p><p>  temp |= tml;</p><p><b>  TR1=1;</b></p><p>  retur

80、n temp;</p><p><b>  }</b></p><p>  /*定時器1的中斷函數(shù)*/</p><p>  void Time1(void) interrupt 3 </p><p><b>  {</b></p><p>  TH1 = 0xfe;

81、</p><p>  TL1 = 0x0c;</p><p><b>  timer1++;</b></p><p>  if(timer1>100) //PWM周期為100*0.5ms</p><p>  timer1=0; </p><p>  if(ti

82、mer1 < speed)//直流電機的速度與speed的變化成正比</p><p><b>  PWM=1;</b></p><p><b>  else</b></p><p><b>  PWM=0;</b></p><p><b>  } &l

83、t;/b></p><p>  /*設(shè)置定時器1*/</p><p>  void Time1Config()</p><p><b>  {</b></p><p>  TMOD|= 0x10; //設(shè)置定時計數(shù)器工作方式1為定時器</p><p>  //--定時器賦初始值,12MH

84、Z下定時0.5ms--// </p><p>  TH1 = 0xfe; </p><p>  TL1 = 0x0c;</p><p>  ET1 = 1; //開啟定時器1中斷</p><p><b>  EA = 1;</b></p><p>  TR1 = 1; //開啟定時器&l

85、t;/p><p><b>  }</b></p><p>  /*LCD顯示讀取到的溫度*/</p><p>  void LcdDisplay(int temp) //lcd顯示</p><p><b>  {</b></p><p>  unsigned char dat

86、as[] = {0, 0, 0, 0, 0}; //定義數(shù)組 </p><p>  if(temp< 0)//當溫度值為負數(shù)</p><p><b>  {</b></p><p>  LcdWriteCom(0xC1);//寫地址 80表示初始地址</p><p>  LcdWriteData(&#

87、39;-'); //顯示負</p><p>  //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼</p><p>  temp=temp-1;</p><p>  temp=~temp;</p><p><b>  tp=temp;</b></p><p>  temp=

88、tp*0.0625*100+0.5;</p><p>  //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點</p><p>  //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就</p><p>  //算由?.5,還是在小數(shù)點后面。</p><p><

89、;b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  LcdWriteCom(0xC6);//寫地址 80表示初始地址</p><p>  LcdWriteData('+');

90、//顯示正</p><p>  tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量</p><p>  //如果溫度是正的那么,那么正數(shù)的原碼就是補碼它本身</p><p>  temp=tp*0.0625*100+0.5;</p><p>  if(temp>=2000 && temp<=220

91、0)</p><p><b>  speed=30;</b></p><p>  else if(temp>=2200 && temp<=2400)</p><p><b>  speed=50;</b></p><p>  else if(temp>2400)&l

92、t;/p><p><b>  speed=70;</b></p><p><b>  else</b></p><p><b>  speed=0;</b></p><p>  //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點</p&g

93、t;<p>  //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就</p><p>  //算加上0.5,還是在小數(shù)點后面。</p><p><b>  }</b></p><p>  datas[0] = temp / 10000;</p><p>  data

94、s[1] = temp % 10000 / 1000;</p><p>  datas[2] = temp % 1000 / 100;</p><p>  datas[3] = temp % 100 / 10;</p><p>  datas[4] = temp % 10;</p><p>  LcdWriteCom(0xC8); &l

95、t;/p><p>  LcdWriteData('0'+datas[0]); </p><p>  LcdWriteCom(0xC9); </p><p>  LcdWriteData('0'+datas[1]); </p><p>  LcdWriteCom(0xCa);</p><

96、p>  LcdWriteData('0'+datas[2]); </p><p>  LcdWriteCom(0xCb);</p><p>  LcdWriteData('.'); </p><p>  LcdWriteCom(0xCc); </p><p>  LcdWriteData(&

97、#39;0'+datas[3]); </p><p>  LcdWriteCom(0xCd); </p><p>  LcdWriteData('0'+datas[4]);</p><p>  LcdWriteCom(0xC0); //寫地址 80表示初始地址</p><p>  LcdWriteData(

98、't');</p><p>  LcdWriteCom(0xC1); //寫地址 80表示初始地址</p><p>  LcdWriteData('e');</p><p>  LcdWriteCom(0xC2); //寫地址 80表示初始地址</p><p>  LcdWriteData('m

99、');</p><p>  LcdWriteCom(0xC3); //寫地址 80表示初始地址</p><p>  LcdWriteData('p');</p><p>  LcdWriteCom(0xC4); //寫地址 80表示初始地址</p><p>  LcdWriteData(':')

100、;</p><p><b>  }</b></p><p>  /*lCD上一行顯示時間*/</p><p>  void Lcddisplay()</p><p><b>  {</b></p><p>  LcdWriteCom(0x8f); </p>

101、<p>  LcdWriteData(table[i1]); </p><p>  LcdWriteCom(0x8e); </p><p>  LcdWriteData(table[j1]); </p><p>  LcdWriteCom(0x8d); </p><p>  LcdWriteData(':'

102、;); </p><p>  LcdWriteCom(0x8c); </p><p>  LcdWriteData(table[k1]);</p><p>  LcdWriteCom(0x8b); </p><p>  LcdWriteData(table[m1]); </p><p>  LcdWriteCo

103、m(0x8a);</p><p>  LcdWriteData(':'); </p><p>  LcdWriteCom(0x89); </p><p>  LcdWriteData(table[o1]); </p><p>  LcdWriteCom(0x88); </p><p>  L

104、cdWriteData(table[p1]); </p><p>  LcdWriteCom(0x87); </p><p>  LcdWriteData(':');</p><p>  LcdWriteCom(0x86); </p><p>  LcdWriteData(table[z1]);</p>

105、<p>  LcdWriteCom(0x85); </p><p>  LcdWriteData('D');</p><p>  LcdWriteCom(0x80); </p><p>  LcdWriteData('t'); </p><p>  LcdWriteCom(0x81); &

106、lt;/p><p>  LcdWriteData('i'); </p><p>  LcdWriteCom(0x82); </p><p>  LcdWriteData('m'); </p><p>  LcdWriteCom(0x83); </p><p>  LcdWriteDa

107、ta('e'); </p><p>  LcdWriteCom(0x84);</p><p>  LcdWriteData(':');</p><p><b>  }</b></p><p>  /*定時器0的中斷程序*/</p><p>  void mb()

108、interrupt 1</p><p><b>  { </b></p><p>  TH0=a1/256;</p><p>  TL0=a1%256; //中斷頻率為50ms</p><p><b>  n1++; </b></p><p>  if(n1==20)

109、 //當n1=20的時候則為1s</p><p><b>  {</b></p><p>  n1=0; //重新讓n1=0</p><p><b>  i1++;</b></p><p>  if(i1==10)// 當秒的個位為10時則十位進一,個位變?yōu)?</p><

110、p><b>  {</b></p><p><b>  j1++;</b></p><p><b>  i1=0;</b></p><p><b>  }</b></p><p>  if(j1==6) //當秒的十位為6時則分的個位進一,秒的

111、十位變?yōu)?</p><p><b>  {</b></p><p><b>  k1++;</b></p><p><b>  j1=0;</b></p><p><b>  }</b></p><p>  if(k1==10)

112、 //當分的個位為10時,分的十位進一,個位變?yōu)?</p><p><b>  {</b></p><p><b>  m1++;</b></p><p><b>  k1=0;</b></p><p><b>  }</b></p><

113、;p>  if(m1==6) //當分的十位為6時,時的個位進一,分的十位變?yōu)?,標志位進一</p><p><b>  {</b></p><p><b>  flag++;</b></p><p><b>  o1++;</b></p><p><b>

114、;  m1=0;</b></p><p><b>  }</b></p><p>  if(flag==24) //當標志位為24時,時的十位變0,時的個位變0,天的個數(shù)加1</p><p><b>  {</b></p><p><b>  o1=0;</b>

115、</p><p><b>  p1=0;</b></p><p><b>  z1++;</b></p><p><b>  }</b></p><p>  if(o1==10) //當時的個位為10時,十位進一,個位變?yōu)?</p><p><b

116、>  {</b></p><p><b>  o1=0;</b></p><p><b>  p1++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>&l

117、t;b>  }</b></p><p>  /*定時器0的設(shè)置*/</p><p>  void Time0Config()</p><p><b>  {</b></p><p>  TMOD=00000001;</p><p>  a1=-50000;</p>

118、<p>  TH0=a1/256;</p><p>  TL0=a1%256;</p><p><b>  EA=1;</b></p><p><b>  ET0=1;</b></p><p><b>  TR0=1;</b></p><p>

119、<b>  }</b></p><p><b>  /*主函數(shù)*/</b></p><p>  void main()</p><p><b>  {</b></p><p>  Time0Config(); //定時器0的初始化</p><p>  

120、Time1Config();//定時器1的初始化</p><p>  LcdInit(); //初始化LCD1602</p><p>  LcdWriteCom(0xCf);</p><p>  LcdWriteData('C'); </p><p><b>  while(1)</b><

121、/p><p><b>  {</b></p><p>  LcdDisplay(Ds18b20ReadTemp()); //顯示溫度</p><p>  Lcddisplay(); //顯示時間</p><p><b>  }</b></p><p><b>  }&

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論