【文章內(nèi)容簡(jiǎn)介】
輸入 輸出 ——OE LE D Q L H L L L H H H L L X Q0 H X X Z 齊齊哈爾大學(xué) 7 表 22 74HC138真值表 74HC138 譯碼器可接受 3位二進(jìn)制加權(quán)地址輸 入( A0, A1 和 A2),并當(dāng)使能時(shí),提供 8個(gè)互斥的低有效輸出( Y0 至 Y7)。 74HC138 特有 3 個(gè)使能輸入端:兩個(gè)低 電平 有效( E1和 E2)和一個(gè)高 電平 有效( E3)。除非 E1 和 E2 置低且 E3 置高,否則 74HC138 將保持所有輸出為高。利用這種復(fù)合使能特性, 74HC138 充當(dāng)一個(gè) 8輸出多路分配器, 本設(shè)計(jì)中用于進(jìn)行數(shù)碼管的位選。 : 高壓大電流達(dá)林頓晶體管陣列 , 由七個(gè)硅 NPN 復(fù)合晶體管組成 。 電路特點(diǎn) : ULN2021 的每一對(duì)達(dá)林頓都串聯(lián)一個(gè) 的基極電阻 ,在 5V 的工作電壓下它能與TTL 和 CMOS 電路 直接相連 ,可以直接處理原先需要標(biāo)準(zhǔn)邏輯緩沖器來(lái)處理的數(shù)據(jù)。具有電流增益高、工作電壓高、溫度范圍寬、帶負(fù)載能力強(qiáng)等特點(diǎn) ,適應(yīng)于各類要求高速大功率驅(qū)動(dòng)的系統(tǒng)。 本設(shè)計(jì)中用于無(wú)源蜂鳴器的驅(qū)動(dòng),同時(shí)可以為再次擴(kuò)展時(shí)提供驅(qū)動(dòng)電路。 Enable Address Output E3 E2 E1 A2 A1 A0 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 X X H X X X H H H H H H H H L X X X X X H H H H H H H H X H X X X X H H H H H H H H H L L L L L L H H H H H H H H L L L L H H L H H H H H H H L L L H L H H L H H H H H H L L L H H H H H L H H H H H L L H L L H H H H L H H H H L L H L H H H H H H L H H H L L H H L H H H H H H L H H L L H H H H H H H H H H L 齊齊哈爾大學(xué) 8 第 3 章 程序設(shè)計(jì) 分析紅外遙控音樂播放的功能,包括 選擇播放 兩首歌 曲 、暫停、暫停后斷點(diǎn)播放 、結(jié)束播放歌曲,播放下一曲,播放上一曲,并且使用數(shù)碼管顯示紅外信號(hào)解碼后的兩位16 進(jìn)制的數(shù)據(jù)碼。根據(jù)以上功能,可心得出結(jié)論:該程序設(shè)計(jì)的主要工作,即核心問題是紅外信號(hào) 的解碼。因?yàn)椋瑹o(wú)論是播放音樂的哪一個(gè)操作,還是顯示紅外信號(hào)的數(shù)據(jù)碼,都是建立在對(duì)紅外信號(hào)的正確解碼下的。首先進(jìn)行正確的紅外解碼,然后根據(jù)解碼后的鍵值進(jìn)行播放歌曲與顯示按鍵值。按照以上得出的結(jié)論,畫出 程序流程圖 如 圖 31所示 : 圖 31 程序流程圖 結(jié)合 程序流程圖,可以知道:將整個(gè)程序的設(shè)計(jì)分為兩個(gè)模塊,即:紅外解碼、播放及顯示。 紅外解碼程序 在進(jìn)行程序設(shè)計(jì)之前,先分析一下紅外信號(hào)的波形。 每 當(dāng) 次按鍵 按下 ,紅外 發(fā)射器會(huì)發(fā)出一串脈沖,紅外接收器 會(huì)收到 這一串脈沖寬度不等的脈沖波形流,其脈沖流包括:(1)前導(dǎo)碼: 第 1 個(gè)脈沖波形 ; (2)用戶碼 1:第 2 到第 9個(gè)脈沖波形 ; (3)用戶碼 2:第10 到第 17 個(gè)脈沖波形 ; (4)數(shù)據(jù) 碼:第 18 到第 25 個(gè)脈沖波形 ; (5)數(shù)據(jù) 反碼:第 26到第 33 個(gè)脈沖波形 ; (6) 連續(xù)按鍵脈沖:第 34 和第 35 個(gè)脈沖為結(jié)束脈沖,在每次按 開始 主函數(shù)判斷有無(wú)紅外信號(hào) 收到紅外信號(hào) 未收到紅外信號(hào) 處理紅外信號(hào) 顯示解碼鍵值 播放選擇歌曲 暫停與結(jié)束曲 播放上一曲 播放下一曲 齊齊哈爾大學(xué) 9 鍵結(jié)束后會(huì)有兩個(gè)結(jié)束脈沖,如果一直按鍵不放的話,會(huì)一直發(fā)送連續(xù)按鍵脈沖,并可以認(rèn)為在收到 10 個(gè)連續(xù)按鍵脈沖后是下一個(gè)按鍵 (本次設(shè)計(jì)中不考慮連續(xù)按鍵脈沖 )。其碼型結(jié)構(gòu)如 圖 32所示 : 圖 32 紅外信號(hào)碼 型圖 由 圖 32可知:紅外信號(hào)碼型中本次設(shè)計(jì)中要使用的部分,即是 圖 32中的 8 位鍵數(shù)據(jù)碼。下面分析具體的怎樣進(jìn)行紅外信號(hào)的解碼。 紅外信號(hào)為 采用脈寬調(diào)制的串行碼,以脈寬為 、間隔 、周期為 的組合表示二進(jìn)制的“ 0”;以脈寬為 、間隔 、周期為 的組合表示二進(jìn)制的“ 1”,其波形如 圖 33所示。 圖 33 紅外信號(hào)脈沖寬度圖 上述“ 0”和“ 1”組成的 32 位二進(jìn)制碼經(jīng) 38kHz 的載頻進(jìn)行二次調(diào)制以提高發(fā)射效率,達(dá)到降低電源功耗的目的。然后再通 過(guò)紅外發(fā)射二極管產(chǎn)生紅外線向空間發(fā)射,即產(chǎn)生了如圖 32 所示的有效碼組序列。在 圖 33 中同樣可以看到引導(dǎo)碼脈寬為 9ms,間隔 。在紅外信號(hào)經(jīng)過(guò)解碼電路后,原碼型中的高低電平進(jìn)行反轉(zhuǎn)。在得到的新碼型中,去掉第一個(gè)下降沿 (引導(dǎo)碼 ),第二個(gè)下降沿開始即為有效碼序列,應(yīng)該進(jìn)行解碼并記錄。在本設(shè)計(jì)中,將解碼后的信號(hào)引入外部中斷 1,由于是下降沿有效,故 IT1=1[2]。紅外解碼源碼如下: unsigned char irtime。 //脈沖寬度時(shí)間值 unsigned char startflag。//接收 開始標(biāo)志 unsigned char bitnum。 //碼組位數(shù) unsigned char irreceok。 //接收完成標(biāo)志 unsigned char irprocok。 //解碼完成標(biāo)志 unsigned char irdata[33]。//脈沖寬度數(shù)組 unsigned char ircode[4]。 //解碼值數(shù)組 void timer0init(void) { TMOD=0x02。 //定時(shí)器 0 定時(shí)方式 2 8 位自動(dòng)重裝 齊齊哈爾大學(xué) 10 TH0=0x00。 //初值 為 0 實(shí)現(xiàn)定時(shí) 256us TL0=0x00。 ET0=1。 //開定時(shí)器 0中斷 EA=1。 //開總中斷 TR0=1。 //啟動(dòng)定時(shí)器 0 } void int1init(void) { IT1=1。 //外部中斷 1負(fù)跳變沿有效 EX1=1。 //開外部中斷 1中斷 EA=1。 //開總中斷 } void irproc(void) //解碼函數(shù) { uchar k,value,m,j。 k=1。 for(j=0。j4。j++) //4 組二進(jìn)制碼 { for(m=0。m8。m++) //每組 8 位 { value=value1。 //由于低位在前,所以右移到正常順序 if(irdata[k]6) //irtime 大于 6*256us 則解碼數(shù)據(jù)為 1 { value=value | 0x80。 //解碼數(shù)據(jù)為 1 則高位或 1 則高位置 1 } k++。 //所有二進(jìn)制碼的位 } ircode[j]=value。 //每組 解碼后的值存入 ircode } irprocok=1。 //解碼完成 } void main() { timer0init()。 //定時(shí)器初始化 int1init()。 //外部中斷初始化 while(1) 齊齊哈爾大學(xué) 11 { if(irreceok) //接收完成 { irproc()。 //解碼 irreceok=0。 } if(irprocok) //解碼完成 { irwork()。 //把 解碼后的數(shù)據(jù)轉(zhuǎn)成 16 進(jìn)制的兩位數(shù) irprocok=0。 } } } void timer0() interrupt 1 { irtime++。 } void int1() interrupt 2 { if(startflag==1) { if(irtime32) //檢測(cè) 9ms 引導(dǎo)碼 { bitnum=0。 } irdata[bitnum]=irtime。 irtime=0。 bitnum++。 if(bitnum==33) //接收 結(jié)束 { bitnum=0。 irreceok=1。 //接收完成 } } else { 齊齊哈爾大學(xué) 12 startflag=1。 //接收開始標(biāo)志位 irtime=0。 } } 播放及顯示程序 分析音樂播放的過(guò)程,其為不同頻率聲音的組合,當(dāng)一組恰當(dāng)頻率聲音組合按照一定的先后順序與節(jié)拍播放時(shí),即可產(chǎn)生音樂。故 要產(chǎn)生音頻信號(hào),只要算出某一音頻的周期,將此周期除以 2 即為半周期的時(shí)間,利用定時(shí)器計(jì)時(shí)此半周期時(shí)間,計(jì)時(shí)到后取反輸出,重復(fù)此過(guò)程即得到此頻率的聲 音信號(hào)。此信號(hào)從 腳輸出 ,用 ULN2021 驅(qū)動(dòng)蜂鳴器播放音樂 。 其中 每個(gè)音符使用兩個(gè)字節(jié) 表示: 低位字節(jié)(偶地址)代表音級(jí),表示的音級(jí)為 c、﹟ c、 d、﹟ d、 e、 f、?? a﹟ a b3; 高位字節(jié)(奇地址)代表音符的時(shí)值( 節(jié) 拍),表示拍數(shù)為 1/8 拍( )~ 8 拍( )。 程序 設(shè)計(jì) 中用軟件 延時(shí)程序來(lái)控制 音級(jí) , 與紅外解碼共用定時(shí)器 0 進(jìn)行節(jié)拍的控制, 并在 播放和暫停播放 中 隨時(shí)判斷是否有紅外信號(hào)的改變,以便隨時(shí)更換或結(jié)束 音樂。本設(shè)計(jì)中歌曲的音符存在一個(gè)數(shù)組中,以在開始位置和在中間位置播放不同的曲目。 紅外信號(hào)解碼后,用兩位共陰數(shù)碼管顯示其中的數(shù)據(jù)碼 [3]。顯示電路的 74HC573 用于數(shù)碼管的驅(qū)動(dòng), 74HC138 用于數(shù)碼管動(dòng)態(tài)掃描時(shí)的位選,蜂鳴器播放音樂源碼如下: define uchar unsigned char define uint unsigned int sbit FM=P2^3。 //定義蜂鳴器引腳 uchar count。 unsigned char code song[] ={ //祝你平安 0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20, 0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20, 0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20, 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20, 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10, 0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20, 齊齊哈爾大學(xué) 13 0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20, 0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20, 0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10, 0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80, 0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20, 0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20, 0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10, 0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00, //八月桂花遍地開 0x18,0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40, 0x1C,0x20,0x20,0x20,0x1C,0x20,0x18,0x20,0x20,0x80,0xFF,0x20,0x30,0x1C,0x10,0x18, 0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20, 0x20,0x30,0x80,0xFF,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20, 0x30,0x20,0x2B,0x40,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20, 0x30,0x20,0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20, 0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1C,0x10, 0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x15, 0x1F,0x05,0x20,0x10,0x1C,0x10,0x20