新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STC89C52學習型遙控器源程序

        STC89C52學習型遙控器源程序

        作者: 時間:2012-09-03 來源:網絡 收藏

        做的,可存八個紅外遙控信息,只要再把按鍵用定時器中斷2完成就可以用于商業生產.

        本文引用地址:http://www.104case.com/article/170931.htm

        RXIN BIT P2.0
        TXZAI BIT P2.2
        TXOUT BIT P2.1
        KEY_SIGN BIT 20H ;為0按鍵錯誤,為1按鍵正確
        RXTX_SIGN BIT 21H ;為0是為發射狀態,為1是為接收狀態

        ISP_DATA DATA 0E2H ;ISP功能寄存器定義
        ISP_ADDRH DATA 0E3H
        ISP_ADDRL DATA 0E4H
        ISP_CMD DATA 0E5H
        ISP_TRIG DATA 0E6H
        ISP_CONTR DATA 0E7H

        ISP_CMD_NO EQU 0 ;操作數
        ISP_CMD_READ EQU 1
        ISP_CMD_PROGRAM EQU 2
        ISP_CMD_ERASE EQU 3

        WAIT_TIME EQU 1 ;等待時間

        ZHIL EQU 30H
        ZHIH EQU 31H
        GESHU EQU 32H
        JISHU EQU 33H
        KEY_WORD EQU 34H
        KEY_VALUE EQU 35H
        ADDRH EQU 36H
        ADDRL EQU 37H
        TX_GESHU EQU 38H


        ORG 0000H
        LJMP START
        ORG 000BH
        LJMP T0IN
        ORG 001BH
        LJMP T1IN

        ORG 0100H
        START: MOV SP,#10H
        CLR RXTX_SIGN
        LJMP KEY_MAIN


        KEY_MAIN:LCALL SCAN_KEY ;檢測有沒有單個按鍵按下
        MOV A,KEY_WORD
        CJNE A,#00H,NEXT1
        LJMP KEY_MAIN
        NEXT1: JNB KEY_SIGN,KEY_MAIN
        MOV KEY_VALUE,A

        LCALL RE_DELAY ;消抖時間20ms

        LCALL SCAN_KEY ;是否依然是按下的
        MOV A,KEY_WORD
        CJNE A,#00H,NEXT2
        LJMP KEY_MAIN
        NEXT2: JNB KEY_SIGN,KEY_MAIN
        CJNE A,KEY_VALUE,KEY_MAIN

        RELEASE: LCALL SCAN_KEY ;查看是否放開按鍵了
        MOV A,KEY_WORD
        CJNE A,#00H,RELEASE



        MOV DPTR,#TAB ;執行相應的程式
        CLR C
        MOV A,KEY_VALUE
        ADD A,KEY_VALUE
        JMP @A+DPTR

        TAB: AJMP KEY_0
        AJMP KEY_1
        AJMP KEY_2
        AJMP KEY_3
        AJMP KEY_4
        AJMP KEY_5
        AJMP KEY_6
        AJMP KEY_7
        AJMP KEY_8
        AJMP KEY_9
        AJMP KEY_10
        AJMP KEY_11
        AJMP KEY_12
        AJMP KEY_13
        AJMP KEY_14
        AJMP KEY_15
        AJMP KEY_16

        KEY_0: LJMP KEY_MAIN ;無效的按健值

        KEY_1: JNB RXTX_SIGN,T1RX ;接收發送鍵設定鍵,P1燈亮為接收存儲狀態,燈滅是為發射狀態
        T1TX: CLR RXTX_SIGN
        MOV P1,#0FFH
        LJMP KEY_MAIN
        T1RX: SETB RXTX_SIGN
        MOV P1,#00H
        LJMP KEY_MAIN

        KEY_2: MOV ADDRH,#20H
        MOV ADDRL,#00H
        JB RXTX_SIGN,KEY2_RX
        KEY2_TX:LJMP TX_START
        KEY2_RX:LJMP RX_START


        KEY_3: MOV ADDRH,#22H
        MOV ADDRL,#00H
        JB RXTX_SIGN,KEY3_RX
        KEY3_TX:LJMP TX_START
        KEY3_RX:LJMP RX_START


        KEY_4: MOV ADDRH,#24H
        MOV ADDRL,#00H
        JB RXTX_SIGN,KEY4_RX
        KEY4_TX:LJMP TX_START
        KEY4_RX:LJMP RX_START


        KEY_5: MOV ADDRH,#26H
        MOV ADDRL,#00H
        JB RXTX_SIGN,KEY5_RX
        KEY5_TX:LJMP TX_START
        KEY5_RX:LJMP RX_START


        KEY_6: MOV ADDRH,#28H
        MOV ADDRL,#00H
        JB RXTX_SIGN,KEY6_RX
        KEY6_TX:LJMP TX_START
        KEY6_RX:LJMP RX_START


        KEY_7: MOV ADDRH,#2AH
        MOV ADDRL,#00H
        JB RXTX_SIGN,KEY7_RX
        KEY7_TX:LJMP TX_START
        KEY7_RX:LJMP RX_START


        KEY_8: MOV ADDRH,#2CH
        MOV ADDRL,#00H
        JB RXTX_SIGN,KEY8_RX
        KEY8_TX:LJMP TX_START
        KEY8_RX:LJMP RX_START


        KEY_9: MOV ADDRH,#2EH
        MOV ADDRL,#00H
        JB RXTX_SIGN,KEY9_RX
        KEY9_TX:LJMP TX_START
        KEY9_RX:LJMP RX_START

        KEY_10: MOV ADDRH,#2EH
        MOV ADDRL,#00H
        JB RXTX_SIGN,KEY10_RX
        KEY10_TX:LJMP TX_START
        KEY10_RX:LJMP RX_START


        KEY_11: MOV ADDRH,#2EH
        MOV ADDRL,#00H
        JB RXTX_SIGN,KEY11_RX
        KEY11_TX:LJMP TX_START
        KEY11_RX:LJMP RX_START

        KEY_12: MOV ADDRH,#2EH
        MOV ADDRL,#00H
        JB RXTX_SIGN,KEY12_RX
        KEY12_TX:LJMP TX_START
        KEY12_RX:LJMP RX_START


        KEY_13: MOV ADDRH,#2EH
        MOV ADDRL,#00H
        JB RXTX_SIGN,KEY13_RX
        KEY13_TX:LJMP TX_START
        KEY13_RX:LJMP RX_START


        KEY_14: MOV ADDRH,#2EH
        MOV ADDRL,#00H
        JB RXTX_SIGN,KEY14_RX
        KEY14_TX:LJMP TX_START
        KEY14_RX:LJMP RX_START


        KEY_15: MOV ADDRH,#2EH
        MOV ADDRL,#00H
        JB RXTX_SIGN,KEY15_RX
        KEY15_TX:LJMP TX_START
        KEY15_RX:LJMP RX_START


        KEY_16: MOV ADDRH,#2EH
        MOV ADDRL,#00H
        JB RXTX_SIGN,KEY16_RX
        KEY16_TX:LJMP TX_START
        KEY16_RX:LJMP RX_START

        SCAN_KEY:CLR KEY_SIGN
        MOV KEY_WORD,#00H


        KEY1: MOV P3,#11111110B ;第一行
        JB P3.4,KEY2
        JB KEY_SIGN,KEYWRONG1
        MOV KEY_WORD,#1
        SETB KEY_SIGN
        KEY2: JB P3.5,KEY3
        JB KEY_SIGN,KEYWRONG1
        MOV KEY_WORD,#2
        SETB KEY_SIGN
        KEY3: JB P3.6,KEY4
        JB KEY_SIGN,KEYWRONG1
        MOV KEY_WORD,#3
        SETB KEY_SIGN
        KEY4: JB P3.7,KEY5
        JB KEY_SIGN,KEYWRONG1
        MOV KEY_WORD,#4
        SETB KEY_SIGN
        LJMP KEY5
        KEYWRONG1: LJMP KEYWRONG

        KEY5: MOV P3,#11111101B ;第二行
        JB P3.4,KEY6
        JB KEY_SIGN,KEYWRONG2
        MOV KEY_WORD,#5
        SETB KEY_SIGN
        KEY6: JB P3.5,KEY7
        JB KEY_SIGN,KEYWRONG2
        MOV KEY_WORD,#6
        SETB KEY_SIGN
        KEY7: JB P3.6,KEY8
        JB KEY_SIGN,KEYWRONG2
        MOV KEY_WORD,#7
        SETB KEY_SIGN
        KEY8: JB P3.7,KEY9
        JB KEY_SIGN,KEYWRONG2
        MOV KEY_WORD,#8
        SETB KEY_SIGN
        LJMP KEY9

        KEYWRONG2:LJMP KEYWRONG

        KEY9: MOV P3,#11111011B ;第三行
        JB P3.4,KEY10
        JB KEY_SIGN,KEYWRONG3
        MOV KEY_WORD,#9
        SETB KEY_SIGN
        KEY10: JB P3.5,KEY11
        JB KEY_SIGN,KEYWRONG3
        MOV KEY_WORD,#10
        SETB KEY_SIGN
        KEY11: JB P3.6,KEY12
        JB KEY_SIGN,KEYWRONG3
        MOV KEY_WORD,#11
        SETB KEY_SIGN
        KEY12: JB P3.7,KEY13
        JB KEY_SIGN,KEYWRONG3
        MOV KEY_WORD,#12
        SETB KEY_SIGN
        LJMP KEY13

        KEYWRONG3:LJMP KEYWRONG

        KEY13: MOV P3,#11110111B ;第四行
        JB P3.4,KEY14
        JB KEY_SIGN,KEYWRONG4
        MOV KEY_WORD,#13
        SETB KEY_SIGN
        KEY14: JB P3.5,KEY15
        JB KEY_SIGN,KEYWRONG4
        MOV KEY_WORD,#14
        SETB KEY_SIGN
        KEY15: JB P3.6,KEY16
        JB KEY_SIGN,KEYWRONG4
        MOV KEY_WORD,#15
        SETB KEY_SIGN
        KEY16: JB P3.7,SCAN_END
        JB KEY_SIGN,KEYWRONG4
        MOV KEY_WORD,#16
        SETB KEY_SIGN
        LJMP SCAN_END

        KEYWRONG4: LJMP KEYWRONG

        KEYWRONG:CLR KEY_SIGN
        SCAN_END:RET

        RE_DELAY:MOV R7,#5
        DE2:MOV R6,#10
        DE1:MOV R5,#200
        DJNZ R5,$
        DJNZ R6,DE1
        DJNZ R7,DE2
        RET


        RX_START: CLR P2.4 ;接收紅外信號,存入外部擴展寄存器0~256
        CLR P2.6
        CLR P2.7
        CLR P2.2
        CLR TXOUT
        MOV R1,#00H
        MOV R0,#00H
        MOV TMOD,#00010001B
        MOV TH0,#00H
        MOV TL0,#00H
        MOV TH1,#00H
        MOV TL1,#00H
        CLR ET0
        CLR ET1
        CLR EA
        CLR TR0
        CLR TR1
        LJMP RX_MAIN

        RX_MAIN: MOV R0,#00H
        JB RXIN,$
        SETB TR0

        JUDGE1: JB TF0,RXEND
        JNB RXIN,JUDGE1
        CLR TR0
        SETB TR1
        MOV A,TL0
        MOVX @R0,A
        INC R0
        MOV A,TH0
        MOVX @R0,A
        INC R0
        MOV TL0,#00H
        MOV TH0,#00H
        INC R1
        JUDGE2: JB TF1,RXEND
        JB RXIN,JUDGE2
        CLR TR1
        SETB TR0
        MOV A,TL1
        MOVX @R0,A
        INC R0
        MOV A,TH1
        MOVX @R0,A
        INC R0
        MOV TL1,#00H
        MOV TH1,#00H
        INC R1
        AJMP JUDGE1

        RXEND: CLR TR0
        CLR TR1
        CLR TF0
        CLR TF1
        MOV TL0,#00H
        MOV TH0,#00H
        MOV TL1,#00H
        MOV TH1,#00H
        MOV GESHU,R1


        MOV R1,GESHU ;取反轉換重新存入外部擴展寄存器
        MOV R0,#00H
        LOOP_CPL: MOVX A,@R0
        CPL A
        MOVX @R0,A
        INC R0
        MOVX A,@R0
        CPL A
        MOVX @R0,A
        INC R0
        DJNZ R1,LOOP_CPL
        LJMP ISP_STORE

        ISP_STORE: LCALL ISP_ERASE


        MOV ISP_DATA,GESHU ;將個數輸入到ISP_EEPROM的第一位
        MOV ISP_ADDRH,ADDRH
        MOV ISP_ADDRL,ADDRL
        CLR EA
        MOV ISP_CONTR,#WAIT_TIME
        ORL ISP_CONTR,#10000000B
        MOV ISP_CMD,#ISP_CMD_PROGRAM
        MOV ISP_TRIG,#46H
        MOV ISP_TRIG,#0B9H
        NOP


        MOV R1,GESHU
        MOV R0,#00H
        LOOP_WRITE: LCALL BYTE_WRITE ;將擴展寄存器中的計時值依次放入ISP_EEPROM第二位開始的存儲器中
        INC R0
        LCALL BYTE_WRITE
        INC R0
        DJNZ R1,LOOP_WRITE

        MOV ISP_CMD,#00H ;ISP指令清零,防止誤觸發
        MOV ISP_TRIG,#00H
        MOV ISP_ADDRH,#00H
        MOV ISP_ADDRL,#00H
        mov p1,geshu

        LJMP KEY_MAIN

        BYTE_WRITE: MOVX A,@R0
        MOV ISP_DATA,A
        MOV ISP_ADDRH,ADDRH
        INC R0
        MOV ISP_ADDRL,R0
        DEC R0
        CLR EA
        MOV ISP_CONTR,#WAIT_TIME
        ORL ISP_CONTR,#10000000B
        MOV ISP_CMD,#ISP_CMD_PROGRAM
        MOV ISP_TRIG,#46H
        MOV ISP_TRIG,#0B9H
        NOP
        RET

        ISP_ERASE: MOV ISP_ADDRH,ADDRH
        MOV ISP_ADDRL,ADDRL
        CLR EA
        MOV ISP_CONTR,#WAIT_TIME
        ORL ISP_CONTR,#10000000B
        MOV ISP_CMD,#ISP_CMD_ERASE
        MOV ISP_TRIG,#46H
        MOV ISP_TRIG,#0B9H
        NOP
        RET


        TX_START: MOV ISP_ADDRH,ADDRH ;取出第一位的個數
        MOV ISP_ADDRL,ADDRL
        CLR EA
        MOV ISP_CONTR,#WAIT_TIME
        ORL ISP_CONTR,#10000000B
        MOV ISP_CMD,#ISP_CMD_READ
        MOV ISP_TRIG,#46H
        MOV ISP_TRIG,#0B9H
        NOP
        MOV ISP_CMD,#00H ;ISP指令清零,防止誤觸發
        MOV ISP_TRIG,#00H
        MOV ISP_ADDRH,#00H
        MOV ISP_ADDRL,#00H

        MOV A,ISP_DATA ;為0FF則是錯誤的,回去,不為0FF則繼續
        CJNE A,#0FFH,ISP_READ
        LJMP KEY_MAIN


        ISP_READ: MOV GESHU,ISP_DATA
        MOV R1,GESHU
        MOV R0,#00H
        LOOP_READ: LCALL BYTE_READ
        INC R0
        LCALL BYTE_READ
        INC R0
        DJNZ R1,LOOP_READ
        LJMP TX_EXROM


        BYTE_READ: INC R0
        MOV ISP_ADDRH,ADDRH
        MOV ISP_ADDRL,R0
        DEC R0
        CLR EA
        MOV ISP_CONTR,#WAIT_TIME
        ORL ISP_CONTR,#10000000B
        MOV ISP_CMD,#ISP_CMD_READ
        MOV ISP_TRIG,#46H
        MOV ISP_TRIG,#0B9H
        NOP
        MOV A,ISP_DATA
        MOVX @R0,A
        RET


        TX_EXROM: MOV TMOD,#00010010B
        MOV TH0,#0F4H
        MOV TL0,#0F4H
        MOV R1,GESHU
        MOV R0,#00H
        MOVX A,@R0
        MOV TL1,A
        INC R0
        MOVX A,@R0
        MOV TH1,A
        INC R0
        DEC R1
        MOVX A,@R0
        MOV ZHIL,A
        INC R0
        MOVX A,@R0
        MOV ZHIH,A
        INC R0
        DEC R1

        SETB ET1
        SETB ET0
        SETB EA
        SETB TR1
        SETB TR0
        CLR TXOUT

        MAIN2:CJNE R1,#00H,MAIN2
        CLR TXOUT
        mov p1,#55h
        LJMP KEY_MAIN


        T0IN:CPL TXZAI
        RETI

        T1IN: MOV TL1,ZHIL
        MOV TH1,ZHIH
        JB TR0,NEXTT1
        SETB TR0
        LJMP NEXTT
        NEXTT1:CLR TR0
        CLR TXZAI

        NEXTT:CPL TXOUT
        MOVX A,@R0
        MOV ZHIL,A
        INC R0
        MOVX A,@R0
        MOV ZHIH,A
        INC R0
        DJNZ R1,OUTTI
        CLR TR1
        CLR TR0
        CLR TXZAI
        CLR TXOUT
        OUTTI:RETI

        DELAYXMS:MOV R7,#255
        DEL1:MOV R6,#4
        DEL2:MOV R5,#5
        DJNZ R5,$
        DJNZ R6,DEL2
        DJNZ R7,DEL1
        RET

        DELAYX2MS:MOV R7,#255
        DEL12:MOV R6,#50
        DEL22:MOV R5,#50
        DJNZ R5,$
        DJNZ R6,DEL22
        DJNZ R7,DEL12
        RET


        END



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 丹阳市| 桑植县| 文山县| 景德镇市| 泗洪县| 九龙县| 商城县| 乌兰察布市| 黄平县| 锦州市| 仁怀市| 宣化县| 哈尔滨市| 永丰县| 白玉县| 子洲县| 读书| 左权县| 闻喜县| 江华| 两当县| 绥阳县| 金寨县| 确山县| 太仆寺旗| 苗栗县| 西充县| 额济纳旗| 措勤县| 许昌县| 九龙城区| 宁明县| 铁力市| 城固县| 金门县| 汉中市| 邯郸市| 界首市| 松潘县| 呼图壁县| 锦州市|