STC12C5410AD学习板---红外解码

发布者:平静宁静最新更新时间:2016-09-06 来源: eefocus关键字:STC12C5410AD  红外解码 手机看文章 扫描二维码
随时随地手机看文章
        这个是我自制STC12C5410AD学习板的红外解码程序,此程序是针对SAA3010红外编码芯片来做解码的。如果换了其他芯片,只要修改红外芯片的头文件就可以了。

STC12C5410AD学习板---红外解码 - 小文 - 小文电子设计

视频演示地址:

http://v.youku.com/v_show/id_XMTUyMzQwMjg4.html

以下是详细程序:

/*****Program Author  :  ZhengWen(ClimberWin)            *****/
/*****E_mail          :  cooldianzi@163.com              *****/
/*************************************************************/
/*****File  Function  :  IR Soft Recode(SAA3010)         *****/
/*****Compile Date    :  2009/2/4                        *****/
/*****Edition Info    :  V1.0                            *****/
/*****Amend   Date    :                                  *****/
/*************************************************************/
/************红外软件解码,遥控器型号,SAA3310芯片************/
/***********************2009.2.4******************************/
/***********可以红外解码LCD显示*************/
#include
#include "intrins.h "
#include "SAA3010_Recode.h"
#include "LCD12864.H"
#include
#include
#include
#include

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

sbit speaker=P2^1;
uchar LCD_IR_data[16]={0xbc,0xfc,0xd6,0xb5,0xce,0xaa,0x3a,0x30,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00};//键值为:0x00
void Delay1ms(unsigned int count);
void Key_Beep(void);
void Delay_Beep(unsigned int count1);
void init_rs232(void);

