?? 5.asm
字號:
; *************************************
; * 單鍵遙控碼學(xué)習(xí)控制器 *
; * 2001.11.29 *
; *************************************
;
;
;**********************************************************************
;* *
;* P1.0 1 40 VCC *
;* P1.1 2 39 P0.0 *
;* P1.2 3 38 P0.1 *
;* P1.3 4 37 P0.2 *
;* P1.4 5 36 P0.3 *
;* P1.5 6 35 P0.4 *
;* STUDYLAMP P1.6 7 34 P0.5 *
;* LAMP P1.7 8 33 P0.6 *
;* RST 9 32 P0.7 *
;* RXD P3.0 10 MCS-51 31 EA VDD *
;* TXD P3.1 11 30 ALE *
;* STUDYKEY INT0 P3.2 12 29 PSEN *
;* INT1 P3.3 13 28 P2.7 *
;* REMOTEIN T0 P3.4 14 27 P2.6 *
;* REMOTEOUT T1 P3.5 15 26 P2.5 *
;* WR P3.6 16 25 P2.4 *
;* RD P3.7 17 24 P2.3 *
;* XTAL2 18 23 P2.2 *
;* XTAL1 19 22 P2.1 *
;* VSS 20 21 P2.0 *
;* *
;**********************************************************************
;
SPBASE EQU 70H ;堆棧基址
IEVAL EQU 00H ;關(guān)所有中斷
MEMBASE EQU 08H ;工作寄存器基址
MEMS EQU 67H ;工作寄存器個數(shù)
;
BITNMB EQU 08H ;一個字節(jié)包含八個位
;
KEYFUNFLAG EQU 80H ; 鍵功能索引
KEYFUNNMB EQU 81H ;鍵功能號
KEYFUNRW EQU 82H ;遙控信號讀寫標志
READFLAG EQU 88H ;讀標記
WITERFLAG EQU 99H ;寫標記
;
TMPHADDR EQU 08H ;讀入高電平存放首址
TMPLADDR EQU 90H ;讀入低電平存放首址
READTIME EQU 00H ;讀入數(shù)據(jù)指令時間
; LOWH EQU R4 ;起始位存放高地址
; LOWL EQU R5 ;起始位存放低地址
STUDYLAMP EQU P1.6 ;學(xué)習(xí)指示燈
LAMP EQU P1.7 ;未定義指示燈
STUDYKEY EQU P3.2 ;學(xué)習(xí)鍵
;
REMOTEIN EQU P3.4 ;遙控輸入
REMOTEOUT EQU P3.5 ;遙控輸出
DELAYCONUT EQU 30H ;延時值
DELAYCONUT0 EQU 0FFH ;延時值
T1COUNT EQU 0F3H ;T1計數(shù)初值
TMODVAL EQU 22H ;計數(shù)模式控制字
TCONVAL EQU 41H ;計數(shù)控制寄存器值
PCONVAL EQU 00H ;電源控制寄存器值
T2CONVAL EQU 00H ;T2控制寄存器值
SCONVAL EQU 0F8H ;串口控制寄存器值
IPVAL EQU 01H ;中斷優(yōu)先級控制值
;
;
;*************************************
;* *
;* 主程序和中斷程序入口 *
;* *
;*************************************
ORG 0000H ;程序執(zhí)行開始地址
AJMP START ;跳至START執(zhí)行
ORG 0003H ;外中斷0中斷入口地址
AJMP INTEX0 ;跳至INTEX0中斷服務(wù)程序
ORG 000BH ;定時器T0中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 0013H ;外中斷1中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 001BH ;定時器T1中斷入口地址
AJMP INTT1 ;跳至INTT1中斷服務(wù)程序
ORG 0023H ;串行口中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 002BH ;定時器T2中斷入口地址
RETI ;中斷返回(不開中斷)
;
;*************************************
;* *
;* 初始化程序中的各變量 *
;* *
;*************************************
CLEARMEMIO: CLR A ;A清0
DEC A ;A為#FFH
MOV P0,A ;P0口置1
MOV P3,A ;P3口置1
MOV P1,A ;P1口置1
CLR A ;清A(為0)
MOV P2,A ;P2口為0
CLR STUDYLAMP ;關(guān)學(xué)習(xí)燈
CLR LAMP ;關(guān)操作燈
CLR REMOTEOUT ;關(guān)遙控碼輸出
SETB REMOTEIN ;遙控接收為輸入狀態(tài)
MOV R0,#MEMBASE ;清工作寄存器,從08H開始
MOV R1,#MEMS ;清內(nèi)存?zhèn)€數(shù)(為103個)
CLEARMEM: MOV @R0,A ;清0開始
INC R0 ;地址加1
DJNZ R1,CLEARMEM ;未清完轉(zhuǎn)CLEARMEM繼續(xù)
; MOV R0,#KEYFUNRW
; MOV @R0,#READFLAG
MOV SP,#SPBASE ;設(shè)堆棧基址(70H)
MOV IE,#IEVAL ;關(guān)所有中斷
MOV IP,#IPVAL ;置優(yōu)先級
MOV TMOD,#TMODVAL ;置計數(shù)器模式(8位自動重裝初值模式)
MOV PCON,#PCONVAL ;波特率不加倍
MOV SCON,#SCONVAL ;串口中斷不開
MOV TH1,#T1COUNT ;T1定時器初值(定時值為13微秒)
MOV TL1,#T1COUNT ; T1定時器初值
SETB EX0 ;允許外中斷0中斷
SETB EA ;開總中斷允許
RET ;子程序結(jié)束
;
;*************************************
;* *
;* 主 程 序 *
;* *
;*************************************
START: LCALL CLEARMEMIO ;調(diào)用上電初始化子程序
; 主體程序
MAIN: LCALL KEYWORK ;調(diào)用讀鍵子程序
LJMP MAIN ;跳回MAIN循環(huán)
NOP ;PC值出錯處理
NOP ;空操作
NOP ;
LJMP START ;重新初始化
;
;*************************************
;* *
;* T1中斷服務(wù)程序 *
;* *
;*************************************
INTT1: CPL REMOTEOUT ;40kHZ方波輸出(紅外線調(diào)制波)
RETI ;中斷返回
;
;*************************************
;* *
;* 載波合成 *
;* *
;*************************************
REMOTETX: MOV R0,#TMPHADDR ;取遙控碼高電平存放首址
MOV R1,#TMPLADDR ;取遙控碼低電平存放首址
SETB LAMP ;開操作燈
MOV A,R4 ;起始位高8位放入A
MOV R3,A ;放入R3暫存
JZ LOWBACK ;高8位為0轉(zhuǎn)LOWBACK處理低8位
CLR A ;高8位非0處理
DEC A ;A為#FFH
LOWBACKTMP: MOV R2,A ;起始位復(fù)原,R2賦初值
LOWBACKTMP0: SETB TR1 ;開啟T1
SETB ET1 ;允許T1中斷
NOP ;用空操作延時
NOP
NOP
NOP
NOP
NOP
DJNZ R2,LOWBACKTMP0 ;計數(shù)值每減1循環(huán)時間為約21微秒
DJNZ R3,LOWBACKTMP ;高8位計數(shù)值不為0轉(zhuǎn)LOWBACKTMP
LOWBACK: MOV A,R5 ;起始位低8位處理
MOV R2,A ; 起始位低8位數(shù)放入R2暫存
LOWBACKTMP1: SETB TR1 ; 開啟T1
SETB ET1 ; 允許T1中斷
NOP ;用空操作延時
NOP
NOP
NOP
NOP
NOP
DJNZ R2,LOWBACKTMP1 ;低8位計數(shù)值不為0轉(zhuǎn)LOWBACKTMP1
TMP0: MOV A,@R0 ;高電平處理開始,取高電平數(shù)據(jù)
MOV R2,A ;放入R2
TMP1: CLR TR1 ;關(guān)閉T1
CLR ET1 ;關(guān)閉T1中斷允許(關(guān)40KHZ紅外線)
CLR REMOTEOUT ;關(guān)遙控輸出
NOP ;空操作延時
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R2,TMP1 ;R2每減1循環(huán)時間約為21微秒
INC R0 ;指向下一高電平數(shù)據(jù)地址
TMPP: MOV A,@R1 ;取低電平數(shù)據(jù)
MOV R2,A ;放入R2
TMP2: SETB TR1 ;低電平處理,開定時器T1
SETB ET1 ;開T1中斷
NOP ;空操作延時
NOP
NOP
NOP
NOP
NOP
DJNZ R2,TMP2 ;減1不為0轉(zhuǎn)TMP2循環(huán)(周期為21微秒)
INC R1 ;指向下一低電平數(shù)據(jù)
MOV A,@R1 ;取數(shù)據(jù)
JZ OUT ;為0轉(zhuǎn)OUT退出
AJMP TMP0 ;不為0轉(zhuǎn)TMP0執(zhí)行
OUT: CLR TR1 ;退出程序,關(guān)T1
CLR ET1 ;關(guān)T1中斷
CLR LAMP ;關(guān)操作燈
CLR REMOTEOUT ;關(guān)遙控輸出
RET ;返回
;
;*************************************
;* 遙控數(shù)據(jù)讀取 INT0中斷程序 *
;* 高電平存TMPHADDR為首址RAM *
;* 低電平存TMPLADDR為首址RAM *
;*************************************
INTEX0: CLR ET1 ;關(guān)T1中斷允許
CLR TR1 ;關(guān)定時器T1
CLR EX0 ;關(guān)外中斷0
CLR EA ;關(guān)中斷總允許
SETB STUDYLAMP ;開學(xué)習(xí)狀態(tài)指示燈
CLR LAMP ;關(guān)操作燈
MOV R0,#TMPHADDR ;高電平存放首址放入R0(07H)
MOV R1,#TMPLADDR ; 低電平存放首址放入R1(90H)
CLR A ;A清0
MOV DPH,A ;DPTR寄存器清0
MOV DPL,A ;
READHEAD: JNB REMOTEIN,READDATA ;尋找起始位。當(dāng)輸入為0時轉(zhuǎn)READDATA
INC DPTR ;輸入為高電平時對DPTR循環(huán)計數(shù)
NOP ;空操作延時
NOP ;(循環(huán)周期約為21微秒)
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
AJMP READHEAD ;跳回循環(huán)
;判斷是不是遙控碼起始位
READDATA: CJNE A,DPH,READDATA00 ;DPTR高8位不為0,是起始位
MOV DPH,A ; DPTR高8位為0,不是起始位
MOV DPL,A ; DPTR清0
AJMP READHEAD ;重新尋找起始位
;
READDATA00: CLR A ;處理起始位開始。清A
MOV DPH,A ;DPTR計數(shù)器清0
MOV DPL,A ;
READLOOP01: JB REMOTEIN,READDATA02 ;讀起始位,高電平時轉(zhuǎn)READDATA02
INC DPTR ;低電平時對DPTR循環(huán)計數(shù)
NOP ;空操作延時
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
AJMP READLOOP01 ; 循環(huán),周期約為21微秒
;
READDATA02: CLR LAMP ;關(guān)操作燈
MOV R4,DPH ;存起始位(高8位入R4)
MOV R5,DPL ;存起始位(低8位入R5)
MOV DPH,#00H ;清0
MOV DPL,#READTIME ;放入校正值(本設(shè)計沒校正,值為0)
AJMP READLOOP1 ;轉(zhuǎn)READLOOP1處理高電平程序
;
READDATA1: SETB LAMP ;存高電平數(shù)據(jù)程序。開操作燈
MOV @R0,DPL ;存入高電平數(shù)據(jù)(地址在08H-6FH)
INC R0 ;指向下一地址
MOV DPL,#READTIME ; 放入校正值(本設(shè)計沒校正,值為0)
MOV DPH,#00H ;清0
READLOOP0: JB REMOTEIN,READDATA2 ;讀低電平程序。高電平時轉(zhuǎn)READDATA2
INC DPTR ;低電平時對DPTR循環(huán)計數(shù)
NOP ;空操作延時,循環(huán)延時周期為21微秒
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
AJMP READLOOP0 ;延時循環(huán)控制
;
READDATA2: CLR LAMP ;存低電平數(shù)據(jù)程序。關(guān)操作燈
MOV @R1,DPL ;存低電平數(shù)據(jù)(地址在90H-F7H)
INC R1 ;地址加1
MOV DPL,#READTIME ; 計數(shù)校正(本設(shè)計沒校正,值為0)
MOV DPH,#00H ;清0
READLOOP1: JNB REMOTEIN,READDATA3 ;讀高電平程序。為0時轉(zhuǎn)READDATA3
INC DPTR ;高電平時對DPTR循環(huán)計數(shù)
NOP ;空操作延時,循環(huán)周期為21微秒
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
AJMP READLOOP1 ;循環(huán)控制
;
READDATA3: CLR A ;
CJNE A,DPH,READDATA4 ;DPH不為0轉(zhuǎn)READDATA4(碼讀完)
AJMP READDATA1 ;轉(zhuǎn)READDATA1(存高電平數(shù)據(jù))
READDATA4: MOV @R0,A ;放結(jié)束標志數(shù)據(jù)
MOV @R1,A ;放結(jié)束標志數(shù)據(jù)
; SETB LAMP ;開操作燈
CLR STUDYLAMP ;關(guān)學(xué)習(xí)燈
SETB REMOTEIN ;遙控輸入狀態(tài)
READEND: JNB STUDYKEY,READEND ;等待鍵釋放
SETB EX0 ;開外中斷
SETB EA ;開總中斷允許
RETI ;中斷返回
;
;*************************************
;* *
;* 鍵工作子程序 *
;* *
;*************************************
KEYWORK: SETB P1.0 ;置P1.0口為輸入狀態(tài)
JNB P1.0,KEY0 ;為0轉(zhuǎn)KEY0
KEYOUT: RET ;無鍵按下,返回
;
KEY0: LCALL DL10MS ;延時去抖動
JB P1.0,KEYOUT ;是干擾轉(zhuǎn)KEYOUT返回
LJMP REMOTETX ;有鍵按下,轉(zhuǎn)REMOTETX發(fā)謝遙控碼
;
;*************************************
;* *
;* 延時程序( 255 X 2 = 513 us) *
;* *
;*************************************
DELAY: MOV R0,#DELAYCONUT0 ;(#0FFH)
DELAY1: DJNZ R0,DELAY1
RET
;
;
;
;*************************************
;* *
;* 延時約25 ms *
;* *
;*************************************
DL10MS: MOV R1,#DELAYCONUT ;(#30H)
DL10MS1: LCALL DELAY
DJNZ R1,DL10MS1
RET
;
END ;程序結(jié)束
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -