• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 89S51單片機(jī)PT2221紅外解碼匯編程序

    89S51單片機(jī)PT2221紅外解碼匯編程序

    作者: 時(shí)間:2012-11-03 來(lái)源:網(wǎng)絡(luò) 收藏
    ;*******************************************************
    ;name: V1.0
    ;device: pt2221紅外編碼+解碼+紅外一體化接收頭
    ;Copyright (c) 2007-2008 張興電子設(shè)計(jì)工作室技術(shù)開(kāi)發(fā)部
    ;author: 張興
    ;web: http://mcu.5d6d.com
    ;date: 2007.7.4---14:44
    ;description: 發(fā)送的紅外編碼最前面為13.5ms的引導(dǎo)碼,而后為32位的數(shù)據(jù),32位數(shù)據(jù)的前16位為用戶(hù)碼,
    ;用于區(qū)別各個(gè)廠家的遙控器的不同,而后16位為數(shù)據(jù)碼,分前8位和后8位,前后8位互為反碼,用于檢驗(yàn)
    ;這里我們只接收了16位的數(shù)據(jù),別的數(shù)據(jù)則丟掉了,對(duì)16的數(shù)據(jù)在程序中進(jìn)行了檢驗(yàn)
    ;解碼的結(jié)果用兩種方式輸出:1.用串口以9600的波特率發(fā)送,2.四位一體數(shù)碼管顯示
    ;一體化接P3.2,即外部中斷0
    ;數(shù)碼管:P1口送段碼,P0口低四位送位碼
    ;程序中采用11.0592M的晶振,若用12M晶振只需按程序注釋的提示選擇相應(yīng)程序即可
    ;edition:V1.0
    ;**************************************************************
    b_bit equ 20h ;數(shù)碼管個(gè)位數(shù)存放內(nèi)存位置
    a_bit equ 21h ;數(shù)碼管十位數(shù)存放內(nèi)存位置
    ORG 0000H
    AJMP MAIN;轉(zhuǎn)入主程序
    ORG 0003H ;外部中斷P3.2腳INT0入口地址
    AJMP INT ;轉(zhuǎn)入外部中斷服務(wù)子程序(解碼程序)
    ;=============以下為主程序進(jìn)行CPU中斷方式設(shè)置===================================
    MAIN:SETB EA ;打開(kāi)CPU總中斷請(qǐng)求
    SETB IT0 ;設(shè)定INT0的觸發(fā)方式為脈沖負(fù)邊沿觸發(fā)
    SETB EX0 ;打開(kāi)INT0中斷請(qǐng)求
    AJMP $
    ;============以下為進(jìn)入P3.2腳外部中斷子程序,也就是解碼程序======================
    INT: CLR EA ;暫時(shí)關(guān)閉CPU的所有中斷請(qǐng)求,只處理當(dāng)前中斷,避免受外部信號(hào)干擾
    MOV R6,#10
    SB: ACALL YS1;調(diào)用882微秒延時(shí)子程序
    JB P3.2,EXIT;延時(shí)882微秒后判斷P3.2腳是否出現(xiàn)高電平如果有就退出解碼程序,(882um就出現(xiàn)高電平說(shuō)明是干擾信號(hào))
    DJNZ R6, SB;重復(fù)10次,目的是檢測(cè)在8820微秒內(nèi)如果出現(xiàn)高電平就退出解碼程序
    ;=======以上完成對(duì)遙控信號(hào)的9ms的初始低電平信號(hào)的識(shí)別======================
    JNB P3.2, $ ;等待高電平避開(kāi)9毫秒低電平引導(dǎo)脈沖
    ACALL YS2 ;延時(shí)4.74毫秒避開(kāi)4.5毫秒的結(jié)果碼
    MOV R7,#16;忽略前16位系統(tǒng)識(shí)別碼,共發(fā)送32位數(shù)據(jù),前16位為用戶(hù)碼,后16為數(shù)據(jù)碼才是我們需要的
    JJJJA:JNB P3.2,$;等待地址碼第一位的高電平信號(hào)
    LCALL YS1;高電平開(kāi)始后用882微秒的時(shí)間尺去判斷信號(hào)此時(shí)的高低電平狀態(tài)
    MOV C,P3.2;將P3.2引腳此時(shí)的電平狀態(tài)0或1存入C中
    JNC UUUA;如果為0就跳轉(zhuǎn)到UUUA
    LCALL YS3;檢測(cè)到高電平1的話(huà)延時(shí)1毫秒等待脈沖高電平結(jié)束
    UUUA: DJNZ R7,JJJJA
    ;==============到此為止,已跳過(guò)13.5ms的引導(dǎo)碼和前16位的用戶(hù)碼=====================
    MOV R1,#1AH ;設(shè)定1AH為起始RAM區(qū)
    MOV R2,#2;接收從1AH到1BH的2個(gè)內(nèi)存,用于存放操作碼和操作反碼,
    ;16位數(shù)據(jù)分前8位和后8位,后8位是前8位的反碼,用于檢驗(yàn)
    PP: MOV R3,#8;每組數(shù)據(jù)為8位
    JJJJ: JNB P3.2,$;等待地址碼第一位的高電平信號(hào)
    LCALL YS1;高電平開(kāi)始后用882微秒的時(shí)間尺去判斷信號(hào)此時(shí)的高低電平狀態(tài)
    MOV C,P3.2;將P3.2引腳此時(shí)的電平狀態(tài)0或1存入C中
    JNC UUU;如果為0就跳轉(zhuǎn)到UUU
    LCALL YS3;檢測(cè)到高電平1的話(huà)延時(shí)1毫秒等待脈沖高電平結(jié)束,然后把C中的1存入R1
    UUU: MOV A,@R1;將R1中的數(shù)據(jù)給A
    RRC A;將C中的值0或1移入A中的最低位
    MOV @R1,A;將A中的數(shù)暫時(shí)存放在R1數(shù)值的內(nèi)存中
    DJNZ R3,JJJJ;接收滿(mǎn)8位換一個(gè)內(nèi)存
    INC R1;對(duì)R1中的值加1,換下一個(gè)RAM
    DJNZ R2,PP ;接收完8位數(shù)據(jù)碼和8位數(shù)據(jù)反碼,存放在1AH/1BH中
    ;==================上面的程序已完成了16位數(shù)據(jù)碼的接收工作,下面進(jìn)行檢驗(yàn)==================
    MOV A,1AH
    CPL A;對(duì)1AH取反后和1BH比較
    CJNE A,1BH,EXIT;如果不等表示接收數(shù)據(jù)發(fā)生錯(cuò)誤,放棄
    ;====================校驗(yàn)正確則繼續(xù)執(zhí)行下面程序,不正確則作為干擾丟棄===================
    LCALL SEND;調(diào)用串口發(fā)送程序,把16位數(shù)據(jù)碼用串口發(fā)送出去
    LCALL DISPLAY;把16位數(shù)據(jù)碼送數(shù)碼管顯示
    CLR P3.5;P3.5口上的LED閃爍一次,表示解碼成功
    LCALL YS2
    LCALL YS2
    LCALL YS2
    SETB P3.5;
    ;==================退出子程序,解碼出錯(cuò)時(shí)退出解碼子程序========================
    EXIT: SETB EA ;允許中斷
    RETI ;退出解碼子程序
    ;===================串口發(fā)送子程序============================================
    SEND:mov a,1AH;將1AH中的十六進(jìn)制數(shù)轉(zhuǎn)換成16進(jìn)制
    mov b,#16 ;10進(jìn)制/16=16進(jìn)制,此時(shí)輸出按鍵的16進(jìn)制編碼,00~1F
    div ab
    SWAP A
    ADD A,B
    mov 30H,a;轉(zhuǎn)換為16進(jìn)制代碼后存到30H
    MOV TMOD,#20H
    MOV TL1,#0FDH
    MOV TH1,#0FDH
    MOV SCON,#40H
    MOV PCON,0
    CLR TI
    CLR RI
    SETB TR1
    MOV R0,#30H
    MOV A,@R0
    MOV SBUF,A
    WAIT:JNB TI,WAIT
    CLR TI
    RET
    ;******************************************顯示子程序********************************************
    display:mov a,1AH;將1AH中的十六進(jìn)制數(shù)轉(zhuǎn)換成10進(jìn)制或16進(jìn)制
    mov b,#10 ;10進(jìn)制/10=10進(jìn)制,此時(shí)輸出按鍵對(duì)應(yīng)的鍵號(hào),00~31
    ;mov b,#16 ;10進(jìn)制/16=16進(jìn)制,此時(shí)輸出按鍵的16進(jìn)制編碼,00~1F
    div ab
    mov a_bit,a ;十位在a
    mov b_bit,b ;個(gè)位在b
    mov dptr,#numtab ;指定查表啟始地址
    mov r0,#4
    dpl1: mov r1,#250 ;顯示1000次
    dplop: mov a,b_bit ;取個(gè)位數(shù)
    MOVC A,@A+DPTR ;查個(gè)位數(shù)的7段代碼
    mov p1,a ;送出個(gè)位的7段代碼
    SETB p0.0 ;開(kāi)個(gè)位顯示
    acall d1ms ;顯示1ms
    CLR P0.0
    mov a,a_bit ;取十位數(shù)
    MOVC A,@A+DPTR ;查十位數(shù)的7段代碼
    mov p1,a ;送出十位的7段代碼
    SETB P0.1 ;開(kāi)十位顯示
    acall d1ms ;顯示1ms
    CLR P0.1
    CLR P0.2
    CLR P0.3
    djnz r1,dplop ;100次沒(méi)完循環(huán)
    djnz r0,dpl1 ;4個(gè)100次沒(méi)完循環(huán)
    ret
    D1MS:MOV R4,#250 ;延時(shí)1ms
    DJNZ R4,$
    RET
    numtab:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;字形碼表"0","1","2"~"7"
    DB7FH,6FH,77H,7CH,39H,5EH,79H,71H ;字形碼表"8","9","A"~"F"
    ;=============延時(shí)子程序1,精確延時(shí)882微秒=========================================
    ;YS1: MOV R4,#20 ;12M晶振請(qǐng)用此句延時(shí)
    YS1: MOV R4,#17 ;11.0592M晶振請(qǐng)用此句延時(shí)
    D1: MOV R5,#20
    DJNZ R5,$
    DJNZ R4,D1
    RET
    ;============延時(shí)子程序2,精確延時(shí)4740微秒==========================================
    YS2: MOV R4,#10 ;
    ;D2: MOV R5,#235;12M晶振請(qǐng)用此句延時(shí)
    D2: MOV R5,#217;11.0592M晶振請(qǐng)用此句延時(shí)
    DJNZ R5,$
    DJNZ R4,D2
    RET
    ;=============延時(shí)程序3,精確延時(shí)1000微秒===========================================
    YS3: MOV R4,#2;
    ;D3:MOV R5,#248;12M晶振請(qǐng)用此句延時(shí)
    D3:MOV R5,#230;11.0592M晶振請(qǐng)用此句延時(shí)
    DJNZ R5,$
    DJNZ R4,D3
    RET
    ;=========================
    END

    萬(wàn)能遙控器相關(guān)文章:萬(wàn)能遙控器代碼


    51單片機(jī)相關(guān)文章:51單片機(jī)教程


    紅外遙控器相關(guān)文章:紅外遙控器原理


    評(píng)論


    相關(guān)推薦

    技術(shù)專(zhuān)區(qū)

    關(guān)閉
    主站蜘蛛池模板: 莒南县| 巴南区| 玛多县| 依兰县| 石柱| 虎林市| 海安县| 福鼎市| 色达县| 诸城市| 花莲县| 乐业县| 本溪| 陕西省| 青田县| 鄂伦春自治旗| 平江县| 河南省| 姚安县| 镇宁| 南溪县| 临沧市| 乌什县| 祁东县| 上栗县| 光泽县| 乌兰浩特市| 汶川县| 重庆市| 县级市| 厦门市| 台中市| 抚远县| 酉阳| 老河口市| 岳普湖县| 竹北市| 万宁市| 蒙阴县| 湘潭市| 长沙县|