c51单片机红外解码程序.docx
《c51单片机红外解码程序.docx》由会员分享,可在线阅读,更多相关《c51单片机红外解码程序.docx(24页珍藏版)》请在冰豆网上搜索。
c51单片机红外解码程序
c51单片机红外解码程序-汇
编版和c语言版(总19页)
-CAL-FENGHAL-(YICAI)-CompanyOne1
■CAL■本页仅作为文档封面,使用请直接删除
利用程序判电平和时间进行解码,缺点是浪费系统软件资源;优点是对系统硬件要求稍低
ORG
0000H
TOZD
BIT
20H.2
XH
BIT
P3.3
;红外接收头数据接口
RS
BIT
P2.3
RW
BIT
P2.4
E
BIT
P2.5
BB
BIT
P3.6
ORG
0000H
AJMP
MAIN
ORG
000BH
;T0中断入口
LJMP
TOZDCX
ORG
01OOH
;主程序首地址
MAIN:
LCALL
CSH
MOV
DPTR,#TAB
;总查表
SETB
EA
;T0中断设定
SETB
ETO
MOV
TMOD,#01H
DDXH:
;信号接收前准备
SETB
P2.0
;关信号指示灯
MOV
PO,#OFFH
CLR
TRO
;关丁0中断
CLR
TOZD
;接收信号时间判断
MOV
Ro,#4
;延时计数
MOVTHO,#OOH
MOVTLO,#00H
;=二======二解码主要过程======关键
JB
XH,$
;等待电平变低,
解码从这开始
CLR
P2.0
;开信号指示灯,
表示正在接收信号
MOV
P0,#8EH
SETB
TRO
;开丁0中断
LCALL
YS3MS
JB
XH,DDXH
;干扰检测
LCALL
YS3MS
JB
XH,DDXH
;干扰检测
DD1:
JB
TOZD,DDXH
;是否超出接收允许时间
JNB
XH,DD1
;等待电平变高
LCALL
YS3MS
JNB
XH,DDXH
;干扰检测
DD2:
JB
TOZD,DDXH
;是否超出接收允许时间
JB
XH,DD2
;等待电平变低
JSSJ:
;信号确认,开始接收数据
MOV
RO,#30H
ZJ:
;接收一个字节数据
MOV
R2,#8
WEI:
;位数据,分辩0和1
JB
TOZD,DDXH
;是否超出接收允许时间
JNB
XH,WEI
;等待电平变高
LCALL
YS845
MOV
C,XH
;取位数据
RRC
A
DD3:
JB
TOZD,DDXH
;是否超出接收允许时间
JB
XH,DD3
;等待电平变低,为1的高电平提供过度
DJNZ
R2,WEI
;8位数据是否接收完
MOV
@R0,A
INC
RO
CJNE
RO,#34H,ZJ
;四字节数据是否接收完
MOV
A,33H
CPL
A
CJNE
A,32H,DDXH
;键值确认,解码
MOV
R4,A
=====这里已经取出键值,存在R4中
MOVR7,#100;
TSY:
MOV
DJNZ
CPL
R6,#255
R6,$
BB
MOV
A,#OCDH
LCALL
YJP.XZL
MOV
A,R4
MOV
B,#1OH
DIV
AB
MOVC
A,©A+DPTR
LCALL
YJP.XSJ
MOV
A,#OCEH
DJNZR7,TSY
;键值高位输岀
;键值低位输岀
LCALL
YJP.XZL
MOV
A,B
MOVC
A,©A+DPTR
LCALL
YJP.XSJ
LCALL
DYBF
LJMP
DDXH
YS845:
MOV
R7,#255
DJNZ
R7,$
MOV
R7,#163
DJNZ
R7,$
RET
YS3MS:
MOV
R7,#8
DDD:
MOV
R6,#255
DJNZ
R6,$
DJNZ
R7,DDD
RET
TOZDCX:
MOVTLO,#OOH
MOVTHO,#OOH
DJNZR5,TOFH
SETBTOZD
TOFH:
调用灯控制子程序返还等待下一次信号
延时845微秒
;延时3ms
;TO中断程序
RETI
;二=======以下是多余部分
MOV
A,#OCOH
LCALL
YJP.XZL
MOV
A,30H
MOV
B,#10H
DIV
AB
MOVC
A,©A+DPTR
LCALL
YJP.XSJ
MOV
A,#OC1H
LCALL
YJP.XZL
MOV
A,B
MOVC
A,©A+DPTR
LCALL
YJP.XSJ
MOV
A,#0C4H
LCALL
YJP.XZL
DYBF:
;用号码前高位输出
;用户码前低位输岀
;用户码后高位输出
MOVA,31H
MOVB,#1OH
DIVAB
MOVCA,@A+DPTR
LCALLYJP_XSJ
MOVA,#0C5H;用户码后低位输出
LCALLYJP.XZL
MOVA,B
MOVCA,©A+DPTR
LCALLYJP.XSJ
;二二二二二=二二二二二此处专门针对我的开发板和遥控,不是解码的关键,只是一种应用举例
MOV
A,R4
CJNE
A,#0CH,BAI
;是否1号键按下
CPL
P1.0
;点亮1号灯
BA1:
CJNE
A,#18H,BA2
;是否2号键按下
CPL
Pl.1
;点亮1号灯
BA2:
CJNE
A,#5EH,BA3
;是否3号键按下
CPL
Pl.2
;点亮1号灯
BA3:
CJNE
A,#08H,BA4
;是否4号键按下
CPL
Pl.3
;点亮1号灯
BA4:
CJNE
A,#1CH,BA5
;是否5号键按下
CPL
Pl.4
;点亮1号灯
BA5:
CJNE
A,#5AH,BA6
;是否6号键按下
CPL
Pl.5
;点亮1号灯
BA6:
CJNE
A,#42H,BA7
;是否7号键按下
CPL
Pl.6
;点亮1号灯
BA7:
CJNE
A,#52H,BAB
;是否8号键按下
CPL
BAB:
RET
CSH:
Pl.7
;点亮1号灯
二======液晶初始化
MOVA,#00111000B
LCALLYJP.XZL
MOVA,#00001100B不闪烁
LCALLYJP.XZL
;8位数据,双行显示,5-7字型
;调用写液晶指令
;显示屏开启,光标出现在地址计数器位置,光标
;调用写液晶指令
MOV扎#0000011OBLCALLYJP.XZL
MOVA,#81H;
LCALLYJP.XZL
MOVA,#4CH
LCALLYJP_XSJ
MOVA,#83H;
LCALLYJP.XZL
MOVA,#47H
LCALLYJP.XSJ
MOVA,#85H;
LCALLYJP.XZL
MOVA,#58H
LCALLYJP.XSJ
MOVA,#88H
LCALLYJP.XZL
MOVA,#5AH
LCALLYJP_XSJ
MOVA,#89H
LCALLYJP.XZL
MOVA,#68H
LCALLYJP.XSJ
MOVA,#8AH;
LCALLYJP.XZL
MOVA,#69H
LCALLYJP.XSJ
MOVA,#8CH
LCALLYJP.XZL
MOVA,#5AH
LCALLYJP.XSJ
MOVA,#8DH
LCALLYJP.XZL
MOVA,#61H
LCALLYJP.XSJ
MOVA,#8EH;
LCALLYJP.XZL
MOVA,#6FH
LCALLYJP.XSJ
MOVA,#0C2H
LCALLYJP.XZL
MOVA,#48H
LCALLYJP.XSJ
MOVA,#0C6H
LCALLYJP_XZL
;光标右移一格,AC值加一,字符全部不动
;调用写液晶指令
丄的ASCII码
<的ASCII码
序的ASCII码
f
之的ASCII码
9
山的ASCII码
;i的ASCII码
9
之的ASCII码
9
g的ASCII码
;o的ASCII码
9
⑴的ASCII码
LCALLYJP_XSJ
RET
;====二写指令到液晶二======
YJP.XZL:
LCALLCHECK_BUSY;查询忙碌状态
CLRE
CLRRS
CLRRW
SETBE
MOVPO,A;写指令
CLRE
RET
;=====二写数据到液晶二=======
YJP.XSJ:
LCALLCHECK_BUSY;查询忙碌状态
CLRE
SETBRS
CLRRW
SETBE
MOVPO,A;写数据
CLRE
RET
;====二查询忙碌标志二======
CHECK_BUSY:
PUSHACC
BUSY.LOOP:
CLRE
SETB
RW
CLR
RS
SETB
E
MOV
A,PO;读取状态
JB
pO.7,BUSY.LOOP
POP
ACC
LCALLDEL
RET
DEL:
MOVR6,#5
LI:
MOVR7,#248
DJNZR7,$
DJNZR6,L1
RET
TAB:
DB30H,31H,32H,33H,34H,35H,36H,37H,38H,39HDB41H,42H,43H,44H,45H,46H
END
中断加定时器
c语言版
优点:
完全是状态解码,极少的占用系统(CPU),随时都可以解码,而不管系统此时运行到何处。
占用系统两个硬件资源,一个外部中断和一个定时器。
•I••1••I••I••I••I••I••I••I••1••I••I••I••I••I••I••I••1••I••I••I••I••I••I••I••1••I••I••I••I••I••I••I••1••I••I••I••I••I••I••I••1••I••I••I••I••I••I••I••1••I••I••I••I•
********六哥红夕卜解码程序********************************
•|••4••j••||••4••1••1••|••4••j••|••j••4••1••1••j••j••j••|••j••4••1••1••j••j••j••|••j••4••1••1••j••j••j••|••j••4••1••1••j••j••j••|••j••4••1••1••j••j••j••|••j••4••1••4•
#include"STC15Fxxxx.H"
/
fffvgwviwviwviwvawvTwviwviwviwviwvTWviwvawvawviwviwviwviwvTWviwvawvawviwviwviwviwvTWviwvawvawviwviwviwviwvTWviwvawvawviwviwviwviwvTWviwvawvawviwviwviwviw
/////用户配置区:
#define
xi_tong_plini
振频率设定
如你的系统晶振频率是12MHz,则写
#define
jan_zhi
Pl
///解码输出二进制端口,解码成功则从该
端口输岀键值的二进制
sbit
zhi_s=
P5"5;
///解码成功标志,解码成功一次该端口取
反一次
////外部中断
#define
zd_rkdz
interrupt
0///中断入口设置
#define
zd_cffs
ITO
///中断触发方式设置
#define
zd_dk
EXO
///中断打开设置
////
ttdefinestc.dsqszAUXR&二0x7F;//定时器时钟12T模式,不需要可在AUXR....前加〃
/
fffawvTwvawv^wviwvTwv^wvawvTwvTwvawv^wviwvTwv^wvawvTwvTwvawv^wviwvTwv^wvawvTwvTwvawv^wviwvTwv^wvawvTwvTwvawv^wviwvTwv^wvawvTwvTwvawv^wviwvTwv^wvawvawviw
•'••••»••»••»••"••»••»••»••»••»••»••»••"••»••»••»••»••»••»••»••"••»••»••»••»••»••»••»••"••»••»••»••»••»••»••»••"••»••»••»••»••»••»••»••"••»••»••»••»••»••»••»••"••»••»••»••»••»••»••»••"••»••»••»••»•
•I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I•
和<本程序使用外部中断加定时器来实现红外解码,占用系统软件资*************源极少,硬件方面占用了一个外部中断,定时器中断还可以进行********材***一些简单的运用,软件部分可以做很多的动作,就看你发挥了!
********
•|••|••1••|••4••4••|••|••|••|••1••|••4••4••|••|••|••|••1••|••4••4••|••|••|••|••1••|••4••4••|||••|••1••|••4••4••|||••|••1••|••4••4••|||••|••1••|••4••4••|||••|••1••|••4••4••|||••|•
^defineshi_jian定时器设置,请勿更改
unsignedcharhwyhmh,hwyhml,hwjz,hwsj,hwjmws;///全局变量bithwjmok,yxjm;///全局变量,红外解码OK,允许解码
voidmain(void)
EA二1;zd_cffs二1;zd_dk二1;
ETO二1;stc_dsqszTMOD&二OxFO;TMOD|=0x01;while
(1)
{if(hwjmok){hwjmok=0;jan_zhi=hwjz;zhis二、zhis;}
}
}
THO二0;
TRO二1;///开启TO
if(a>shi_jian_*13000&&a{
hwsj=0;
hwjmws=32;
yxjm=l:
}
else辻(yxjm)///ifl分支1.已收到引导码,允许解码
{
if(a>shi_jian_*l1000&&a判重复码U-12ms
{
hwjmok=l;
}
else///if2分支3。
否则解码,取位
{
hwjmws一;
////////////////////////////////////////////////////////
辻(a>shi_jian_*2000&&a2.4ms
{
hwsj»=l;
hwsj1=0x80;
}
else辻(a>shi_jian_*1000&&a1.3ms
{hwsj»=l;
}
else
{
hwjmws=32;
yxjnFO;//清除允许解码标志
TRO二0;//关闭TO
}
//////////////////////////////////////////////////////////
}
switch(hwjmws)
{case24:
{
hwyhmh=hwsj;
hwsj=0;
}
break;
case16:
{hwyhml=hwsj:
hwsj=O;}break;
case8:
{hwjz=hwsj;
hwsj=0;}
break;
case0:
{if(hwjz='hwsj)
{hwjmok=l;
TL0=shi_jian_*12000%256;
THO二shi_jian」12000/256;}
}
break;
default:
;}
}
else;
}
中断加定时器-一汇编版
•I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I•
********六哥红夕卜解码程序********************************
••1••'••"••"••"••»••"•••••»••'••"••"••"••»••"•••••»••'••"••"••"••»••"•••••»••'••"••"••"••»••"•••••»••'••"••"••"••»••"•••••»••'••"••"••"••»••"•••••»••'••"••"••"••»••"•
•I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I••I•
•»••"••"••»•••••»••"••"••»••"••"••»•••••»••"••"••»••"••"••»•••••»••"••"••»••"••"••»•••••»••"••"••»••"••"••»•••••»••"••"••»••"••"••»•••••»••"••"••»••"••"••