赞助论坛
  • 9790阅读
  • 0回复

89C52制作数字电视机顶盒遥控器 [复制链接]

楼层直达
lhmtv  
发帖
6
精华
0
金币
10
威望
0
贡献
0
好评
0
注册
2010-03-29
楼主    lhmtv 发表于: 2010-06-06 02:02:36 
STC89C52制作数字电视机顶盒遥控器


/***********************************************************
适用湖南广电机顶盒遥控器代码 邵阳市隆回华宇电子

P1^0 接500Ω电阻至三极管的基极(型号PNP 9015)
集电极接红外发射管的正极 发射极接10Ω电阻至5V电源
************************************************************/
#include <reg52.h>
#define uint unsigned int //宏定义变量类型
#define uchar unsigned char
bit irout;//红外管0 1状态
sbit ir=P1^0;//红外发射管控制脚
uint count;uint set_count;//中断计数,设定中断次数
bit flag;bit keyflag;//红外发送控制,按键标识位
uchar irsys[2]={0x40,0x2c};//厂家系统码
uchar ircode;uchar irdata;
/**********************************************
延时1ms
***********************************************/
void delay(uint z)//延时1ms,晶振24M
{
  uint x,y;
  for(x=z;x>0;x--)
    for(y=200;y>0;y--);
}
/**********************************************
键盘扫描
**********************************************/

void keyscan(void)
{
uchar keytemp;
P3=0xff;
keytemp=P3&0x0f;
if(keytemp!=0x0f)
  {
  delay(15);
  keytemp=P3&0x0f;
  if(keytemp!=0x0f)
  keyflag=1;//有按键标识
  switch(keytemp)
    {
    case 0x0e:irdata=03;break;//按键1对应该遥控器P+的键值
    case 0x0d:irdata=02;break;//按键2对应该遥控器P-的键值
    case 0x0b:irdata=14;break;//按键3对应该遥控器VOL+的键值
    case 0x07:irdata=26;break;//按键4对应该遥控器VOL-的键值
    }
  }
}
/*******************************************
发送8位红外数据
*******************************************/
void sendcode_8(void)
{
uchar i;
for(i=0;i<8;i++)
{
set_count=30;//发送0.56ms 29k红外波(编码中的0.56ms低电平)
flag=1;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
if(ircode&0x01)//判断红外编码最低位,1宽的高电平,0窄的高电平
{
  set_count=99;
  }
else
  {
  set_count=32;
  }
flag=0;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
ircode=ircode>>1;
  }
}
/*******************************************
发送红外数据
*******************************************/
void sendcode(void)
{
set_count=529;//发送9ms引导码 29K红外光
flag=1;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
set_count=264;//发送4.5ms引导码 29K红外光
flag=0;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
ircode=irsys[0];//发送厂家系统码的前1-8位
sendcode_8();
ircode=irsys[1];//发送厂家系统码的前9-16位
sendcode_8();
ircode=irdata;//发送8位按键数据码
sendcode_8();
ircode=~irdata; //发送8位按键数据反码
sendcode_8();
set_count=33;//发送0.56ms结束码 29k红外波(编码中的0.56ms低电平)
flag=1;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
ir=1;  
}
/*******************************************
定时器初始化
*******************************************/
void init_timer(void)
{
EA=1;
TMOD=0X02;//8位自动重载模式
ET0=1;
TH0=0XDE;//定时17us,29K红外波,晶振24M
TL0=0XDE;
}
/*******************************************
主函数
*******************************************/
void main(void)
{
init_timer();
count=0;
flag=0;
irout=1;
while(1)
{
  keyscan();
  if(keyflag)//若有键按下
  {
  delay(15);
  sendcode();//发送红外编码
  delay(200);
  keyflag=0;//按键标识清零
  }
}
}

/*******************************************
定时器中断
*******************************************/
void timer0(void) interrupt 1
{
count++;
if(flag==1)
{
irout=~irout;
}
else
{
  irout=1;
}
ir=irout;
}