專注電子技術(shù)學習與研究
當前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

學習型紅外遙控器匯編語言程序

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2010年04月19日   【字體:

;可用,版本3 ,能接收長碼
;2001.10.20
;
;
;******************************************

;************紅外線接收程序******************

;*********************************************
;器件地址
EEPROM          EQU       0A0H
;MODE            EQU       070H           ;高四位0111,是紅外線設(shè)備型號
                                          ;低四位    ,是紅外線設(shè)備的地址


;R2,R3   是延時計數(shù)器
;R4  :脈沖電平寬度計時器,算法,計數(shù)26次(也就是26US)R4加1
;R5  :脈沖個數(shù)計數(shù)器
;內(nèi)存數(shù)據(jù)定義
SP_STATR        EQU       01H
SP_END          EQU       00H
ACK             BIT       08H           ;接收數(shù)據(jù)非應(yīng)答標志
BITCNT          DATA      15H           ;IIC數(shù)據(jù)計數(shù)器           ;SADDP:類型+地址
BYTECNT         DATA      16H           ;IIC數(shù)據(jù)字節(jié)計數(shù)器       ;SCISTEP:串行通信進程
SLVADR          DATA      14H           ;被控器地址,EEPROM的地址 ;SCILEN:后4位數(shù)據(jù)長度(幾個字節(jié))
SUBADR          DATA      17H           ;被控器單元地址          ;SCICOM:前4位是命令
RCVDAT          DATA      18H           ;接收數(shù)據(jù)緩沖區(qū)          ;CRC   :校驗寄存器
XMTDAT          DATA      19H           ;發(fā)送數(shù)據(jù)緩沖區(qū)          ;SCODE :校驗寄存器
CYCLE           DATA      22H           ;循環(huán)計數(shù)器              ;RBUFSP:接收緩沖區(qū)指針
DAT             DATA      21H           ;脈沖個數(shù)計數(shù)器          ;SCISP :發(fā)送數(shù)據(jù)緩沖區(qū)指針
STU             DATA      20H           ;學習過的置0,沒有學習過的置1
ER              DATA      13H           ;出錯標志位,為0則出錯,為1則是正確
MODE            DATA      09H           ;高四位0111,是紅外線設(shè)備型號
                                        ;低四位    ,是紅外線設(shè)備的地址

;端口位定義
IN              BIT       P1.4; P0.0           ;紅外線接收位
BZ              BIT       P0.5           ;蜂鳴器輸出位
OUT             BIT       P1.7           ;紅外線發(fā)射位
WP              BIT       P0.0;P1.4           ;寫保護,為0時可讀寫,為1時不能寫
SDA             BIT       P1.3           ;模擬IIC數(shù)據(jù)傳送位
SCL             BIT       P1.2           ;模擬IIC時鐘控制狀態(tài)標志

LED             BIT       P0.7            ;
RECE            BIT       P0.6           ;串口接收發(fā)送位

                ORG       0000H
                AJMP      MAIN
                ORG       000BH          ;定時器TO0中斷入口地址
                AJMP      LOPP
                ORG       0023H
                AJMP      SINT           ;串口中斷入口地址
                ORG       063H

;***************主程序******************************

MAIN:
               MOV        STU,#00H
               MOV        SP,#0AH
               MOV        P0M2,#080h
               CLR        LED
               MOV        DAT,#00H         ;脈沖個數(shù)計數(shù)器清0
               MOV        TMOD,#022H       ;設(shè)置定時器0和1為方式2,定時控制方式,以運行控制位TR0,TR1啟動定時器
               MOV        TH0,#00H         ;加載計數(shù)初值
               MOV        TL0,#00H         ;保存計術(shù)數(shù)值,計時
               MOV        TH1,#0FAH
               MOV        TL1,#0FAH        ;波特率為4800
               MOV   SADEN,#0FFH
               MOV   SCON,#0F0H       ;串口工作方式3,多機通信控制,允許接收
               MOV        TCON,#040H       ;啟動T1定時
               MOV        PCON,#00H        ;波特率加倍
               MOV        IEN0,#092H       ;允許定時T0中斷,
                                           ;中斷總充許
                                           ;允許串行中斷

               MOV         WDCON,#017H
             ; MOV        MODE,#70H        ;高四位0111,是紅外線設(shè)備型號
                                           ;低四位    ,是紅外線設(shè)備的地址
               LCALL       GETADDR         ;調(diào)用,檢查地址子程式
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
               MOV        PT0AD,#010H      ;禁止CIN1A(P0.4) 的數(shù)字輸入功能
               ANL        P0M2,#0EFH       ;CIN1A(P0.4)僅為輸入功能
               ORL        P0M1,#010H
               MOV        CMP1,#028H       ;正向輸入為CIN1A
                                           ;選擇內(nèi)部1.23V作為參考電壓
                                           ;比較結(jié)果輸出到中斷
             ; SETB       EC1              ;打開中比較器1中斷

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
               SETB        WP              ;禁止寫EEPROM
               SETB        TR1             ;啟動串行中斷,啟動TR1定時
               MOV         ER,#00H
