找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2001|回复: 0
打印 上一主题 下一主题
收起左侧

红外控制程序 电视遥控和机顶盒遥控解码 控制8个单片机io输出 可接8个继电器

[复制链接]
跳转到指定楼层
楼主
ID:82732 发表于 2015-10-19 17:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>   

sbit IR=P3^2;  //红外接口

sbit R1=P1^0;        //输出1

sbit R2=P1^1;

sbit R3=P1^2;

sbit R4=P1^3;

sbit R5=P1^4;

sbit R6=P1^5;

sbit R7=P1^6;

sbit R8=P1^7;         //输出8

#define DataPort P0 //定义数据端口

sbit LATCH1=P2^2;// 段锁存

sbit LATCH2=P2^3;//                /*------------------------------------------------

                全局变量声明

------------------------------------------------*/


unsigned char code DuanMa[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 显示段码值


0~9

unsigned char  irtime;//红外用全局变量


bit irpro_ok,irok;

unsigned char IRcord[4];

unsigned char irdata[33];


/*------------------------------------------------

                  函数声明

------------------------------------------------*/


void Ir_work(void);

void Ircordpro(void);


/*------------------------------------------------

                  定时器0中断处理

------------------------------------------------*/


void tim0_isr (void) interrupt 1 using 1

{

  irtime++;  //用于计数2个下降沿之间的时间

}


/*------------------------------------------------

                  外部中断0中断处理

------------------------------------------------*/

void EX0_ISR (void) interrupt 0 //外部中断0服务函数

{

  static unsigned char  i;             //接收红外信号处理

  static bit startflag;                //是否开始处理标志位

if(startflag)                        

{

    if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms

        i=0;

    irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1

    irtime=0;

    i++;

if(i==33)

           {

         irok=1;

i=0;

        }

  }

else

{

irtime=0;

startflag=1;

}

}


/*------------------------------------------------

                定时器0初始化

------------------------------------------------*/

void TIM0init(void)//定时器0初始化

{

  TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值

  TH0=0x00; //重载值

  TL0=0x00; //初始化值

  ET0=1;    //开中断

  TR0=1;   

}

/*------------------------------------------------

                  外部中断0初始化

------------------------------------------------*/

void EX0init(void)

{

         IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)

         EX0 = 1;   //使能外部中断

         EA = 1;    //开总中断

}

/*------------------------------------------------

                  键值处理

------------------------------------------------*/


void Ir_work(void)//红外键值散转程序

{

    switch(IRcord[3])//判断第4个数码值,电视遥控和机顶盒遥控不一样,所以加了两端,两个遥控器都能用


,实际用在灯上没用这么多路

    {

case 0x07:DataPort=DuanMa[1];R1=~R1;break;//1 显示相应的按键值

case 0x0b:DataPort=DuanMa[2];R2=~R2;break;//2

case 0x0f:DataPort=DuanMa[3];R3=~R3;break;//3

case 0x6f:DataPort=DuanMa[3];R3=~R3;break;//3

case 0x13:DataPort=DuanMa[4];R4=~R4;break;//4

case 0x17:DataPort=DuanMa[5];R5=~R5;break;//5

case 0x1b:DataPort=DuanMa[6];R6=~R6;break;//6

case 0x1f:DataPort=DuanMa[7];R7=~R7;break;//7

case 0x23:DataPort=DuanMa[8];R8=~R8;break;//8

case 0x27:DataPort=DuanMa[0];P1=0xf0;break;//off

    case 0x03:DataPort=DuanMa[0];P1=0xf0;break;//off

             default:break;

   }

   switch(IRcord[2])//判断第三个数码值

   {

     case 0x10:DataPort=DuanMa[1];R1=~R1;break;//1 显示相应的按键值

     case 0x03:DataPort=DuanMa[2];R2=~R2;break;//2

     case 0x01:DataPort=DuanMa[3];R3=~R3;break;//3

     case 0x06:DataPort=DuanMa[4];R4=~R4;break;//4

     case 0x09:DataPort=DuanMa[5];R5=~R5;break;//5

     case 0x1d:DataPort=DuanMa[6];R6=~R6;break;//6

     case 0x1f:DataPort=DuanMa[7];R7=~R7;break;//7

     case 0x0d:DataPort=DuanMa[8];R8=~R8;break;//8

     case 0x27:DataPort=DuanMa[0];P1=0xf0;break;//off

     case 0x6f:DataPort=DuanMa[0];P1=0xf0;break;//off

     default:break;

   }         

   irpro_ok=0;//处理完成标志

}

/*------------------------------------------------

                红外码值处理

------------------------------------------------*/

void Ircordpro(void)//红外码值处理函数

{

   unsigned char i, j, k;

   unsigned char cord,value;

   k=1;

   for(i=0;i<4;i++)      //处理4个字节

   {

      for(j=1;j<=8;j++) //处理1个字节8位

      {

         cord=irdata[k];

         if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差

         value|=0x80;

         if(j<8)

{

   value>>=1;

}

         k++;

     }

     IRcord[i]=value;

     value=0;     

  }

  irpro_ok=1;//处理完毕标志位置1

}


/*------------------------------------------------

                    主函数

------------------------------------------------*/

void main(void)

{

   P1=0xf0;

   EX0init(); //初始化外部中断

   TIM0init();//初始化定时器


   DataPort=0xfe; //取位码 第一位数码管选通,即二进制1111 1110

   LATCH2=1;      //位锁存

   LATCH2=0;

   while(1)//主循环

   {

      if(irok)                        //如果接收好了进行红外处理

      {   

Ircordpro();

         irok=0;

      }

      if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等

      {

Ir_work();

      }

   }

}

评分

参与人数 1黑币 +50 收起 理由
admin + 50

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表