51單片機(jī)課程設(shè)計--多功能紅外遙控溫度計_第1頁
已閱讀1頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  目錄</b></p><p>  一、設(shè)計任務(wù)與要求3</p><p><b>  1. 任務(wù):3</b></p><p><b>  2. 要求:3</b></p><p><b>  二、開發(fā)板介紹4</b><

2、;/p><p><b>  1、原理圖4</b></p><p>  2、開發(fā)板資源介紹:4</p><p><b>  三、硬件調(diào)試5</b></p><p><b>  1、是否短路5</b></p><p><b>  2、焊接順序

3、5</b></p><p><b>  3、器件功能5</b></p><p><b>  四、任務(wù)設(shè)計6</b></p><p><b>  五、模塊介紹6</b></p><p>  1、18B20的溫度測量6</p><p> 

4、 2、紅外遙控解碼模塊9</p><p>  3、蜂鳴器音樂播放模塊10</p><p>  4、數(shù)碼管定時器模塊11</p><p>  5、1602顯示模塊12</p><p>  六、模塊整合:13</p><p>  七、程序?qū)崿F(xiàn):15</p><p>  一、設(shè)計任務(wù)與要求

5、 </p><p><b>  1. 任務(wù):</b></p><p>  制作并調(diào)試51單片機(jī)學(xué)習(xí)板 </p><p><b>  2. 要求: </b></p><p>  (1) 了解并能識別學(xué)習(xí)板上的各種元器件,會讀元器件標(biāo)示; </p><p> ?。?) 會看電

6、路原理圖;</p><p>  (3) 制作51單片機(jī)學(xué)習(xí)板,并將下發(fā)的單片機(jī)元件焊接為開發(fā)板;</p><p> ?。?) 學(xué)會使用Keil C軟件下載調(diào)試程序;用調(diào)試程序?qū)?1單片機(jī)學(xué)習(xí)板調(diào)試成功。</p><p>  熟練開發(fā)板的功能,并利用已有模塊設(shè)計出相應(yīng)的功能。</p><p><b>  二、開發(fā)板介紹</b&g

7、t;</p><p><b>  1、原理圖</b></p><p>  2、開發(fā)板資源介紹:</p><p><b>  USB 供電</b></p><p>  MAX232 串口通信</p><p>  DS18B20 溫度傳感器</p><p>

8、;<b>  紅外遙控接收模塊</b></p><p>  1602 字符液晶模塊</p><p>  12864 帶字庫液晶模塊</p><p><b>  跑馬燈</b></p><p><b>  四位一體數(shù)碼管</b></p><p><b

9、>  獨立按鍵</b></p><p><b>  蜂鳴器</b></p><p><b>  雙排擴(kuò)展插針</b></p><p><b>  三、硬件調(diào)試 </b></p><p><b>  1、是否短路</b></

10、p><p>  用萬用表檢查P2兩端是短路。電阻為0,則短路,電阻為一適值,電路正常。</p><p><b>  2、焊接順序 </b></p><p>  焊接的順序很重要,按功能劃分的器件進(jìn)行焊接,順序是功能部件的焊接--調(diào)試--另一功能部件的焊接,這樣容易找到問題的所在。   </p>

11、<p><b>  3、器件功能 </b></p><p>  1)檢查原理圖連接是否正確 </p><p>  2)檢查原理圖與PCB圖是否一致 </p><p>  3)檢查原理圖與器件的DATASHEET上引腳是否一致 </p><p>  4)用萬用表檢查是否有虛

12、焊,引腳短路現(xiàn)象 </p><p>  5)查詢器件的DATASHEET,分析一下時序是否一致,同時分析一下命令字是否正確 </p><p>  6)通過示波器對芯片各個引腳進(jìn)行檢查,檢查地址線是否有信號的 </p><p>  7)飛線。用別的的口線進(jìn)行控制,看看能不能對其進(jìn)行正常操作,多試驗,才能找到問題出現(xiàn)在什么地方。 

13、</p><p><b>  四、任務(wù)設(shè)計</b></p><p>  由于開發(fā)板功能有限,所以基本把可以實現(xiàn)的功能都用上了。設(shè)計的功能大體上分為5個模塊:18B20的溫度測量模塊、紅外遙控器的解碼模塊、蜂鳴器音樂播放模塊、數(shù)碼管定時器模塊、1602顯示模塊。另外由于跑馬燈的Port口與1602顯示Port口復(fù)用,且該功能較為簡單,所以并未實現(xiàn)該功能。且12864模塊

14、和1602模塊類似,同為液晶顯示模塊,該功能也未實現(xiàn)。其它模塊功能都已實現(xiàn)。下面將分別介紹各個模塊功能的實現(xiàn)。</p><p><b>  五、模塊介紹</b></p><p>  1、18B20的溫度測量</p><p>  DS18B20是溫度測量器件,有三個引腳,類似于三極管,分別是地線GND、數(shù)據(jù)線I/O、電源線VDD。由于DS18B2

15、0采用的是1-Wire 總線協(xié)議方式,即在一根數(shù)據(jù)線上實現(xiàn)數(shù)據(jù)的雙向傳輸,而對AT89S51單片機(jī)來說,硬件上并不支持單總線協(xié)議,因此,須采用軟件的方法來模擬單總線的協(xié)議時序來完成對DS18B20芯片的訪問。</p><p>  由于DS18B20是在一根I/O 線上讀寫數(shù)據(jù),因此,對讀寫的數(shù)據(jù)位有著嚴(yán)格的時序要求。DS18B20有嚴(yán)格的通信協(xié)議來保證各位數(shù)據(jù)傳輸?shù)恼_性和完整性。該協(xié)議定義了幾種信號的時序:初始

16、化時序、讀時序、寫時序。所有時序都是將主機(jī)作為主設(shè)備,單總線器件作為從設(shè)備。而每一次命令和數(shù)據(jù)的傳輸都是從主機(jī)主動啟動寫時序開始,如果要求單總線器件回送數(shù)據(jù),在進(jìn)行寫命令后,主機(jī)需啟動讀時序完成數(shù)據(jù)接收。數(shù)據(jù)和命令的傳輸都是低位在先。</p><p>  ds18b20時序說明</p><p>  根據(jù)官方數(shù)據(jù)手冊,我們可以對其時序進(jìn)行如下分析:</p><p>&

17、lt;b>  初始化時序:</b></p><p>  上圖是DS18B20初始化時序,從圖中我們可以得知,黑線代表的是主設(shè)備,也就是單片機(jī)被要求的操作,灰線代表的是從設(shè)備,也就是18B20的電平變化。</p><p>  首先由單片機(jī)拉低信號線480us,使它復(fù)位,然后釋放總線15-60us,18b20會拉低總線60-240us,然后它釋放總線。所以初始化成功的一個標(biāo)志

18、就是能否讀到18b20這個先低后高的操作時序。如檢測到,則代表初始化成功。注意,每次讀取都要初始化,否則18b20處于待機(jī)狀態(tài),無法成功讀取。</p><p><b>  寫時序:</b></p><p>  該過程是寫1bit數(shù)據(jù)過程。而該過程又分為寫0和寫1操作。當(dāng)要寫0時序時,單總線要被拉低至少60us,保證18B20在15us到60us之間能正確的采樣到“0”

19、電平。當(dāng)寫1時序時,單總線被拉低后,在15us之內(nèi)就需要釋放單總線,保證18B20在15us到60us之間能正確的采樣到“1”電平。</p><p><b>  讀操作:</b></p><p>  該過程是讀1bit數(shù)據(jù)過程。單總線被單片機(jī)拉低后,需在15us內(nèi)釋放才能保證主設(shè)備可以采樣到18B20傳入的數(shù)據(jù)。在15us到60us之間單片機(jī)采樣到一位數(shù)據(jù),則18B2

20、0完成一個讀時序至少要60us才能完成。</p><p>  完成了最基本的三個時序操作之后,便可以對照著官方數(shù)據(jù)手冊,使用相關(guān)指令,實現(xiàn)自己需要的功能。</p><p>  2、紅外遙控解碼模塊</p><p>  如左圖所示,紅外接收管收三個引腳,一個數(shù)據(jù)口,一個電源和一個地。</p><p>  使用 38kHz載波頻率</p&g

21、t;<p>  頭碼間隔為 9ms + 4.5ms</p><p><b>  使用16位客戶代碼</b></p><p>  使用8位數(shù)據(jù)代碼和8位取反的數(shù)據(jù)代碼</p><p>  數(shù)據(jù)格式包括引導(dǎo)碼、用戶碼、數(shù)據(jù)碼及數(shù)據(jù)碼反碼,編碼一共是32位。紅外遙控信號從引導(dǎo)碼開始,接下來是16位客戶代碼,然后是8位數(shù)據(jù)代碼和取反的二進(jìn)

