单片机解码SAA3010T遥控器
单 片 机 解 码 SAA3010T
湖北师范学院物理系 王志根
摘要:本文用 51 单片机对SAA3010T遥控器进行解码,介绍了单片机系统
中红外通信的软硬件设计方法,并给出了具体的源程序。
一.SAA3010T的编码原理
二.遥控发射技术的基本原理
通常彩电遥控信号的发射,就是将某个按键所对应的控制指令和系统码(由
0和1组成的序列),调制在 32~56KHz 范围内的载波上,然后经放大、驱动红
外发射管将信号发射出去。
不同公司的遥控芯片,采用的遥控码格式也不一样。在此介绍较普遍的两
种,一种是 NEC 标准,一种是 PHILIPS 标准。
图 1 NEC 标准下的主码表示
NEC 标准:遥控载波的频率为 38KHz(占空比为 1:3);当某个按键按下时,
系统首先发射一个完整的全码,然后经延时再发射一系列简码,直到按键松开
即停止发射。简码重复延时 108ms,每两个引导脉冲上升沿之间的间隔都是
108ms。一个完整的全码如图 1 所示。 其中,引导码高电平 4.5ms,低电平
4.5ms;系统码 8 位,数据码 8 位,共 32 位;数据 0 用“高电平 0.5625ms+低
电平 0.5625ms”表示,数据 1 用“高电平 0.5625ms+低电平 1.6875ms”表
示,如图 2 所示:一个简码=引导码+系统码位0的反码+结束位(0.5625ms)
高电平。
图 2 NEC 标准下,数据0和1的表示
PHILIPS 标准:载波频率为 38KHz;没有简码,点按键时,控制码在 1 和 0 之间
切换,若持续按键,则控制码不变。一个全码=起始码‘11’+控制码+系统
码+数据码,如图 3 所示。
图 3 PHILIPS 标准下的全码表示
数据 0 用“低电平 1.778ms+高电平 1.778ms”表示;数据1用“高电平
1.778ms+低电平 1.778ms”表示。 连续码重复延时 114ms。
三.红外线接收头
一体化红外线接收器,它是一种集红外线接收、放大、整形于一体的集
成电路,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号
兼容的所有工作,没有红外遥控信号时为高电平,收到红外信号时为低电平,
而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据
传输。
四.单片机解码源程序
//功能实现对p1 口八个发光二级管控制,程序中设置了串行口来查看遥
控器的发送的编码IRCode[2]
//8 路红外遥控开关控制器,程序只对 SAA3010T 的后 12 位判定
//(SAA3010T 电视遥控器)
//只用八路时可以用 AT89C2051 代替 AT89C51
//一体化接收头输出端拉 P3.2(int0),P1 为控制输出端。
//可以扩展到 32 路或更多
//输出为低电平有效
#include
static unsigned char data IRCode[3],IRCON,IRCON2;
static unsigned char data DT;
void main(void)
{
unsigned int de;
TMOD = 0x21; //定时器 0 方式 1
EA = 1; //允许 CPU 中断
IT0 = 1; //INT0 下降沿有效
EX0 = 1; //开 INT0 中断;
TI=0; // ;设置串行发送中断产生标志
SCON=0x50; //;设置串行口工作于模式 1,允许接收数据
//MOV TMOD,#20H // ;设置定时器 1 工作于模式 2(具有自动加
载初值功能)
TH1=0xFD; // ;设置波特率为 9600 bps
do
{
for (de=0; de<10000; de++)
P3_6 = 1;
for (de=0; de<10000; de++)
P3_6 = 0;
if (DT)
{
for (de=0; de<30000; de++) //这里起到按键值正确后会有一个延时,防止
重复按键
P3_6 = 1;
for (de=0; de<30000; de++)
P3_6 = 0;
DT = 0;
}
EX0 = 1;
}
while(1);
}
//定时器 0 中断处理
void timeint(void) interrupt 1 using 2
{
TR1=0; // ;激活定时器 1,以产生波特率时钟
//IT0=1; // ;设定 INT0 的触发方式为脉冲负边沿触发
//EX0=1; // ;打开 INT0 中断请求
TH0=0xFD;
TL0=0x1E; //设定时值为 800us
if (IRCON<3)
{
if (IRCON2<8) //每中断一次读一次遥控接收头的状态,每二次为遥控编码
中的一个位
{
IRCON2++;
IRCode[IRCON]=IRCode[IRCON]<<1; //每读一次放入变量中的二进制的
一个位,每次左移一位
IRCode[IRCON]=IRCode[IRCON] | P3_2; //每八次填满一个字节,一个字
节存放遥控编码 4 个位
}
else
{
IRCON++; //填满一个字节,指向下一个变量
IRCON2=0; //计数清零
}
}
else
{
TR1=1;
TR0 = 0; //关闭定时器
ET0 = 0; //定时器 0 中断关闭
if(TI==0)
SBUF=IRCode[2];//测试遥控器的编码,也可以测试 IRCode[1]
else
TI=0;
if ((IRCode[1]!=0xFF)&&(IRCode[2]!=0xFF))
{
if (IRCode[1]==0x95)
{
switch (IRCode[2])
{
case 0xAB: //1-8 键控制
P1_0 =~P1_0;
DT = 1;
break;
case 0xAC:
P1_1 =~P1_1;
DT = 1;
break;
case 0xAD:
P1_2 = ~P1_2;
DT = 1;
break;
case 0xB2:
P1_3 = ~P1_3;
DT = 1;
break;
case 0xB3:
P1_4 = ~P1_4;
DT = 1;
break;
case 0xB4:
P1_5 = ~P1_5;
DT = 1;
break;
case 0xB5:
P1_6 = ~P1_6;
DT = 1;
break;
case 0xCA:
P1_7 = ~P1_7;
DT = 1;
break;
case 0xD2: //按关闭电源键,关闭所有继电器
P1 = 0x00;
DT = 1;
break;
}
}
}
}
}
//INT0 中断
void INT0Fun(void) interrupt 0 using 2
{
EX0 = 0; //外部中断 0 关闭
ET0 = 1; //定时器 0 中断打开
TH0=0xFD;
TL0=0x1E; //设定时值为 800us
for (IRCON=0; IRCON<3; IRCON++)
IRCode[IRCON] = 0;
IRCON = 0;
IRCON2 = 0; //计数清零
TR0 = 1;//开始计数
}
//遥控器编码
95D3 95d2
AB AC AD B2
B3 B4 B5 CA
CB AA 2A CC
D4 2B 2C
D5 35 32
五.参考文献
1.磁动力工作室磁动力工作室 www.cdle.net
2.单片机原理及应用 李建忠 编著
本人 Email :wzhigen@163.com
单片机解码SAA3010T遥控器