自制红外电视遥控器

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用AT89S52自制电视红外遥控器

红外遥控器发送数据时,是将二进制数据调制成一系列的脉冲信号红外发射管发射出去,红外载波为频率38KHz的方波,红外接收端在收到38KHz的载波信号时,会输出低电平,否则输出高电平,从而可以将“时断时续”的红外光信号解调成一定周期的连续方波信号,再经过1838一体化红外接收头解调便可以恢复出原数据信号。如图1所示

图1

红外接收头解调过程如图2所示

图2

解调后的“0”和“1”波形及单片机编码图3图4所示

图3

图4

了解了红外接收头解调及遥控编码下面就可以对照图5编写编码程序了,图5是遥控按键1的一段实际编码

由9ms低电平4.5ms高电平的启始码,26位系统码,及8位数据码、8位数据反码、23ms高电平及结束码组成

电路图

实物图

*****************************************以下是遥控完整程序***********************************************

/*********************************************

**项目:自制红外电视遥控器(EE01学习板演示程序)

*********************************************/

#include

#define uint unsigned int

#define uchar unsigned char

bit irout;//红外管状态

sbit ir=P1^7;//红外发射管控制脚

uint count, set_count;//中断计数,设定中断次数

bit flag,keyflag;//红外发送标志,按键标志位

uchar irsys[4]={0x1a,0xa1,0xdc,0x03};//26位系统码,最后一个字节只用2位uchar ircode,irdata;

/**********************************************

延时1ms

***********************************************/

void delay(uint z)//延时1ms,晶振22.1184M

{

uint x,y;

for(x=z;x>0;x--)

for(y=225;y>0;y--);

}

/**********************************************

按键扫描

**********************************************/

void keyscan(void)

{

uchar keytemp;

P3=0xff;

keytemp=P3&0x0f;

if(keytemp!=0x0f)

{

delay(20);

keytemp=P3&0x0f;

if(keytemp!=0x0f)

keyflag=1;//有按键标志

switch(keytemp)

{

case 0x0e:irdata=27;break;//按键1对应该遥控器P+的键值

case 0x0d:irdata=26;break;//按键2对应该遥控器P-的键值

case 0x0b:irdata=31;break;//按键3对应该遥控器VOL+的键值

case 0x07:irdata=30;break;//按键4对应该遥控器VOL-的键值

}

}

}

/*******************************************

发送8位红外数据

*******************************************/

void sendcode_8(void)

{

uchar i;

for(i=0;i<8;i++)

{

set_count=28;//发送0.56ms 38k红外波(编码中的0.56ms低电平)flag=1;

count=0;

TR0=1;

while(count

TR0=0;

if(ircode&0x01)//判断红外编码最低位,1宽的高电平,0窄的高电平{

set_count=120;

}

else

{

set_count=38;

}

flag=0;

count=0;

TR0=1;

while(count

TR0=0;

ircode=ircode>>1;

}

}

/*******************************************

发送2位红外数据

*******************************************/

void sendcode_2(void)//前26位系统码最后两位{

uchar i;

for(i=0;i<2;i++)

{

set_count=28;

flag=1;

count=0;

TR0=1;

while(count

TR0=0;

if(ircode&0x01)

{

set_count=120;

}

else

{

set_count=38;

}

flag=0;

count=0;

TR0=1;

while(count

TR0=0;

ircode=ircode>>1;

}

}

/*******************************************

发送红外数据

*******************************************/

void sendcode(void)

{

set_count=575;//发送9ms 38K红外光

flag=1;

count=0;

TR0=1;

while(count

TR0=0;

set_count=320;//间隔4.5ms

相关文档
最新文档