22、制8位代碼,最后的是1位結(jié)束位。</p><p>  此種編碼方式可以使用MCU的捕獲功能實現(xiàn),通過比較兩次捕獲的時間,來判斷發(fā)射碼,按照如下圖的時序,便能實現(xiàn)紅外解碼。</p><p>  3、蜂鳴器音樂播放模塊</p><p>  蜂鳴器分為無源和有源兩種,這里的“源”不是指電源。而是指震蕩源。也就是說,有源蜂鳴器內(nèi)部帶震蕩源,所以只要一通電就會叫。 而無源內(nèi)

23、部不帶震蕩源,所以如果用直流信號無法令其鳴叫。必須用2K~5K的方波去驅(qū)動它。 有源蜂鳴器往往比無源的貴,就是因為里面多個震蕩電路。 無源蜂鳴器的優(yōu)點是:便宜、聲音頻率可控,可以做出“多來米發(fā)索拉西”的效果、在一些特例中,可以和LED復(fù)用一個控制口。而有源蜂鳴器的優(yōu)點是:程序控制方便。</p><p>  本實驗板中用的是無源蜂鳴器,則可以通過單片機(jī)發(fā)出不同頻率的波來改變聲音的頻率,達(dá)到不同的音調(diào),通過不同音

24、調(diào)的組合,可以實現(xiàn)簡單的音樂播放。</p><p>  本模塊主要是定時器的應(yīng)用,通過計算,配置相應(yīng)的寄存器參數(shù),就可以實現(xiàn)頻率的精準(zhǔn)控制,產(chǎn)生不同評論的方波,然后再用音樂頻率取模軟件,就可以得到一首歌的頻率和時隙的變化。然后再通過單片機(jī)產(chǎn)生相應(yīng)的PWM波,送入如圖所示的Port口,蜂鳴器便可以產(chǎn)生不同的音樂。</p><p>  4、數(shù)碼管定時器模塊</p><p&g

25、t;  該模塊涉及到兩個方面的知識,一個是定時器的精準(zhǔn)控制,另一個是數(shù)碼管的動態(tài)掃描。</p><p>  定時器的精準(zhǔn)控制在上面蜂鳴器中已經(jīng)說了,這里就不再贅述。這里主要講的是動態(tài)掃描,由于本實驗板給的是四位一體數(shù)碼管。未用到鎖存器,就可以直接用單片機(jī)來控制位選,由于數(shù)碼管的每位不能單獨寫數(shù)據(jù),所以必須利用動態(tài)掃描來顯示。動態(tài)掃描的原理主要是利用人眼的視覺暫留,因為不能單獨寫數(shù)據(jù),所以要想讓數(shù)碼管顯示不同的值,

26、必須每位單獨分開顯示,每次只開一個位選,選中一個數(shù)碼管,送入相應(yīng)的數(shù)據(jù),然后開第二個位選端,寫入相應(yīng)位的數(shù)據(jù),然后循環(huán)控制位選,然后利用單片機(jī)調(diào)整切換速率到合適的大小,根據(jù)人眼的視覺暫留,看上去就像是4位數(shù)據(jù)是同時顯示的,這就是數(shù)碼管的動態(tài)顯示原理。</p><p>  然后通過計算,嚴(yán)格控制定時器,然后每秒更改一次數(shù)碼管顯示的值,那么定時器就算是完成了。</p><p>  5、1602

27、顯示模塊</p><p>  中間的Valid Data即有效數(shù)據(jù)區(qū),我們進(jìn)行讀或?qū)?,無非都是想進(jìn)行數(shù)據(jù)的傳送,在時序圖中,  進(jìn)行讀操作的時候,RW置于1,RS則根據(jù)讀的內(nèi)容(狀態(tài)或數(shù)據(jù))置為1或0,經(jīng)過td時間后,可以在數(shù)據(jù)口讀到正確的數(shù)據(jù),由于td的時間極短(ns級),單片機(jī)操作一般是us級,所以可以不考慮這個時間差,在將E置為1之后,接著寫指令去讀取數(shù)據(jù),在讀到數(shù)據(jù)后,再將E

28、置為0,經(jīng)過THD2時間后,數(shù)據(jù)口上的數(shù)據(jù)失效。 </p><p>  在進(jìn)行寫操作的時候,RW要置為0,RS根據(jù)寫的內(nèi)容不同(指令或數(shù)據(jù))置為1或0,同時,在將E置為1之前,要先將數(shù)據(jù)送到數(shù)據(jù)口上,然后,在C位置,將E置為1,經(jīng)過tPW延時后,再將E置為0,在這個時間段內(nèi)必須保證數(shù)據(jù)口上的數(shù)據(jù)穩(wěn)定不變,為有效的數(shù)據(jù)。同理,由于tPW這些延時相對較短(ns級),所以在單片里也不必考慮延時問題。 

29、;</p><p>  基本的讀寫操作實現(xiàn)之后,就可以根據(jù)數(shù)據(jù)手冊,根據(jù)相關(guān)指令,就可以實現(xiàn)相應(yīng)的需要的功能。</p><p><b>  六、模塊整合:</b></p><p><b>  七、程序?qū)崿F(xiàn): </b></p><p>  #include <reg52.h></p&

30、gt;<p>  #include <intrins.h></p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  #define jump_ROM 0xCC</p><p>  #define start

31、 0x44</p><p>  #define read_EEROM 0xBE</p><p>  #define ROW 4</p><p>  uchar idata notQuit = 1;</p><p>  const uchar code table[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x8

32、2,0xf8,0x80,0x90};</p><p>  const uchar code table1[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};</p><p>  const uchar code LED_W[4] = {0xef,0xdf,0xbf,0x7f};</p><p>  u

33、char idata jishi[4] = {0,0,0,0};</p><p>  uint idata jishuqi = 0;</p><p>  uchar idata i=0;</p><p>  uchar idata notChange = 0;</p><p>  uchar idata start1 = 0;</p&g

34、t;<p>  uchar idata stop = 0;</p><p>  uchar idata ID=0;</p><p>  const uchar code LCD_ID[ROW+1][16] = {</p><p>  {"Red Decoding "},</p><p>  {"Te

35、mp Display "},</p><p>  {"Timer "},</p><p>  {"Music "},</p><p>  {" "}</p><p><b>  };</b></

36、p><p>  const uchar code music[2][14] = {{"Wish You Safe"},{"LBDYHBYC"}};</p><p>  const uchar code timer[2][6] = {{"start"},{"stop"}};</p><p> 

37、 const uchar code Ir[12] = {"IR CODE:--H"};</p><p>  const uchar code tem[15] = {"Now temp is --"};</p><p>  sbit Speak = P3^4; //蜂鳴器</p><p>  sbit IRIN = P3

38、^3; //紅外接收</p><p>  sbit D18B20 = P3^5; //DS18B20數(shù)據(jù)口</p><p>  sbit E = P1^2; </p><p>  sbit RW = P1^1; </p><p>  sbit RS = P1^0;</p><

39、;p>  sbit UP = P2^3;</p><p>  sbit DOWN = P2^2;</p><p>  sbit ENTER =P2^1;</p><p>  sbit EXIT = P2^0;</p><p>  uchar idata IRCOM[7];</p><p>  uchar idat

40、a TMPH,TMPL;</p><p>  uchar idata Count;</p><p>  uchar idata play = 0;</p><p>  bit flag;</p><p>  const uchar code SONG[] ={ //祝你平安</p><p>  0x26,0

41、x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,</p><p>  0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,</p><p>  0x20,0x80,0x2b,0x20,

42、0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,</p><p>  0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,</p><p>  0x30,0x20,0x30,0x20,0x39,0x10,0x26

43、,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,</p><p>  0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,</p><p>  0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x8

44、0,0x18,0x20,0x18,0x20,0x26,0x20,</p><p>  0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,</p><p>  0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x

45、39,0x10,0x30,0x10,</p><p>  0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,</p><p>  0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0

46、x20,</p><p>  0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,</p><p>  0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,</p>

47、<p>  0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,</p><p>  //路邊的野華不要采</p><p>  0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40,0x1C,</p><p>  0x2

48、0,0x20,0x20,0x1C,0x20,0x18,0x20,0x20,0x80,0xFF,0x20,0x30,0x1C,0x10,0x18,0x20,</p><p>  0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,</p><p>  0x30,0x80,0xFF,0x

49、20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,</p><p>  0x20,0x2B,0x40,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,</p><p>  0x20,0x2B,0x40,0x20,0x30,0x1C,0

50、x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,</p><p>  0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1C,0x10,0x20,</p><p>  0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,

51、0x30,0x20,0x2B,0x40,0x20,0x15,0x1F,</p><p>  0x05,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,</p><p>  0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26

52、,0x40,0x20,0x20,0x2B,</p><p>  0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20,</p><p>  0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,0x00,0x0

53、0</p><p><b>  };</b></p><p>  /*****延時******/</p><p>  void delay(unsigned char x) //x*0.14MS</p><p><b>  {</b></p><p>  unsigne

54、d char i;</p><p>  while(x--)</p><p><b>  {</b></p><p>  for (i = 0; i<13; i++) {}</p><p><b>  }</b></p><p><b>  }</b&g

55、t;</p><p>  void delay1(int ms) //1ms</p><p><b>  {</b></p><p>  unsigned char y;</p><p>  while(ms--)</p><p><b>  {</b></p&g

56、t;<p>  for(y = 0; y<134; y++)</p><p><b>  {</b></p><p><b>  ;</b></p><p><b>  }</b></p><p><b>  }</b></p&g

57、t;<p><b>  }</b></p><p>  void delay2()</p><p><b>  {</b></p><p><b>  int i,j;</b></p><p>  for(i=0; i<=5; i++)</p>

58、<p>  for(j=0; j<=2; j++);</p><p><b>  }</b></p><p>  void delay3()</p><p><b>  {</b></p><p><b>  int i,j;</b></p>&

59、lt;p>  for(i=0; i<=150; i++)</p><p>  for(j=0; j<=100; j++);</p><p><b>  }</b></p><p>  void jishi_Disp();</p><p>  /*******數(shù)碼管顯示延時******/</p>

60、;<p>  void delay4()</p><p><b>  {</b></p><p>  uchar i=200;</p><p>  for(;i>0;i--)</p><p>  jishi_Disp();</p><p><b>  }</b&

61、gt;</p><p>  /*******蜂鳴器延時*******/</p><p>  void Delay_xMs(uint x)</p><p><b>  {</b></p><p><b>  uint i,j;</b></p><p>  for(i=0; i&

62、lt;x; i++)</p><p><b>  {</b></p><p>  for(j=0; j<1; j++);//3</p><p><b>  }</b></p><p><b>  }</b></p><p>  /********溫

63、度延時********/</p><p>  void TempDelay (uchar us)</p><p><b>  {</b></p><p>  while(us--);</p><p><b>  }</b></p><p>  /******LCD命令****

64、**/</p><p>  void enable(uchar del)</p><p><b>  {</b></p><p><b>  P0 = del;</b></p><p><b>  RS = 0;</b></p><p><b>

65、;  RW = 0;</b></p><p><b>  E = 0;</b></p><p><b>  delay2();</b></p><p><b>  E = 1;</b></p><p><b>  delay2();</b>&l

66、t;/p><p><b>  }</b></p><p>  /******LCD數(shù)據(jù)******/</p><p>  void write(uchar del)</p><p><b>  {</b></p><p><b>  P0 = del;</b>

67、;</p><p><b>  RS = 1;</b></p><p><b>  RW = 0;</b></p><p><b>  E = 0;</b></p><p><b>  delay2();</b></p><p>&

68、lt;b>  E = 1;</b></p><p><b>  delay2();</b></p><p><b>  }</b></p><p>  /******LCD初始化******/</p><p>  void L1602_init(void)</p>&

69、lt;p><b>  {</b></p><p>  enable(0x01);</p><p>  enable(0x38);</p><p>  enable(0x0e);</p><p>  enable(0x06);</p><p>  enable(0xd0);</p>

70、<p><b>  }</b></p><p>  /******LCD寫字符******/</p><p>  void L1602_char(uchar hang,uchar lie,char sign)</p><p><b>  {</b></p><p><b> 

71、 uchar a;</b></p><p>  if(hang == 1) a = 0x80;</p><p>  if(hang == 2) a = 0xc0;</p><p>  a = a + lie - 1;</p><p>  enable(a);</p><p>  write(sign);&l

72、t;/p><p><b>  }</b></p><p>  /******LCD寫字符串*****/</p><p>  void L1602_string(uchar hang,uchar lie,uchar *p)</p><p><b>  {</b></p><p>&

73、lt;b>  uchar a;</b></p><p>  if(hang == 1) a = 0x80;</p><p>  if(hang == 2) a = 0xc0;</p><p>  a = a + lie - 1;</p><p>  enable(a);</p><p><b&g

74、t;  while(1)</b></p><p><b>  {</b></p><p>  if(*p == '\0') break;</p><p>  write(*p);</p><p><b>  p++;</b></p><p><

75、;b>  }</b></p><p><b>  }</b></p><p>  /*******初始化18B20*****/</p><p>  void Init18b20 (void)</p><p><b>  {</b></p><p><b

76、>  D18B20=1;</b></p><p><b>  _nop_();</b></p><p><b>  D18B20=0;</b></p><p>  TempDelay(80); //delay 530 uS//80</p><p><b>  _nop

77、_();</b></p><p><b>  D18B20=1;</b></p><p>  TempDelay(14); //delay 100 uS//14</p><p><b>  _nop_();</b></p><p><b>  _nop_();</b&

78、gt;</p><p><b>  _nop_();</b></p><p>  if(D18B20==0)</p><p>  flag = 1; //detect 1820 success!</p><p><b>  else</b></p><p>  flag

79、= 0; //detect 1820 fail!</p><p>  TempDelay(20); //20</p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p>  D18B20 = 1;</p>

80、<p><b>  }</b></p><p>  /*******18B20讀字節(jié)**********/</p><p>  unsigned char ReadByte (void) //讀取單字節(jié)</p><p><b>  {</b></p><p>  unsigned

81、 char idata i,u=0;</p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p>  D18B20 = 0;</p><p><b>  u >>= 1;</b></p><p>  D18B

82、20 = 1;</p><p>  if(D18B20==1)</p><p>  u |= 0x80;</p><p>  TempDelay (2);</p><p><b>  _nop_();</b></p><p><b>  }</b></p>&l

83、t;p>  return(u);</p><p><b>  }</b></p><p>  /*********寫字節(jié)**********/</p><p>  void WriteByte (uchar wr) //單字節(jié)寫入</p><p><b>  {</b></p>

