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

下載本文檔

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

文檔簡介

1、<p>  《單片機(jī)原理及接口》</p><p><b>  課程設(shè)計(jì)報(bào)告</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>  摘要:由于單片機(jī)體積小、成本低、使用方便,所以被廣泛地應(yīng)用于儀器儀表、現(xiàn)場數(shù)據(jù)的采集和控制。通過本次課程設(shè)計(jì)掌握單片機(jī)硬件和軟件方面的知識,更深入的了解單片機(jī)的實(shí)際應(yīng)用。</p><p>  關(guān)鍵詞:單片機(jī),程序,DS18B20溫度傳感器,LCD1602液晶顯示屏,定時(shí)器,直流電機(jī)等等</p>&l

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

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

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

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

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

9、;</p><p><b>  3、讀時(shí)序</b></p><p>  DS18B20的初始化</p><p>  主機(jī)首先發(fā)出一個(gè)480-960微秒的低電平脈沖,然后釋放總線變?yōu)楦唠娖剑⒃陔S后的480微秒時(shí)間內(nèi)對總線進(jìn)行檢測,如果有低電平出現(xiàn)說明總線上有器件已做出應(yīng)答。若無低電平出現(xiàn)一直都是高電平說明總線上無器件應(yīng)答。  做為從器件的DS

10、18B20在一上電后就一直在檢測總線上是否有480-960微秒的低電平出現(xiàn),如果有,在總線轉(zhuǎn)為高電平后等待15-60微秒后將總線電平拉低60-240微秒做出響應(yīng)存在脈沖,告訴主機(jī)本器件已做好準(zhǔn)備。若沒有檢測到就一直在檢測等待</p><p><b>  初始化時(shí)序圖</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--);//延時(shí)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>  主機(jī)發(fā)出各種操作命令都是向DS18B20寫0和寫1組成的命令字節(jié),接收數(shù)據(jù)時(shí)也是從DS18B20讀取0或1的過程。</p><p>  寫周期最少為60微秒,最長不超過120微秒。寫周期一開始做為主機(jī)先把總線拉低1微秒表示寫周期開始

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

