您现在正在浏览:首页 > 职教文章 > 职教论文 > 单片机解码SAA3010T遥控器

单片机解码SAA3010T遥控器

日期: 2010/3/18 浏览: 48 来源: 学海网收集整理 作者: 佚名

单 片 机 解 码 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遥控器

返回顶部