紅外置收解碼匯嵌C

2021-03-04 00:29:42 字數 3621 閱讀 2658

#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頁...