/***************************1秒延时子程序start***************************/
void Delay1ms(unsigned int count)
{
 unsigned int i,j;
 for(i=0;i  for(j=0;j<120;j++);
}

/***************************1秒延时子程序end***************************/

/*****************按键声音********************/
void Key_Beep(void)
{   uchar i;
     for (i=0;i<250;i++)
     { speaker=1;
      Delay_Beep(30);

      speaker=0;

      Delay_Beep(30);
      }
   speaker=1;
}

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

/***************************蜂鸣器延时子程序start**********************/
void Delay_Beep(unsigned int count)
{
 unsigned int i,j;
 for(i=0;i  for(j=0;j<10;j++);
}
/***************************蜂鸣器延时子程序end************************/
/* 串口通信初始化设置 */
void init_rs232(void)
 {
 AUXR=74;       //设置波特率是普通51的12倍 ,允许AD中断
 SCON=0x50;
 PCON=0x00;
 TH1=0xFA;    //波特率 115200  22.1184MHZ 时候(F4 4800  FA 9600  FDH 9600)*12
 TL1=0XFA;
 TMOD=0X20;
 TR1=1;    
 }


void main(void)
{
uchar key_code_b; //红外遥控键值百位
uchar key_code_s; //红外遥控键值十位
uchar key_code_g; //红外遥控键值个位
 Delay1ms(1000);
 init_rs232();
 TI=1;
 printf("STC12C5410AD学习板 红外遥控解码\n");
 printf("ClimberWin 2009.2.4\n\n");
 Delay1ms(5000);

  LCD_INIT();
  Delay1ms(1000);
  LCD_LOCAL(1,1,"STC 单片机学习板");
  LCD_LOCAL(2,1,"MCU:STC12C5410AD");
  LCD_LOCAL(4,1,"Date:2009.2.4   ");
  LCD_LOCAL(3,1,"By ClimberWin   ");
/****************************************/
  Delay1ms(50000);
  LCD_LOCAL(1,1,"红外遥控测试界面");
  LCD_LOCAL(2,1,"遥控芯片:SAA3010");
  LCD_LOCAL(3,1,"测试结果:      ");
  LCD_LOCAL(4,1,"                ");
  printf("红外遥控测试界面\n"); 
    //Delay100us(8);    // 实为760uS
 Key_Beep();
    IR_Input = 1;//先把信号线拉高,等待接收红外信号
    while(1)
    {
     LCD_IR_data[7]=0x30;//初值设置显示000
  LCD_IR_data[8]=0x30;
  LCD_IR_data[9]=0x30;
     if(!IR_Input) SAA3010_Recode();
     if(SAA3010_CODE[0]==0x03)
     {Key_Beep();
  SBUF=SAA3010_CODE[3];//发送解码值到串口
  key_code_b=SAA3010_CODE[3]/100;   //把键值用十进制表示
     key_code_s=(SAA3010_CODE[3]%100)/10;
     key_code_g=(SAA3010_CODE[3]%100)%10;
     LCD_IR_data[7]=LCD_IR_data[7]+key_code_b;
  LCD_IR_data[8]=LCD_IR_data[8]+key_code_s;
  LCD_IR_data[9]=LCD_IR_data[9]+key_code_g;
  LCD_LOCAL(4,1,LCD_IR_data);//把解码数据显示到液晶上
  SAA3010_CODE[0]=0x00;
  SAA3010_CODE[1]=0x00;
  SAA3010_CODE[2]=0x00;
  SAA3010_CODE[3]=0x00;
  }
     else
     {SAA3010_CODE[0]=0x00;}
    }
}

LCD12864.H 如下:

/*****Program Author  :  ZhengWen(ClimberWin)            *****/
/*****E_mail          :  cooldianzi@163.com                       *****/
/*************************************************************/
/*****File  Function  :  LCD12864 Display Module         *****/
/*****Compile Date    :  2009/1/28                                *****/
/*****Edition Info    :  V1.0                                            *****/
/*****Amend   Date    :                                                *****/
/*************************************************************/
#ifndef __LCD12864__
#define __LCD12864__         
#include
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
sbit LCD_CS   = P1^7; //片选 高电平有效 单片LCD使用时可固定高电平rs
sbit LCD_SID  = P1^6; //数据   r/w
sbit LCD_SCLK = P1^5; //时钟   e

/********************LCD12864**************************/
void LCD_SEND(uchar date);
void LCD_SCOM(bit st,uchar date);
void LCD_DELAY(void);
void LCD_INIT(void);
void LCD_write(uchar *p);
void LCD_LOCAL(uchar x,uchar y,uchar *p);  
void LCD_cblank(uchar x,uchar y);
void LCD_count(long s,uchar x1,uchar y1,uchar x,uchar y,uchar *p);
void DELAYLCD(uchar t);
/*****************************************************/
/****************************lcd12864************************************/
void DELAYLCD(uchar t)
 {
   while(--t);
  }

void LCD_SEND(uchar date)
 {
      uchar i;
      LCD_SCLK=0;
      for(i=0;i<8;i++)
         {
           LCD_SID=date&0x80;
           LCD_SCLK=1;
           LCD_SCLK=0;
           date<<=1;
         }
  }
void LCD_SCOM(bit st,uchar date)
 {
         uchar st_temp,hdate,ldate;
         if(st)
              st_temp=0xfa;
         else st_temp=0xf8;
         hdate=date&0xf0;
         ldate=date&0x0f;
         ldate <<= 4;
         LCD_CS    = 1;
         LCD_SEND(st_temp);
         LCD_SEND(hdate);
         LCD_SEND(ldate);
         LCD_CS = 0;
         DELAYLCD(38);
 }
 void LCD_DELAY(void)
  { uchar s;
    s=10;
    while(--s)
   DELAYLCD(250);
   }
 void LCD_INIT(void)
  {
    LCD_SCOM(0,0x30);
    LCD_DELAY();
    LCD_SCOM(0,0x0c);
    LCD_DELAY();
    LCD_SCOM(0,0x01);  //清屏,将DDRAM的地址计数器归零
    LCD_DELAY();
  }
 void LCD_write(uchar *p)
  {
    while(*p)
     {
      LCD_SCOM(1,*p);
      p++;
     }
  }
  void LCD_LOCAL(uchar x,uchar y,uchar *p)        //lcd string (x,y) write!
  {
   switch (x)
   {
    case   1:LCD_SCOM(0,0x7f+y); LCD_write(p);break;
    case   2:LCD_SCOM(0,0x8f+y); LCD_write(p);break;
    case   3:LCD_SCOM(0,0x87+y); LCD_write(p);break;
    case   4:LCD_SCOM(0,0x97+y); LCD_write(p);break;
    default :LCD_SCOM(0,0x7f+y); LCD_write(p);
   }
  }
  void LCD_cblank(uchar x,uchar y)
  {
     switch (x)
      {
       case   1:LCD_SCOM(0,0x7f+y); LCD_SCOM(0,0x0d);break;
       case   2:LCD_SCOM(0,0x8f+y); LCD_SCOM(0,0x0d);break;
       case   3:LCD_SCOM(0,0x87+y); LCD_SCOM(0,0x0d);break;
       case   4:LCD_SCOM(0,0x97+y); LCD_SCOM(0,0x0d);break;
       default :LCD_SCOM(0,0x7f+y); LCD_SCOM(0,0x0d);
      }
  }

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

/*******************************************************************************/
#endif

SAA3010_Rncode.H  如下:

/*****Program Author  :  ZhengWen(ClimberWin)            *****/
/*****E_mail          :  cooldianzi@163.com                      *****/
/*************************************************************/
/*****File  Function  :  SAA3010 IR_Input soft recode *****/
/*****Compile Date    :  2009/2/4                               *****/
/*****Edition Info    :  V1.0                                        *****/
/*****Amend   Date    :                                            *****/
/*************************************************************/
/***************对红外遥控器SAA3010软件解码*******************/
#ifndef __SAA3010_Rncode__
#define __SAA3010_Rncode__
#define uchar unsigned char
#include
sbit  IR_Input=P3^4;
uchar SAA3010_CODE[4];

void SAA3010_Recode(void);
void Delay100us(uchar i);

/*************SAA3010解码程序**************/
void SAA3010_Recode(void)
{
    unsigned char i, j;
    bit FBIT;
    // IR_Input 由高变低,跳过第一次采样
    for (i=0; i<4; i++)
    {
        SAA3010_CODE[i] =0x00;
    }
    /*--------------------------------------
        曼彻斯特码:
        输入二元码        Manchester码
            0                01
            1                10
    ****************************************/
    // 设为第二次采样,采样时间间隔800uS
    Delay100us(8);

    if (!IR_Input)
    {
        // 因为SAA3010的起始位为1
        SAA3010_CODE[0] |=0x01;
        SAA3010_CODE[0] <<= 1;
        // 起始第二位一次采样
        Delay100us(8);
        if (IR_Input)
        {    // 采样是1
            SAA3010_CODE[0] |=0x01;
            FBIT = 1;
        }
        else
        {    // 采样是0
            FBIT = 0;
        }
        if (FBIT)
        {    // 若第一次采样是1
            while (IR_Input); 
        }
        else
        {
            while (!IR_Input); 
        }
        // 二次采样
        Delay100us(8);
        //----------------------------------------------------------------------------
        // 采样控制位
        // 一次采样
        Delay100us(8);
        if (IR_Input)
        {
            SAA3010_CODE[1] |=0x01;
            FBIT = 1;
        }
        else
        {
            FBIT = 0;
        }

        if (FBIT)
        {
            while (IR_Input);
        }
        else
        {
            while (!IR_Input);     // 等待IR_Input上升
        }
        // 二次采样
        Delay100us(8);
//----------------------------------------------------------------------------------
        // 收集系统码(5位)
        for (j=0; j<5; j++)
        {
            // 一次采样
            Delay100us(8);
            if (IR_Input)
            {
                SAA3010_CODE[2] |=0x01;
                FBIT = 1;
            }
            else
            {
                FBIT = 0;
            }

            if (FBIT)
            {
                while (IR_Input);
            }
            else
            {
                while (!IR_Input);
            }
            // 二次采样
            Delay100us(8);
            SAA3010_CODE[2] <<= 1;
        }

//-----------------------------------------------------------------------------

        // 收集数据码(6位)
        for (j=0; j<6; j++)
        {
            // 一次采样
            Delay100us(8);
            if (IR_Input)
            {
                SAA3010_CODE[3] |=0x01;
                FBIT = 1;
            }
            else
            {
                FBIT = 0;
            }

            if (FBIT)
            {
                while (IR_Input);
            }
            else
            {
                while (!IR_Input);
            }
            // 二次采样
            Delay100us(8);
            SAA3010_CODE[3] <<= 1;
        }
//-----------------------------------------------------------------------------
    }
    else
    {    // 是抖动
        for (i=0; i<4; i++)
        {
            SAA3010_CODE[i] =0x00;
        }

        return;
    }

    SAA3010_CODE[3]>>= 1;//09.2.4
}

/************760us延时程序********************/
void Delay100us(uchar i)
{
  uchar j;
    while(i<50)//50
    {
    for(j=0;j<50;j++)
    { _nop_();} 
    i++;
    }
}

/******************************************************/
#endif

关键字:STC12C5410AD  红外解码 引用地址:STC12C5410AD学习板---红外解码

上一篇:STC12C5410AD学习板---串口通信
下一篇:STM8S103 Unique ID读取

推荐阅读最新更新时间:2024-03-16 15:08

51红外解码调试笔记
前阵子帮他们做实习小车的买东西,看着便宜就顺便买了个红外的遥控器和1838的红外接收头子。这两天闲着没事,看了很多资料才终于完成了红外解码,的确是久了没玩51,好多东西生疏了导致调试过程几经挫折,经过这次复习了好多51的东西,受益匪浅。 查阅资料得知常见红外编码为PPM制式。红外发射端以脉宽0.565ms、间隔0.56ms的脉冲信号表示二进制 0 ,以脉宽0.565ms,间隔1.65ms的脉冲信号为 1 。如下图. 上述 0 、 1 组成的32位二进制码经过38KHz的载波进行二次调制以提高发射效率、降低电源功耗。 32位二进制码组中,前16位为用户识别码,能区别不同电气设备防止不同机种遥控码相互干扰。后16
[单片机]
51<font color='red'>红外解码</font>调试笔记
红外解码程序换种写法
#include reg52.h #define uint unsigned int #define uchar unsigned char sbit IR=P3^2; //红外接口标志 sbit RS = P1^0; sbit RW = P1^1; sbit E = P1^2; sbit beep = P1^7; uint hour,minute,second,count; char code Tab ={'0','1','2','3','4','5', '6','7','8','
[单片机]
STC12C5410AD学习板---AD按键测试程序
/************ STC12C5410AD学习板 ******************/ /*功能描述:AD按键练习 */ /*作者:郑 文 ClimberWin */ /*编写时间:2008.8.15 */ /*功能:采集按键电压;分配键值,并把键值传给PC机 */ /*外部晶振22.1184 MHZ */ /*把波特率设置为51的12倍,现在波特率 115200 */ /*注意:需要测得实际电源电压作为参考电压 */ /*L7805稳压在4.88-4.98V之间,根据实际测量确定电压 */ /
[单片机]
<font color='red'>STC12C5410AD</font>学习板---AD按键测试程序
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved