|
用51單片機(jī)實(shí)現(xiàn)的用紅外線控制電子琴的部分程序,可借用。
該程序可以實(shí)現(xiàn)用紅外遙控器控制JD51蜂鳴器發(fā)出不同音調(diào)與歌曲,其中1~7分別發(fā)出dou rai mi fa so la ti的音調(diào),8和9分別會(huì)播放一首歌曲。
另附有“紅外接收與控制”子程序,請(qǐng)大家務(wù)必先單獨(dú)運(yùn)行子程序,弄明白遙控器上1~9對(duì)應(yīng)的二進(jìn)制編碼方式,并模仿示例中的操作,進(jìn)行補(bǔ)充完善。
說(shuō)明:該例子除了沒(méi)有按鍵2~7,9的功能,還缺少歌曲播放中的中斷程序?qū)崿F(xiàn),請(qǐng)大家完善,謝謝!
單片機(jī)匯編語(yǔ)言源程序如下:
- ORG 0030H
- public infrared
- ;DELAYY SEGMENT CODE
- ;RSEG AELAYY
-
- INFRARED:
- JNB P3.2,IR ;遙控掃描
- LJMP INFRARED ;在正常無(wú)遙控信號(hào)時(shí),一體化紅外接收頭輸出是高電平,程序一直在循環(huán)。
-
- ;=================================================
- ; 解碼程序
- IR:
- ;以下對(duì)遙控信號(hào)的9000微秒的初始低電平信號(hào)的識(shí)別
- MOV R6,#10
- IR_SB:
- ACALL DELAY882 ;調(diào)用882微秒延時(shí)子程序
- JB P3.2,IR_ERROR ;延時(shí)882微秒后判斷P2.2腳是否出現(xiàn)高電平如果有就退出解碼程序
- DJNZ R6,IR_SB ;重復(fù)10次,目的是檢測(cè)在8820微秒內(nèi)如果出現(xiàn)高電平就退出解碼程序
-
- ;識(shí)別連發(fā)碼,和跳過(guò)4.5ma的高電平。
- JNB P3.2, $ ;等待高電平避開(kāi)9毫秒低電平引導(dǎo)脈沖
- ACALL DELAY2400
- JNB P3.2,IR_Rp ;這里為低電平,認(rèn)為是連發(fā)碼信號(hào),見(jiàn)圖6。
- ACALL DELAY2400 ;延時(shí)4.74毫秒避開(kāi)4.5毫秒的結(jié)果碼
-
- ;以下32數(shù)據(jù)碼的讀取 ,0和1的識(shí)別 請(qǐng)看圖2
- MOV R1,#1AH ;設(shè)定1AH為起始RAM區(qū)
- MOV R2,#4
- IR_4BYTE:
- MOV R3,#8
- IR_8BIT:
- JNB P3.2,$ ;等待地址碼第一位的高電平信號(hào)
- LCALL DELAY882 ;高電平開(kāi)始后用882微秒的時(shí)間尺去判斷信號(hào)此時(shí)的高低電平狀態(tài)
- MOV C,P3.2 ;將P2.2引腳此時(shí)的電平狀態(tài)0或1存入C中
- JNC IR_8BIT_0 ;如果為0就跳轉(zhuǎn)到IR_8BIT_0
- LCALL DELAY1000
- IR_8BIT_0:
- MOV A,@R1 ;將R1中地址的給A
- RRC A ;將C中的值0或1移入A中的最低位
- MOV @R1,A ;將A中的數(shù)暫時(shí)存放在R1中
- DJNZ R3,IR_8BIT ;接收地址碼的高8位
- INC R1 ;對(duì)R1中的值加1,換下一個(gè)RAM
- DJNZ R2,IR_4BYTE ;接收完16位地址碼和8位數(shù)據(jù)碼和8位數(shù)據(jù),
- ;存放在1AH/1BH/1CH/1DH的RAM中
- ;解碼成功
- JMP IR_GOTO
-
- IR_Rp:
- ;這里為重復(fù)碼執(zhí)行處
- ;按住遙控按鍵時(shí),每過(guò)108ms就到這里來(lái)
- JMP IR_GOTO
-
- IR_ERROR:
- ;錯(cuò)語(yǔ)退出
- LJMP INFRARED ;退出解碼子程序
-
- ;=================================================
- ;遙控執(zhí)行部份
- IR_GOTO:
- ;這里還要判斷1AH和1BH 兩個(gè)系統(tǒng)碼或用戶碼,用于識(shí)別不同的遙控器
- ;MOV A,1AH
- ;CJNE A,#xxH,IR_ERROR ;用戶碼1不對(duì)則退出
- ;MOV A,1BH
- ;CJNE A,#xxH,IR_ERROR ;用戶碼2不對(duì)則退出
-
-
-
- ;判斷兩個(gè)數(shù)據(jù)碼是否相反
- MOV A,1CH
- CPL A
- CJNE A,1DH,IR_ERROR ;兩個(gè)數(shù)據(jù)碼不相反則退出
- ;遙控執(zhí)行部份
- ;MOV A,1DH ;判斷對(duì)應(yīng)按鍵
- ;CJNE A,#xxH,$+6
- ;LJMP -à跳到對(duì)應(yīng)按鍵執(zhí)行處
- ;CJNE A,#xxH,$+6
- ;LJMP -à跳到對(duì)應(yīng)按鍵執(zhí)行處
- ;.
- MOV R0,1DH ;
- KEYP0:
- CLR TR0
- SETB P2.4 ;關(guān)蜂鳴器
- SETB P2.3 ;關(guān)數(shù)碼管
- // MOV P1,R0
- CJNE R0,#11110011B,L1 ;!!!非常關(guān)鍵的一步,遙控器上的按鍵1對(duì)應(yīng)的二進(jìn)制碼為 11110011,所以此處判斷是否是按鍵1按下,獲得的功能相當(dāng)于板子的S1
- ; 如果不是按鍵1,則跳轉(zhuǎn)繼續(xù)判斷是否是別的按鍵,此處弱化了功能,只寫(xiě)了按鍵1 和8,
- ;所以此時(shí)大家的任務(wù)就是參考這個(gè)例子和原有的電子音調(diào)發(fā)生器程序,繼續(xù)添加按鍵2~7,以及9的內(nèi)容,從而完善功能
- SETB P2.4 ;蜂鳴器置于高電平
- MOV R4,#200
- MAIN01:MOV TMOD,#01H
- MOV TL0,#021H ;寫(xiě)入計(jì)數(shù)初值
- MOV TH0,#0F9H
- SETB TR0
- WAIT1:JNB TF0,WAIT1
- CLR TF0
- CPL P2.4 ;蜂鳴器響
- CLR P2.3 ;數(shù)碼管顯示2
- MOV A,#11111001B
- MOV P0,A
- DJNZ R4,MAIN01 ;數(shù)碼管顯示1
-
-
- L1:CJNE R0,#10101101B,L2 ; 判斷是否是按鍵8按下,如果是,發(fā)出一段音樂(lè)
- MUSTART1:
- MOV R0,#00H ;節(jié)拍表指針置零
- MOV R1,#00H ;音符表指針置零
- RTAB:MOV A,R0
- MOV DPTR,#RYTH
- MOVC A,@A+DPTR ;查表法將一個(gè)節(jié)拍數(shù)據(jù)取出放R2計(jì)數(shù)器中
- MOV R2,A
- TTAB:MOV A,R1
- MOV DPTR,#TONE
- MOVC A,@A+DPTR
- MOV R3,A ;取出音符表高8位
- INC R1 ;指針加1
- MOV A,R1
- MOV DPTR,#TONE
- MOVC A,@A+DPTR
- MOV R4,A ;取出低8位
- SETB P2.4
- LOOP:MOV R5,#3BH
- JMP MAIN
- L2:JMP L3
- MAIN:MOV TMOD,#01H
- MOV TL0,R4
- MOV TH0,R3
- SETB TR0
- WAIT:JNB TF0,WAIT
- CLR TF0
- CPL P2.4
- RA: DJNZ R5,MAIN ;無(wú)打斷則繼續(xù)放第一首歌
- DJNZ R2,LOOP
- INC R0 ;兩個(gè)表的指針都加1
- INC R1
- CJNE R1,#88,RTAB ;判斷是否取完
- LJMP KEYP0
- TONE:
- DB 0FBH,68H,0FDH,6EH,0FDH,45H,0FCH,0EFH,0FCH,8FH,0FCH,8FH,0FCH,8FH,0FCH,5BH,0FCH,8FH
- DB 0FCH,0EFH,0FDH,45H,0FBH,68H,0FBH,68H,0FCH,8FH,0FCH,5BH,0FBH,0E9H,0FBH,68H,0FBH,68H
- DB 0FAH,0DBH,0FAH,8CH,0F9H,21H,0FAH,8CH,0FAH,0D8H,0FBH,68H,0FBH,68H,0FBH,68H,0FBH,68H
- DB 0FBH,0E9H,0FBH,0E9H,0FBH,68H,0FBH,0E9H,0FCH,5BH,0FAH,8CH,0FCH,8FH,0FCH,8FH,0FCH,5BH
- DB 0FCH,8FH,0FCH,0EFH,0FCH,0EFH,0FCH,0EFH,0FCH,8FH,0FDH,45H,0FDH,6EH,0FCH,0EFH
- RYTH:
- DB 04,04,04,04,04,04,04,04,04,04
- DB 04,05,04,04,04,04,04,04,04,04
- DB 04,04,04,06,04,04,04,07,04,04
- DB 04,04,04,06,04,04,04,07,04,04
- DB 04,04,04,04
- L3:
-
- ;清除遙控值使連按失效
- MOV 1AH,#00H
- MOV 1BH,#00H
- MOV 1CH,#00H
- MOV 1DH,#00H
- LJMP INFRARED
- ;=================================================
- ; 延時(shí)子程序
- ;=============================882
- ;1.085x ((202x4)+5)=882
- DELAY882:
- MOV R7,#202
- DELAY882_A:
- NOP
- NOP
- DJNZ R7,DELAY882_A
- RET
-
- ;=============================1000
- ;1.085x ((229x4)+5)=999.285
- DELAY1000:
- MOV R7,#229
- DELAY1000_A:
- NOP
- NOP
- DJNZ R7,DELAY1000_A
- RET
- ;=============================2400
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
|
-
-
紅外遙控電子琴示例程序.zip
2018-6-8 20:08 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
4.91 KB, 下載次數(shù): 94, 下載積分: 黑幣 -5
評(píng)分
-
查看全部評(píng)分
|