;;;;;;;;;@@@@@@@@@@@@@@@@@@@@;;;;;;;;;;;;
              LCALL       LOP
              AJMP        MAIN
;;;;;;;;;@@@@@@@@@@@@@@@@@@@@;;;;;;;;;;;;;

AFFL:
              JBC        B.7,AFFL1         ;中斷返回時,接受命令正確,則調(diào)用命令處理程式
              MOV        WDRST,#01EH
              MOV        WDRST,#0E1H
              AJMP       AFFL              ;等待中斷

;********************命令處理************************************************
;主機命令: 第1個字節(jié)(前4位是設(shè)備婁型,后4位是設(shè)備地址)
;          第2個字節(jié)(前4位是命令,后4位是數(shù)據(jù)字節(jié)數(shù))
;          第3~N個字節(jié)(EEPROM的地址)
;          最后一位是CRC
;接收前四位命令: 0111  7   是查詢設(shè)備狀態(tài)
;                0101  5   是學習紅外線指令命令
;                0110  6   是發(fā)送紅外線指令命令
;從機應(yīng)答:
;發(fā)射前4位命令:  0111  7   命令已接受
;                0101  5   紅外碼學習正確
;                0000      紅外碼學習錯或超時
;接收后四位數(shù)據(jù)長度為1個字節(jié)0001
;數(shù)據(jù)字節(jié):為學習或發(fā)送的按鍵值(就是EEPROM 的地址)
;設(shè)備婁型,地址是01000000


AFFL1:
              CLR         LED
              CLR         ES                ;串行中斷關(guān)閉
              CLR         TR1
              MOV         R5, SUBADR

;********************判斷紅外線碼學習還是發(fā)射**********************************

                                            ;取得EEPROM的高低字節(jié)地址
              MOV         A,22H             ;把數(shù)據(jù)中的按鍵值入A
              CJNE        A,#04H,ORDER1     ;判斷是錯誤碼,還是正常按鍵值
              AJMP        TTMM              ;命令=4,則轉(zhuǎn)發(fā)送紅外碼子程序
ORDER1:
              JNC         TTM3              ;命令大于4,則置錯誤標志返回等待中斷
              JC          TTMM              ;命令小于4, 則順繼執(zhí)行
TTMM:
              MOV         B,#60H            ;把96放入乘數(shù)B中
              MUL         AB                ;把接收到的鍵碼乘以96,取得學習碼EEPROM
                                            ;的按鍵地址
              MOV         SUBADR,A          ;把乘積的低字節(jié)入EEPROM的低字節(jié)地址
              MOV         A,B               ;把B 存A中
              RL          A                 ;把乘積的高字節(jié)左移一位
              MOV         SLVADR,#EEPROM
              MOV         B,SLVADR
              ADD         A,B               ;把乘積的高字節(jié)與EEPROM的芯片地址相加
              MOV         SLVADR,A          ;后放入高字節(jié)
              CLR         F0                ;清出錯標志
              MOV         A,R5              ;命令前四位入A
              CJNE        A,#05H,ORDER      ;是學習紅外碼和發(fā)射碼嗎?不是置錯誤標記
              AJMP        TTM1              ;
ORDER:
              CJNE        A,#06H,TTM3       ;是學習紅外碼嗎?
TTMM1:
              LCALL       LOP               ;SUBADR=0則調(diào)用學習紅外碼子程序
              AJMP        TTM2
TTM1:
              LCALL       LDD               ;調(diào)用紅外線發(fā)射子程式
TTM2:
              JB          F0,TTM3           ;調(diào)用子程序出錯,置錯誤標記
              SETB        ES                ;打開串行中斷
              SETB        TR1
              MOV         ER,#05H           ;調(diào)用子程式正確,則置正確標記
              AJMP        AFFL              ;返回等待中斷
TTM3:
              MOV         ER,#00H
              SETB        ES                ;串行中斷打開
              SETB        TR1
              CLR         LED
              AJMP        AFFL              ;出錯返回等待中斷
;***********************************************************************
;                紅外線接收存EEPROM程序
;***********************************************************************

由于程序太大,帖子無法全部貼出 請點這里下載程序的完整版本: http://www.torrancerestoration.com/ziliao/file/STC89C52學習型遙控器.rar

關(guān)閉窗口

相關(guān)文章