HE6221红外遥控发送芯片Word文件下载.docx
《HE6221红外遥控发送芯片Word文件下载.docx》由会员分享,可在线阅读,更多相关《HE6221红外遥控发送芯片Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
1~6
R3~R8
输入
键盘行控制,高电平有效
7
DOUT
输出
串行数据输出引脚,38KHz发射频率
8
VDD
1.8V~3.5V
9
DT
最重要数据位(DT)代码设置
10
X2
455KHz振荡器输出
11
X1
455KHz振荡器输入
12
VSS
地
13
LED
发射输出
14~21
C8~C1
输入/输出
键盘列控制
22
AIN
低8位地址码输入
23~24
R1~R2
7.内部连接应用电路
二.代码的特征
1.HT6221键码的形成
当一个键按下超过36ms,振荡器使芯片激活,如果这个键按下且延迟大约108ms,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。
如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。
2.代码格式(以接收代码为准,接收代码与发射代码反向)
①位定义
②单发代码格式
③连发代码格式
注:
代码宽度算法:
16位地址码的最短宽度:
1.12×
16=18ms
16位地址码的最长宽度:
2.24ms×
16=36ms
易知8位数据代码及其8位反代码的宽度和不变:
(1.12ms+2.24ms)×
8=27ms
∴32位代码的宽度为(18ms+27ms)~(36ms+27ms)
三.解码方法及软件说明
1.解码的关键是如何识别“0”和“1”,从位的定义我们可以发现“0”、“1”均以0.56ms的低电平开始,不同的是高电平的宽度不同,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平的宽度区别“0”和“1”。
如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。
2.根据码的格式,应该等待9ms的起始码和4.5ms的结果码完成后才能读码。
3.从上述两点,我们可得到解码程序的流程图。
这样接收到的仅仅是普通的代码,要得到标准的键值,还必须进行代码识别和代码转换,下面是从代码接收到获得标准值的子程。
KREM;
与接收头相连的I/O口
1AH,1BH,1CH,1DH;
存放代码的4个连续单元
YAO_KONG:
CLREA
JNBKREM,REMOT1
SJMPREM_BAK;
平时KREM为高电平,所以当KREM=1时,
;
表示无键按下,应立即返回
REMOT1:
JNBKREM,$;
等待9ms的起始码发送完
MOVR2,#32;
32表示代码共32位,也可以送24,这样
接收到的24位码将不包括数据代码的
;
反代码
;
-----------------------------------------
代码接收
BYTE1:
MOVR3,#250
BYTE2:
MULAB;
延时约6ms,可以稍长或稍短,但不能
小于4.5ms,也不能太长。
太长连击时
将影响程序运行速度
JNBKREM,BYTE3;
DJNZR3,BYTE2;
由于结果码为4.5ms,如果小于4.5ms,
结果码未发送完,读得的码值将出错
BYTE3:
JNBKREM,$;
等待高电平,保证读每一位的起点一致
-----------------------------------------------
MOVR3,#150
DJNZR3,$;
延时0.9ms,延时范围为0.56ms~1.12ms
----------------------------------------
MOVC,KREM
MOVR3,#4
MOVR0,#1DH
BYTE4:
MOVA,@R0
RLCA
MOV@R0,A
DECR0
DJNZR3,BYTE4
DJNZR2,BYTE1
至此32位代码已全部接收完成,并存放在1AH~1DH中,
依次为低8位地址码,高8位地址码,8位数据码,
8位数据的反代码
----------------------------------------------------
代码识别
MOVA,1AH
XRLA,#03;
3为地址低8位的值,对于不同的遥控器
有不同的地址值
JNZREM_BAK
MOVA,1BH
XRLA,#0FCH;
FCH为地址高8位的值
MOVA,1CH
CPLA
XRLA,1DH;
如果地址码不对或接收到的数据码两单元
不反向均当错码,本程序当无键按下处理
JNZREM_BAK
--------------------------------------------
代码转换
MOVR2,#21;
21为遥控器面板按键数
MOVDPTR,#TAB_REMOT
LOOKUP_1:
MOVA,R2
MOVCA,@A+DPTR
XRLA,1CH
JZREM_BAK0
DJNZR2,LOOPUP_1
REM_BAK0:
MOVA,R2;
R2中的值即为标准的键值
SJMPEND_YK
REM_BAK:
CLRA
END_YK:
SETBEA
RET
=====================================================================
代码转换表,表中的值为面板上相应键的代码
对于不同的遥控器,表中的值应做相应的改变
TAB_REMOT:
DB00H
VCDDVDAUXTUNERST/MTSV-46
DB0C0H,0D0H,0E8H,0F0H,0E0H,0C8H
UPDOWNFM/AMMEMORYA/B11
DB00H,20H,48H,68H,58H
12345617
DB0D8H,0F8H,40H,60H,50H,70H
AUTOVOL+VOL-MUTE21
DB28H,10H,30H,78H
=================================================================
说明:
此程序可在需要的地方任意调用(LCALLYA0_KONG),返回后,累加器中的值即为标准的键值,如果A=0则不予处理(可能原因有:
无键按下,错码或非本机所用的遥控器的操作),程序中的延时均以4MHz的晶振为准,若用不同的晶振,只需改变相应值,符合注释中的延时时间即可。
4.从上述解码过程我们不难发现,对于连发代码,解码得的值1AH~1DH全为0FFH,所以软件如果需要处理连击,我们只须在代码识别前判断1AH~1DH是否全为0FFH,是则有连击现象,这样建一个连击标志,再返回,软件根据这个标志,结合上一次读得的键值便可进行相应的连击操作,直到按键松开,连击标志才被清除。
具体操作如下:
在代码识别前插入
MOVA,1AH
ANLA,1BH
ANLA,1CH
ANLA,1DH
XRLA,#0FFH
JNZDAN_JI
SETBFLAG_LIANJI;
建连击标志
DAN_JI:
NOP
另外子程的最后几条指令改成
SJMPEND_YK0
CLRA
END_YK0:
CLRFLAG_LIANJI;
清连击标志
____
四.应用实例
读者也许会问,只要解得遥控器的代码就可以了,转换成1~n标准值有什么优点呢?
看了后面的简单实例,不难发现它有如下好处:
①.在应用系统中,带遥控器的仪器,一般都带按键,而且二者功能相同,转换成标准值后,遥控按键散转表格可以与键盘散转表格复用,这样能节省一定的空间。
②.HT6221/2最大可支持32或64个按键,一般系统只使用其中的一部分,这样可能会使遥控器按键的代码毫无规律,为了处理这样的代码,软件人员要么想方设法通过复杂的算法找出那些代码不是规律的规律,要么干脆不管那么多,排列一大堆“CJNEA,#DATA,NEXT”指令判断,使键值判断变得拖沓冗长。
使用前述方法则清楚明了,简单易行。
③.对于不同的遥控器,本程序只要改变代码转换表即可,对再开发大有益处。
______1.实例电路______
程序清单及说明:
KREMEQUP0.0
L1EQUP1.0
L2EQUP1.1
L3EQUP1.2
L4EQUP1.3
L5EQUP1.4
L6EQUP1.5
L7EQUP1.6
L8EQUP1.7
L9EQUP3.4
L10EQUP3.5
L11EQUP3.6
L12EQUP2.0
L13EQUP2.1
L14EQUP2.2
L15EQUP2.3
L16EQUP2.4
L17EQUP2.5
L18EQUP2.6
L19EQUP2.7
L20EQUP0.6
L21EQUP0.5
ORG0000H
AJMPSTART0
ORG0030H
START0:
MOVSP,#60H
START:
ACALLYAO_KONG;
调用解码子程
JZSTART
RLA
MOVDPTR,#TAB_KEY
JMP@A+DPTR
---------------------------------------
TAB_KEY:
AJMPSTART
AJMPKEY1
AJMPKEY2
AJMPKEY3
AJMPKEY4
AJMPKEY5
AJMPKEY6
AJMPKEY7
AJMPKEY8
AJMPKEY9
AJMPKEY10
AJMPKEY11
AJMPKEY12
AJMPKEY13
AJMPKEY14
AJMPKEY15
AJMPKEY16
AJMPKEY17
AJMPKEY18
AJMPKEY19
AJMPKEY20
AJMPKEY21
-------------------------------------
KEY1:
ACALLCLEAR_IO
SETBL1
AJMPSTART
KEY2:
SETBL2
------------------------------------
KEY3:
SETBL3
-----------------------------------
KEY4:
SETBL4
----------------------------------
KEY5:
SETBL5
KEY6:
SETBL6
KEY7:
SETBL7
KEY8:
SETBL8
KEY9:
SETBL9
KEY10:
SETBL10
KEY11:
SETBL11
KEY12:
SETBL12
KEY13:
SETBL13
KEY14:
SETBL14
KEY15:
SETBL15
KEY16:
SETBL16
KEY17:
SETBL17
KEY18:
SETBL18
KEY19:
SETBL19
KEY20:
SETBL20
KEY21:
SETBL21
CLEAR_IO:
MOVP0,#0
MOVP1,#0
MOVP2,#0
MOVP3,#0
END
①该程序是应用“HT6221解码成标准键值”的典型例子。
KEY1、KEY2……KEY21分别表示不同的功能模块,也就是说根据解得的键值按照需要做具体的事。
以示明显,。
这里分别用L1、L2……L21共21个发光管代替程序要做的事,当不同的键按下时,对应的发光管亮,其余的管均灭。
②如果读者有兴趣,不防一试。
需要注意的是,实验前必须把你手上的遥控器的代码填在代码转换表的相应位置,代码的得来不难。
在“代码识别”前设一断点,运行程序,按不同的键,程序运行到断点停下时,“1CH”单元的内容即为当前按键的代码。
同时应该用1AH中的内容替换程序中的低8位地址“3”,1BH中的内容替换程序中高8位地址“0FCH”。
如此做好后,便大功告成,这时有且只有你手上的遥控器可以控制发光管了。