#define led2_offp1 = p1 | 0x01)
static unsigned char data byinfradatacode _at_ 0x1c;
//static unsigned char data byinfradata;
unsigned char data byinfradata;
//存放在**段中的表:數碼管段選值,分別顯示0,1,2,...,9
unsigned char code byledcode[10] = ;
unsigned char code byinfracode[28] = ;
void infraredservice(void)
}}void delay(void)
void display(void)
;遙控器控制顯示***資料保持
;* create by :葛輝
?pr?int0_isr_temp?hal_int0_isr segment code
extrn code (infraredservice)
public int0_isr_temp
cseg at 00003h
ljmp int0_isr_temp
rseg ?pr?int0_isr_temp?hal_int0_isr
using 2
int0_isr_temp: ;中斷0服務程式
push acc
push psw
mov psw,#10h
sb: mov r4,#8 ;8毫秒為高電平錯誤
sba:
mov r5,#250
sbb:
jb p3.2,sxb1
djnz r5,sbb
djnz r4,sba
mov r4,#2
jmp sbc
sxb1:
mov r5,#5
sxb2去掉20us的尖峰干擾訊號
jnb p3.2,sbb
djnz r5,sxb2
jmp exit
sbc:
mov r5,#250
sb1:
jb p3.2,sb2 ;2ms內不為高電平錯誤(監測9ms的低電平引導碼)
djnz r5,sb1
djnz r4,sbc
jmp exit
sb2去掉20us的尖峰干擾訊號
mov r5,#5
sb2_a:
jnb p3.2,sb1
djnz r5,sb2_a
mov r4,#3
sb2_1:
mov r5,#250
sb3監測4.5ms高電平,如3ms內出現低電平錯誤
jnb p3.2,sxc
djnz r5,sb3
djnz r4,sb2_1
mov r4,#2
jmp sb3_1
sxc去掉20us的尖峰干擾訊號
mov r5,#5
sxc1:
jb p3.2,sb3
djnz r5,sxc1
jmp exit
sb3_1監測4.5ms高電平,如5ms內不為低電平錯誤
mov r5,#250
sb3_2:
jnb p3.2,sb4
djnz r5,sb3_2
djnz r4,sb3_1
jmp exit
sb4去掉20us的尖峰干擾訊號
mov r5,#5
sb4_1:
jb p3.2,sb3_2
djnz r5,sb4_1
mov r1,#1ah ;設定1ah為起始ram區
mov r2,#4
pp: mov r3,#8
jjjj:
mov r5,#250
jjjj2: ;1ms內不為低電平錯誤
jb p3.2,jjjj3
djnz r5,jjjj2
jmp exit
jjjj3:
lcall ys1 ;高電平開始後用882微秒的時間尺去判斷訊號此時的高低電平狀態
mov c,p3.2 ;將p3.2引腳此時的電平狀態0或1存入c中
jnc uuu如果為0就跳轉到uuu
mov r5,#250
jjjj4:
jnb p3.2,uuu
nopdjnz r5,jjjj4
jmp exit
uuu: mov a,@r1 ;將r1中位址的給a
rrc a將c中的值0或1移入a中的最低位
mov @r1,a ;將a中的數暫時存放在r1中
djnz r3,jjjj ;接收位址碼的高8位
inc r1對r1中的值加1,換成下乙個ram
djnz r2,pp ;接收完16位位址碼和8位資料碼和8位資料反碼,存放在1ah/1bh/1ch/1dh的ram中
;以下對**是否正確和定義進行識別
mov a,1ah ;比較高8位位址碼
xrl a,#00000000b ;判斷1ah的值是否等於00000000,相等的話a為0
jnz exit ;如果不相等說明解碼失敗退出解碼程式
mov a,1bh ;比較低8位位址
xrl a,#11111111b ;再判斷高8位位址是否正確
jnz exit ;如果不相等說明解碼失敗退出解碼程式
lcall ys3
mov a,1ch ;比較資料碼和資料反碼是否正確?
cpl a
xrl a,1dh ;將1ch的值取反後和1dh比較不同則無效丟棄,核對資料是否準確
jnz exit ;如果不相等說明解碼失敗退出解碼程式
lcall ys3
ajmp infra
;判斷在118毫秒內是否有連發碼
aa: mov r1,#25
xx: acall ys2
jnb p3.2,hh ;跳轉到判斷連發**是否正確的程式段
djnz r1,xx
exit: pop psw
pop acc
reti退出中斷服務程式
;連發碼判斷程式段
hh: mov r6,#4
s: acall ys1 ;呼叫882微秒延時子程式
jb p3.2,exit ;延時882微秒後判斷p3.2腳是否出現高電平如果有就退出解碼程式
djnz r6, s ;重複4次,目的是確認連發碼的低電平訊號波形
jnb p3.2, $ ;等待高電?
lcall ys3
ajmp aa
infra: lcall infraredservice
ajmp aa
ys1: mov r4,#20 ;延時子程式1,精確延時882微秒
d1: mov r5,#20
djnz r5,$
djnz r4,d1
retys2: mov r4,#10 ;延時子程式2,精確延時4740微秒
d2: mov r5,#235
51微控制器紅外置收解碼程式詳細解析
接收以s52微控制器作為接收系統。以s52的p3.3口作為接收埠,該埠是外部中斷1。這個接受程式是以xc866作為紅外傳送控制系統,接收程式如下 include 標頭檔案 include define uchar unsigned char 巨集定義 define uint unsigned int...
紅外線遙控解碼原理及其在微控制器中的應用
廣東松山職業技術學院電氣工程系張勇 摘要 本文詳細介紹了基於a t 89c 52微控制器的紅外線遙控解碼的基本工作原理,並對其在硬體設計 軟體設計和實現方法中的注意事項進行了詳細的闡述。關鍵詞 a t 89c 52 紅外線遙控接收器紅外線遙控編碼 012 科技資訊計算機與網路 112 上接第209頁...