84、<p>  unsigned char idata i;</p><p>  for (i=0;i<8;i++)</p><p><b>  {</b></p><p>  D18B20 = 0;</p><p><b>  _nop_();</b></p><

85、p>  D18B20=wr&0x01;</p><p>  TempDelay(3); //delay 45 uS //5</p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  D18B20

86、=1;</b></p><p><b>  wr >>= 1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /*********讀數(shù)據(jù)**********/</p><p

87、><b>  /*</b></p><p>  void read_bytes (uchar j)</p><p><b>  {</b></p><p>  unsigned char idata i;</p><p>  for(i=0;i<j;i++)</p><

88、;p><b>  {</b></p><p>  *p = ReadByte();</p><p><b>  p++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>

89、<b>  */</b></p><p>  /*********顯示溫度********/</p><p>  void Temp_Disp()</p><p><b>  {</b></p><p>  uchar shi=0,ge=0;</p><p>  uint t

90、emp;</p><p>  Init18b20 ();</p><p>  WriteByte(0xcc); //skip rom</p><p>  WriteByte(0x44); //Temperature convert</p><p>  Init18b20 ();</p><p>  WriteB

91、yte(0xcc); //skip rom</p><p>  WriteByte(0xbe); //read Temperature</p><p>  TMPL = ReadByte();</p><p>  TMPH = ReadByte();</p><p>  L1602_string(1, 3, LCD_ID[ID]);&

92、lt;/p><p>  L1602_string(2, 1, tem);</p><p>  //if(TMPH&0xfc==0xfc)</p><p><b>  //{</b></p><p>  //temp = (~(TMPL /16 + (TMPH|0xfc) *16))+1;</p><

93、;p>  //L1602_char(2,12,'-');</p><p><b>  //}</b></p><p><b>  //else</b></p><p><b>  {</b></p><p>  temp = TMPL / 16 + TMP

94、H * 16;</p><p><b>  }</b></p><p>  shi = temp/10%10 + 0x30;</p><p>  ge = temp%10 + 0x30;</p><p>  L1602_char(2,13,shi);</p><p>  L1602_char(2,

95、14,ge);</p><p>  L1602_char(2,15,0xdf);</p><p><b>  }</b></p><p>  void Int1_Init()</p><p><b>  {</b></p><p>  EA=1; //允許總中斷中斷,

96、</p><p>  TCON = 0x10; //觸發(fā)方式為脈沖負(fù)邊沿觸發(fā)</p><p>  IRIN = 1; //I/O口初始化</p><p><b>  }</b></p><p>  /*****紅外初始化********/</p><p>  void Ir_Init

97、()</p><p><b>  {</b></p><p>  Int1_Init();</p><p><b>  }</b></p><p>  /*****紅外顯示*********/</p><p>  void Ir_Disp()</p><p

98、><b>  {</b></p><p>  delay1(1);</p><p>  L1602_string(1, 3, LCD_ID[ID]);</p><p>  L1602_string(2, 1, Ir);</p><p><b>  }</b></p><p&

99、gt;  void Time0_Init()</p><p><b>  {</b></p><p>  TMOD = 0x01;</p><p>  IE = 0x82;</p><p>  TR0 = 0;</p><p><b>  }</b></p&g

100、t;<p>  /*********數(shù)碼管******/</p><p>  void jishi_Disp()</p><p><b>  {</b></p><p>  uchar i=0;</p><p>  for(;i<4;i++)</p><p><b>

101、  {</b></p><p><b>  if(i==2)</b></p><p><b>  {</b></p><p>  P0 = table1[jishi[i]];</p><p>  P2 = LED_W[i];</p><p>  delay1(2)

102、;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  P0 = table[jishi[i]];</p><p>  P2 = LED_W[i];</p

103、><p>  delay1(2);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void jishi_Init()</p><p><

104、;b>  {</b></p><p>  Time0_Init();</p><p>  TH0 = (65535-10000)/256;</p><p>  TL0 = (65535-10000)%256;</p><p><b>  }</b></p><p>  void

105、jishi_start(uchar i)</p><p><b>  {</b></p><p>  delay1(1);</p><p>  L1602_string(1, 6, LCD_ID[ID]);</p><p>  L1602_string(2, 6, timer[i]);</p><p&

106、gt;<b>  }</b></p><p>  /********蜂鳴器*********/</p><p>  void Time1_Init()</p><p><b>  {</b></p><p>  TMOD = 0x10;</p><p>  IE = 0x

107、88;</p><p>  TH1 = 0xDC;//DC</p><p>  TL1 = 0x00;</p><p><b>  }</b></p><p>  void Play_Song(uchar i)</p><p><b>  {</b></p>

108、;<p>  uchar Temp1,Temp2;</p><p>  uint Addr;</p><p>  Count = 0;//中斷計數(shù)器清0</p><p>  Addr = i * 217;</p><p><b>  while(1)</b></p><p&g

109、t;<b>  {</b></p><p>  Temp1 = SONG[Addr++];</p><p>  if (Temp1 == 0xFF) //休止符</p><p><b>  {</b></p><p><b>  TR1 = 0;</b><

110、;/p><p>  Delay_xMs(100);</p><p><b>  }</b></p><p>  else if (Temp1 == 0x00) //歌曲結(jié)束符</p><p><b>  {</b></p><p><b>  return;<

111、/b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  Temp2 = SONG[Addr++];</p><p><b>  TR1 =

112、1;</b></p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  Speak = ~Speak;</p><p>  Delay_xMs(Temp1);</p><p>  if(Temp2 == Co

113、unt)</p><p><b>  {</b></p><p>  Count = 0;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p

114、><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void alerm()</p><p><b>  {</b></p><p&g

115、t;  uchar i = 100;</p><p>  for(;i>0;i--)</p><p><b>  {</b></p><p>  Speak = ~Speak;</p><p>  Delay_xMs(26);</p><p><b>  }</b>

116、</p><p><b>  }</b></p><p>  void M_Disp(uchar i)</p><p><b>  {</b></p><p>  delay1(1);</p><p>  L1602_string(1, 6, LCD_ID[ID]);<

117、/p><p><b>  if(i==2)</b></p><p>  L1602_string(2, 1, LCD_ID[ID+1]);</p><p><b>  else</b></p><p>  L1602_string(2, 1, music[i]);</p><p>

118、;<b>  }</b></p><p>  void main(void)</p><p><b>  { </b></p><p>  L1602_init(); //初始化LCD </p><p><b>  E = 0;</

119、b></p><p>  Ir_Init();</p><p>  //while(1);</p><p><b>  /*</b></p><p><b>  while(1)</b></p><p><b>  {</b></p>

120、<p>  P2 = 0xEf;</p><p><b>  if(UP==0)</b></p><p><b>  {</b></p><p><b>  delay3();</b></p><p><b>  if(UP==0)</b>&l

121、t;/p><p><b>  {</b></p><p>  if(ID<(ROW-1))</p><p><b>  ID++;</b></p><p><b>  }</b></p><p><b>  }</b></p

122、><p>  else if(DOWN==0)</p><p><b>  {</b></p><p><b>  delay3();</b></p><p>  if(DOWN==0)</p><p><b>  {</b></p><

123、p><b>  if(ID>0)</b></p><p><b>  ID--;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  //for(i=0;i<10;)</p&g

124、t;<p><b>  //{</b></p><p>  P0 = table[ID];</p><p><b>  //i++</b></p><p>  //delay1(500);</p><p><b>  //}</b></p><

125、p><b>  }</b></p><p><b>  */</b></p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  P2 = 0xff;</p><p>&l

126、t;b>  if(UP==0)</b></p><p><b>  {</b></p><p><b>  delay3();</b></p><p><b>  if(UP==0)</b></p><p><b>  {</b><

127、/p><p>  if(ID<(ROW-1))</p><p><b>  {</b></p><p><b>  ID++;</b></p><p>  enable(0x01);</p><p><b>  }</b></p><

128、;p><b>  else</b></p><p><b>  alerm();</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  else if(DOWN==0)</p>&l

129、t;p><b>  {</b></p><p><b>  delay3();</b></p><p>  if(DOWN==0)</p><p><b>  {</b></p><p><b>  if(ID>0)</b></p>

130、<p><b>  {</b></p><p><b>  ID--;</b></p><p>  enable(0x01);</p><p><b>  }</b></p><p><b>  else</b></p><

131、;p><b>  alerm();</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  else if(ENTER==0)</p><p><b>  {</b></p><

132、p><b>  delay3();</b></p><p>  if(ENTER==0)</p><p><b>  {</b></p><p>  enable(0x01);</p><p>  while(notQuit)</p><p><b>  {&

133、lt;/b></p><p>  switch(ID)</p><p><b>  {</b></p><p><b>  case 0:</b></p><p><b>  {</b></p><p><b>  if(i==0)<

134、;/b></p><p><b>  {</b></p><p>  Ir_Disp();</p><p><b>  EX1=1;</b></p><p><b>  i=1;</b></p><p><b>  }</b>

135、</p><p>  if(EXIT==0)</p><p><b>  {</b></p><p><b>  delay3();</b></p><p>  if(EXIT==0)</p><p><b>  {</b></p><

136、;p>  notQuit = 0;</p><p>  enable(0x01);</p><p><b>  EX1=0;</b></p><p><b>  i=0;</b></p><p><b>  }</b></p><p><b&

137、gt;  }</b></p><p><b>  };break;</b></p><p><b>  case 1:</b></p><p><b>  {</b></p><p><b>  if(i==0)</b></p>

138、<p><b>  {</b></p><p>  Temp_Disp();</p><p><b>  i=1;</b></p><p><b>  }</b></p><p>  Temp_Disp();</p><p>  if(EXIT

139、==0)</p><p><b>  {</b></p><p><b>  delay3();</b></p><p>  if(EXIT==0)</p><p><b>  {</b></p><p>  notQuit = 0;</p>

140、<p>  enable(0x01);</p><p><b>  i=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  };break;</b></p>

141、<p><b>  case 2:</b></p><p><b>  {</b></p><p><b>  if(i==0)</b></p><p><b>  {</b></p><p>  jishi_Init();</p>

142、<p>  jishi_start(0);</p><p><b>  //EX1=1;</b></p><p><b>  i=1;</b></p><p><b>  }</b></p><p>  jishi_Disp();</p><p&

143、gt;  while(start1)</p><p><b>  {</b></p><p>  jishi_Disp();</p><p>  if(EXIT==0)</p><p><b>  {</b></p><p><b>  delay4();</

144、b></p><p>  if(EXIT==0)</p><p><b>  {</b></p><p>  start1 = 0;</p><p><b>  TR0 = 0;</b></p><p>  //jishi_start(0);</p>&l

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論