16、;  向DS18B20寫入一個(gè)字節(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; //然后寫入一個(gè)數(shù)據(jù),從最低位開始</p><p><b>  i=

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

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

20、面的拉低總線電平1微秒在內(nèi)的15微秒時(shí)間內(nèi)完成對總線進(jìn)行采樣檢測,采樣期內(nèi)總線為低電平則確認(rèn)為0。采樣期內(nèi)總線為高電平則確認(rèn)為1。完成一個(gè)讀時(shí)序過程,至少需要60微秒才能完成</p><p><b>  讀操作時(shí)序圖</b></p><p><b>  讀取一個(gè)字節(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++;//延時(shí)6us等待數(shù)據(jù)

23、穩(wěn)定</p><p>  bi=DSIO; //讀取數(shù)據(jù),從最高位開始讀取</p><p>  byte=(byte>>1)|(bi<<7); /*將byte右移一位,然后或上左移7位后的bi,注意移動之后移掉那位補(bǔ)0。*/</p><p>  i=4;//讀取完之后等待48us再接著讀取下一個(gè)數(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ā)的溫度報(bào)警觸發(fā)器 TH 和 T

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

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

27、速暫存存儲器的第0和第1個(gè)字節(jié)。所以當(dāng)我們只想簡單的讀取溫度值的時(shí)候,只用讀取暫存器中的第0和第1個(gè)字節(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è)置顯示坐標(biāo)</p><p>  3、寫數(shù)據(jù)(RS=H)</p><

36、p><b>  寫入一個(gè)字節(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>  寫入一個(gè)字節(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); //開顯示不顯示光標(biāo),光標(biāo)不閃爍</p><p>  LcdWriteCom(0x06); //寫一個(gè)指針加1</p><p>  LcdWri

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

43、<p>  0時(shí):選擇4位數(shù)據(jù)總線模式。</p><p>  1時(shí):選擇8位數(shù)據(jù)總線模式。</p><p><b>  N:</b></p><p>  0時(shí):選擇顯示一行。</p><p>  1時(shí):選擇顯示兩行。</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>  當(dāng)控制電機(jī)速度的程序放在定時(shí)器1的中斷中則會導(dǎo)致液晶顯示屏出現(xiàn)閃爍,這是因?yàn)槊恐袛嘁淮尉瓦M(jìn)入中斷程序,則讀取溫度的程序就沒有運(yùn)行,所欲顯示就

45、會出錯,而當(dāng)控制電機(jī)的程序放在主程序中,則電機(jī)的速度則無法控制,只有轉(zhuǎn)或不轉(zhuǎn)。這個(gè)問題無法突破就無法實(shí)現(xiàn)調(diào)節(jié)風(fēng)力大小以及正確顯示溫度的功能,嘗試了多種辦法后發(fā)現(xiàn)在讀取溫度的時(shí)候先將定時(shí)器關(guān)閉,讀取溫度結(jié)束后就開啟定時(shí)器。</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為電機(jī)電壓輸出端</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í)函數(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寫入一個(gè)字節(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; //寫入時(shí)序</p><p>  Lcd1602_Delay1ms(5); //保持時(shí)間</p&

55、gt;<p>  LCD1602_E = 0;</p><p><b>  }</b></p><p>  /*向LCD1602寫入一個(gè)字節(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; //寫入時(shí)序</p><p>  Lcd1602_Delay1ms(5); //保持時(shí)間</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、; //開顯示不顯示光標(biāo)</p><p>  LcdWriteCom(0x06); //寫一個(gè)指針加1</p><p>  LcdWriteCom(0x01); //清屏</p><p>  LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn)</p><p><b>  }</b></p>

60、<p>  /*DS18B20的延時(shí)函數(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--);//延時(shí)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寫入一個(gè)字節(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; //然后寫入一個(gè)數(shù)據(jù),從最低位開始</p><p><b&g

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

69、;</p><p><b>  }</b></p><p>  /*讀取一個(gè)字節(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++;//延時(shí)6us等待數(shù)據(jù)穩(wěn)定</p><p>  bi = DSPORT; //讀取數(shù)據(jù),從最高位開始讀取</p><p>  /*將byte右移一位,然后與上左移7位后的bi,注意移動之后移掉那位補(bǔ)0。*/&

72、lt;/p><p>  byte = (byte >> 1) | (bi << 7); </p><p>  i = 4;//讀取完之后等待48us再接著讀取下一個(gè)數(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、話,就不用這個(gè)延時(shí)了</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>  /*定時(shí)器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)//直流電機(jī)的速度與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è)置定時(shí)器1*/</p><p>  void Time1Config()</p><p><b>  {</b></p><p>  TMOD|= 0x10; //設(shè)置定時(shí)計(jì)數(shù)器工作方式1為定時(shí)器</p><p>  //--定時(shí)器賦初始值,12MH

84、Z下定時(shí)0.5ms--// </p><p>  TH1 = 0xfe; </p><p>  TL1 = 0x0c;</p><p>  ET1 = 1; //開啟定時(shí)器1中斷</p><p><b>  EA = 1;</b></p><p>  TR1 = 1; //開啟定時(shí)器&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)//當(dāng)溫度值為負(fù)數(shù)</p><p><b>  {</b></p><p>  LcdWriteCom(0xC1);//寫地址 80表示初始地址</p><p>  LcdWriteData(&#

87、39;-'); //顯示負(fù)</p><p>  //因?yàn)樽x取的溫度是實(shí)際溫度的補(bǔ)碼,所以減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>  //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)</p><p>  //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就</p><p>  //算由?.5,還是在小數(shù)點(diǎn)后面。</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;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量</p><p>  //如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身</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>  //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)</p&g

93、t;<p>  //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就</p><p>  //算加上0.5,還是在小數(shù)點(diǎn)后面。</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上一行顯示時(shí)間*/</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>  /*定時(shí)器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、 //當(dāng)n1=20的時(shí)候則為1s</p><p><b>  {</b></p><p>  n1=0; //重新讓n1=0</p><p><b>  i1++;</b></p><p>  if(i1==10)// 當(dāng)秒的個(gè)位為10時(shí)則十位進(jìn)一,個(gè)位變?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) //當(dāng)秒的十位為6時(shí)則分的個(gè)位進(jìn)一,秒的

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、 //當(dāng)分的個(gè)位為10時(shí),分的十位進(jìn)一,個(gè)位變?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) //當(dāng)分的十位為6時(shí),時(shí)的個(gè)位進(jìn)一,分的十位變?yōu)?,標(biāo)志位進(jìn)一</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) //當(dāng)標(biāo)志位為24時(shí),時(shí)的十位變0,時(shí)的個(gè)位變0,天的個(gè)數(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) //當(dāng)時(shí)的個(gè)位為10時(shí),十位進(jìn)一,個(gè)位變?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>  /*定時(shí)器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(); //定時(shí)器0的初始化</p><p>  

120、Time1Config();//定時(shí)器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(); //顯示時(shí)間</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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論