版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 目錄</b></p><p> 一、設(shè)計(jì)任務(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è)計(jì)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ù)碼管定時(shí)器模塊11</p><p> 5、1602顯示模塊12</p><p> 六、模塊整合:13</p><p> 七、程序?qū)崿F(xiàn):15</p><p> 一、設(shè)計(jì)任務(wù)與要求
5、 </p><p><b> 1. 任務(wù):</b></p><p> 制作并調(diào)試51單片機(jī)學(xué)習(xí)板 </p><p><b> 2. 要求: </b></p><p> ?。?) 了解并能識(shí)別學(xué)習(xí)板上的各種元器件,會(huì)讀元器件標(biāo)示; </p><p> (2) 會(huì)看電
6、路原理圖;</p><p> (3) 制作51單片機(jī)學(xué)習(xí)板,并將下發(fā)的單片機(jī)元件焊接為開發(fā)板;</p><p> ?。?) 學(xué)會(huì)使用Keil C軟件下載調(diào)試程序;用調(diào)試程序?qū)?1單片機(jī)學(xué)習(xí)板調(diào)試成功。</p><p> 熟練開發(fā)板的功能,并利用已有模塊設(shè)計(jì)出相應(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、> 獨(dú)立按鍵</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,分析一下時(shí)序是否一致,同時(shí)分析一下命令字是否正確 </p><p> 6)通過示波器對芯片各個(gè)引腳進(jìn)行檢查,檢查地址線是否有信號(hào)的 </p><p> 7)飛線。用別的的口線進(jìn)行控制,看看能不能對其進(jìn)行正常操作,多試驗(yàn),才能找到問題出現(xiàn)在什么地方。
13、</p><p><b> 四、任務(wù)設(shè)計(jì)</b></p><p> 由于開發(fā)板功能有限,所以基本把可以實(shí)現(xiàn)的功能都用上了。設(shè)計(jì)的功能大體上分為5個(gè)模塊:18B20的溫度測量模塊、紅外遙控器的解碼模塊、蜂鳴器音樂播放模塊、數(shù)碼管定時(shí)器模塊、1602顯示模塊。另外由于跑馬燈的Port口與1602顯示Port口復(fù)用,且該功能較為簡單,所以并未實(shí)現(xiàn)該功能。且12864模塊
14、和1602模塊類似,同為液晶顯示模塊,該功能也未實(shí)現(xiàn)。其它模塊功能都已實(shí)現(xiàn)。下面將分別介紹各個(gè)模塊功能的實(shí)現(xiàn)。</p><p><b> 五、模塊介紹</b></p><p> 1、18B20的溫度測量</p><p> DS18B20是溫度測量器件,有三個(gè)引腳,類似于三極管,分別是地線GND、數(shù)據(jù)線I/O、電源線VDD。由于DS18B2
15、0采用的是1-Wire 總線協(xié)議方式,即在一根數(shù)據(jù)線上實(shí)現(xiàn)數(shù)據(jù)的雙向傳輸,而對AT89S51單片機(jī)來說,硬件上并不支持單總線協(xié)議,因此,須采用軟件的方法來模擬單總線的協(xié)議時(shí)序來完成對DS18B20芯片的訪問。</p><p> 由于DS18B20是在一根I/O 線上讀寫數(shù)據(jù),因此,對讀寫的數(shù)據(jù)位有著嚴(yán)格的時(shí)序要求。DS18B20有嚴(yán)格的通信協(xié)議來保證各位數(shù)據(jù)傳輸?shù)恼_性和完整性。該協(xié)議定義了幾種信號(hào)的時(shí)序:初始
16、化時(shí)序、讀時(shí)序、寫時(shí)序。所有時(shí)序都是將主機(jī)作為主設(shè)備,單總線器件作為從設(shè)備。而每一次命令和數(shù)據(jù)的傳輸都是從主機(jī)主動(dòng)啟動(dòng)寫時(shí)序開始,如果要求單總線器件回送數(shù)據(jù),在進(jìn)行寫命令后,主機(jī)需啟動(dòng)讀時(shí)序完成數(shù)據(jù)接收。數(shù)據(jù)和命令的傳輸都是低位在先。</p><p> ds18b20時(shí)序說明</p><p> 根據(jù)官方數(shù)據(jù)手冊,我們可以對其時(shí)序進(jìn)行如下分析:</p><p>&
17、lt;b> 初始化時(shí)序:</b></p><p> 上圖是DS18B20初始化時(shí)序,從圖中我們可以得知,黑線代表的是主設(shè)備,也就是單片機(jī)被要求的操作,灰線代表的是從設(shè)備,也就是18B20的電平變化。</p><p> 首先由單片機(jī)拉低信號(hào)線480us,使它復(fù)位,然后釋放總線15-60us,18b20會(huì)拉低總線60-240us,然后它釋放總線。所以初始化成功的一個(gè)標(biāo)志
18、就是能否讀到18b20這個(gè)先低后高的操作時(shí)序。如檢測到,則代表初始化成功。注意,每次讀取都要初始化,否則18b20處于待機(jī)狀態(tài),無法成功讀取。</p><p><b> 寫時(shí)序:</b></p><p> 該過程是寫1bit數(shù)據(jù)過程。而該過程又分為寫0和寫1操作。當(dāng)要寫0時(shí)序時(shí),單總線要被拉低至少60us,保證18B20在15us到60us之間能正確的采樣到“0”
19、電平。當(dāng)寫1時(shí)序時(shí),單總線被拉低后,在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完成一個(gè)讀時(shí)序至少要60us才能完成。</p><p> 完成了最基本的三個(gè)時(shí)序操作之后,便可以對照著官方數(shù)據(jù)手冊,使用相關(guān)指令,實(shí)現(xiàn)自己需要的功能。</p><p> 2、紅外遙控解碼模塊</p><p> 如左圖所示,紅外接收管收三個(gè)引腳,一個(gè)數(shù)據(jù)口,一個(gè)電源和一個(gè)地。</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位。紅外遙控信號(hào)從引導(dǎo)碼開始,接下來是16位客戶代碼,然后是8位數(shù)據(jù)代碼和取反的二進(jìn)
22、制8位代碼,最后的是1位結(jié)束位。</p><p> 此種編碼方式可以使用MCU的捕獲功能實(shí)現(xiàn),通過比較兩次捕獲的時(shí)間,來判斷發(fā)射碼,按照如下圖的時(shí)序,便能實(shí)現(xiàn)紅外解碼。</p><p> 3、蜂鳴器音樂播放模塊</p><p> 蜂鳴器分為無源和有源兩種,這里的“源”不是指電源。而是指震蕩源。也就是說,有源蜂鳴器內(nèi)部帶震蕩源,所以只要一通電就會(huì)叫。 而無源內(nèi)
23、部不帶震蕩源,所以如果用直流信號(hào)無法令其鳴叫。必須用2K~5K的方波去驅(qū)動(dòng)它。 有源蜂鳴器往往比無源的貴,就是因?yàn)槔锩娑鄠€(gè)震蕩電路。 無源蜂鳴器的優(yōu)點(diǎn)是:便宜、聲音頻率可控,可以做出“多來米發(fā)索拉西”的效果、在一些特例中,可以和LED復(fù)用一個(gè)控制口。而有源蜂鳴器的優(yōu)點(diǎn)是:程序控制方便。</p><p> 本實(shí)驗(yàn)板中用的是無源蜂鳴器,則可以通過單片機(jī)發(fā)出不同頻率的波來改變聲音的頻率,達(dá)到不同的音調(diào),通過不同音
24、調(diào)的組合,可以實(shí)現(xiàn)簡單的音樂播放。</p><p> 本模塊主要是定時(shí)器的應(yīng)用,通過計(jì)算,配置相應(yīng)的寄存器參數(shù),就可以實(shí)現(xiàn)頻率的精準(zhǔn)控制,產(chǎn)生不同評(píng)論的方波,然后再用音樂頻率取模軟件,就可以得到一首歌的頻率和時(shí)隙的變化。然后再通過單片機(jī)產(chǎn)生相應(yīng)的PWM波,送入如圖所示的Port口,蜂鳴器便可以產(chǎn)生不同的音樂。</p><p> 4、數(shù)碼管定時(shí)器模塊</p><p&g
25、t; 該模塊涉及到兩個(gè)方面的知識(shí),一個(gè)是定時(shí)器的精準(zhǔn)控制,另一個(gè)是數(shù)碼管的動(dòng)態(tài)掃描。</p><p> 定時(shí)器的精準(zhǔn)控制在上面蜂鳴器中已經(jīng)說了,這里就不再贅述。這里主要講的是動(dòng)態(tài)掃描,由于本實(shí)驗(yàn)板給的是四位一體數(shù)碼管。未用到鎖存器,就可以直接用單片機(jī)來控制位選,由于數(shù)碼管的每位不能單獨(dú)寫數(shù)據(jù),所以必須利用動(dòng)態(tài)掃描來顯示。動(dòng)態(tài)掃描的原理主要是利用人眼的視覺暫留,因?yàn)椴荒軉为?dú)寫數(shù)據(jù),所以要想讓數(shù)碼管顯示不同的值,
26、必須每位單獨(dú)分開顯示,每次只開一個(gè)位選,選中一個(gè)數(shù)碼管,送入相應(yīng)的數(shù)據(jù),然后開第二個(gè)位選端,寫入相應(yīng)位的數(shù)據(jù),然后循環(huán)控制位選,然后利用單片機(jī)調(diào)整切換速率到合適的大小,根據(jù)人眼的視覺暫留,看上去就像是4位數(shù)據(jù)是同時(shí)顯示的,這就是數(shù)碼管的動(dòng)態(tài)顯示原理。</p><p> 然后通過計(jì)算,嚴(yán)格控制定時(shí)器,然后每秒更改一次數(shù)碼管顯示的值,那么定時(shí)器就算是完成了。</p><p> 5、1602
27、顯示模塊</p><p> 中間的Valid Data即有效數(shù)據(jù)區(qū),我們進(jìn)行讀或?qū)?,無非都是想進(jìn)行數(shù)據(jù)的傳送,在時(shí)序圖中, 進(jìn)行讀操作的時(shí)候,RW置于1,RS則根據(jù)讀的內(nèi)容(狀態(tài)或數(shù)據(jù))置為1或0,經(jīng)過td時(shí)間后,可以在數(shù)據(jù)口讀到正確的數(shù)據(jù),由于td的時(shí)間極短(ns級(jí)),單片機(jī)操作一般是us級(jí),所以可以不考慮這個(gè)時(shí)間差,在將E置為1之后,接著寫指令去讀取數(shù)據(jù),在讀到數(shù)據(jù)后,再將E
28、置為0,經(jīng)過THD2時(shí)間后,數(shù)據(jù)口上的數(shù)據(jù)失效。 </p><p> 在進(jìn)行寫操作的時(shí)候,RW要置為0,RS根據(jù)寫的內(nèi)容不同(指令或數(shù)據(jù))置為1或0,同時(shí),在將E置為1之前,要先將數(shù)據(jù)送到數(shù)據(jù)口上,然后,在C位置,將E置為1,經(jīng)過tPW延時(shí)后,再將E置為0,在這個(gè)時(shí)間段內(nèi)必須保證數(shù)據(jù)口上的數(shù)據(jù)穩(wěn)定不變,為有效的數(shù)據(jù)。同理,由于tPW這些延時(shí)相對較短(ns級(jí)),所以在單片里也不必考慮延時(shí)問題。
29、;</p><p> 基本的讀寫操作實(shí)現(xiàn)之后,就可以根據(jù)數(shù)據(jù)手冊,根據(jù)相關(guān)指令,就可以實(shí)現(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> /*****延時(shí)******/</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ù)碼管顯示延時(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> /*******蜂鳴器延時(shí)*******/</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、度延時(shí)********/</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;//中斷計(jì)數(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)容里面會(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 溫度計(jì)課程設(shè)計(jì)---基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)
- 數(shù)字溫度計(jì)課程設(shè)計(jì)---基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)
- 數(shù)字溫度計(jì)課程設(shè)計(jì)---基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)
- 基于51單片機(jī)的溫度計(jì)課程設(shè)計(jì)
- 51單片機(jī)課程設(shè)計(jì)數(shù)字溫度計(jì)報(bào)告
- 基于51單片機(jī)的數(shù)字溫度計(jì)課程設(shè)計(jì)
- protel課程設(shè)計(jì)--基于51單片機(jī)的溫度計(jì)
- 單片機(jī)溫度計(jì)課程設(shè)計(jì)
- 單片機(jī)原理及應(yīng)用課程設(shè)計(jì)--多功能數(shù)字溫度計(jì)設(shè)計(jì)
- 基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)報(bào)告課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)--數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)-數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)—數(shù)字溫度計(jì)
- 單片機(jī)數(shù)字溫度計(jì)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)-數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)—數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)——數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)—數(shù)字溫度計(jì)
評(píng)論
0/150
提交評(píng)論