搜索
bottom↓
回复: 37

SAA-3010T红外遥控器C51解码成功!!!

[复制链接]

出0入0汤圆

发表于 2008-5-16 18:14:58 | 显示全部楼层 |阅读模式
以下为本人改编某个网址(具体的网址我忘了)的SAA-3010T解码程序所得,已经测试成功,希望可供大家参考,觉得不错的话就帮忙顶一下!如有疑问,可加本人QQ:175070658 讨论。

/********************************************************************************************
* 功    能:红外解码。
* 硬件条件:1.CPU型号:AT89S52
*           2.晶振:11.0592MHz
*           3.一体化红外接收头接P3.2
*           4.遥控器,型号为SAA-3010T。                                                                                 
*
*                   下面是通过本程序解码SAA-3010T电视遥控器的键值表         
*          **********************************************************
*          *[开关PWOER]12                                  [静音MUTE]13
*          *[1]01        [2]02        [3]03      [4]04
*          *[5]05        [6]06        [7]07      [8]08
*          *[9]09        [0]00        [单/双 _/__]10           [搜索]30
*          *[节目PROG+]32    [节目PROG-]33    [微调+]43   [微调-]44
*          *[音量VOL+]16    [存储STORE]41     [屏显]15               
*          *[音量VOL- ]17    [预调]14     [睡眠]38            
*          *[对比+]18   [色彩+]20    [亮度+]28   [录像AV]56
*          *[对比-]19   [色彩-]21    [亮度-]29   [电视TV]63
*          *********************************************************
*
* 作    者:LI RU-xiao
* 日    期:2008年5月6日

//==============================================================================
// 定义红外接收的接口(根据实际的硬件接线进行修改)
//==============================================================================
sbit SAA3010_RECV    = P3^2;    // INT0
//==============================================================================
//
// 状态机的含义:
//
//    状态S0:  初始状态
//    状态S1:  1,1 状态,在两个bit中间触发中断
//    状态S2: 0   状态
//
//    S1->S1: 1个周期
//    S1->S2: 1.5个周期
//    S2->S2: 1个周期或2个周期
//    S2->S1: 1.5个周期
//
//==============================================================================

//==============================================================================
// 时间常数(使用晶震频率为11.0592MHz)
//==============================================================================*/
#include <reg52.h>
#include <D:\C51_H\LCD1602.H>        //我的LCD1602库

//#define CYCLE_1_0        0x60A    // 1688us
//#define CYCLE_1_5        0x910    // 2532us
//#define CYCLE_2_0        0x0C15    // 3376us

#define CYCLE_1_0        0x65B    // 1776us
#define CYCLE_1_5        0x989    // 2664us
#define CYCLE_2_0        0x0CB7    // 3552us
#define TH_CYCLE_1_0    (CYCLE_1_0>>8)   //提取定时器高8位值
#define TH_CYCLE_1_5    (CYCLE_1_5>>8)
#define TH_CYCLE_2_0    (CYCLE_2_0>>8)

// 用于解码的变量
unsigned int  SAA3010RecvCode=0;        // 保存解码数值(1个开始位 1个控制位 5个地址位 6个命令位)
unsigned char SAA3010BitCount=0;        // 记录已经解码的位数
unsigned char SAA3010State=0;        // 初始状态
unsigned char buffer;

// 初始化中断及定时器
void SAA3010Init()
{  
    // 定时器0
    TMOD=0x01;    // T0工作于方式1,即16位定时器
    ET0=0;        // 关定时器0中断允许
    TR0=0;        // 关闭定时器0
    TH0=0;
    TL0=0;
   
    // 外部中断源INT0
    EX0=1;        // 允许外部中断源INT0
    PX0=1;        // 外部中断源为高优先级
    IT0=1;        // 边缘触发
   
        // 允许中断
    EA=1;
}

// 处理红外命令
void SAA3010ProcessCommand(int remotecode)
{
        buffer=(unsigned char)(remotecode&0xFF);
    speaData(buffer,2);           //我的自定义拆字子程序,提供给LCD1602显示
}

// 外部中断0的处理函数   SAA_3010T 解码程序
void SAA3010Int0(void) interrupt 0
{
    // 保存计数器的高位,作为判断周期长短的依据
    unsigned char HighTick=TH0;   
   
    // 重置计数器
    TH0=0;TL0=0;TR0=1;ET0=1;
   
    // 状态转移图
    switch( SAA3010State )
    {
    case 0: // 第一个起始位
        SAA3010State=2;
        SAA3010BitCount=1;   
        SAA3010RecvCode=0;
        break;
    case 1: // 状态1
        if(HighTick==TH_CYCLE_1_0) // S1->S1  (持续位1状态)
        {
            SAA3010State=1;
            SAA3010BitCount++;
            SAA3010RecvCode=SAA3010RecvCode<<1;
            SAA3010RecvCode=SAA3010RecvCode+1;
        }
        else if(HighTick==TH_CYCLE_1_5) // S1->S2 ( 1,1,0 )  转到位0状态
        {
            SAA3010State=2;
            SAA3010BitCount=SAA3010BitCount+2;
            SAA3010RecvCode=SAA3010RecvCode<<1;
            SAA3010RecvCode=SAA3010RecvCode+1;
            SAA3010RecvCode=SAA3010RecvCode<<1;
        }
        else // 错误状态
        {
            SAA3010BitCount=0;
            SAA3010State=0;
        }
        break;
    case 2: // 状态2
        if(HighTick==TH_CYCLE_1_0) // S2->S2(持续位0状态)
        {
            SAA3010State=2;
            SAA3010BitCount++;
            SAA3010RecvCode=SAA3010RecvCode<<1;
        }
        else if(HighTick==TH_CYCLE_1_5) // S2->S1(转到位1状态)
        {
            SAA3010State=1;
            SAA3010BitCount++;
            SAA3010RecvCode=SAA3010RecvCode<<1;
            SAA3010RecvCode=SAA3010RecvCode+1;
        }
        else if(HighTick==TH_CYCLE_2_0) // S2->S2
        {
            // 0->1->0
            SAA3010State=2;
            SAA3010BitCount=SAA3010BitCount+2;
            SAA3010RecvCode=SAA3010RecvCode<<1;
            SAA3010RecvCode=SAA3010RecvCode+1;
            SAA3010RecvCode=SAA3010RecvCode<<1;
        }
        else // 错误状态
        {
            SAA3010BitCount=0;
            SAA3010State=0;
        }
        break;
                default:break;
    }
}

// 定时器T0的中断处理函数
void SAA3010Timer0(void) interrupt 1
{
    ET0=0;        // 关定时器0中断允许
    TR0=0;        // 关闭定时器0

    // 出现了超时
    if( SAA3010BitCount==13 )
    {
        if((SAA3010State==1)||(SAA3010State==2))   // 0,1
        {
            SAA3010BitCount ++;
            SAA3010RecvCode=SAA3010RecvCode<<1;
            SAA3010RecvCode=SAA3010RecvCode+1;
        }
    }

    // 检查是否有合理数据
    if( SAA3010BitCount==14 )
    {
        // 停止中断0
        EX0=0;        
        // 处理遥控命令
        SAA3010ProcessCommand((~SAA3010RecvCode)&0x0FFF);
   
       // 重新初始化初始化
       SAA3010BitCount=0;
       SAA3010State= 0;

           LCD1602_puts(9,0,dataElem);    //键值显示程序
    }         
    // 启用中断
    EX0=1;
}

// 主函数
void main()
{
    //1602初始化
    LCD1602_init();
        LCD1602_puts(0,0,"SAA-3010T Test!");
        delay50ms(40);
        LCD1602_setCmd("CLR_SCR");
        LCD1602_puts(0,0,"KeyValue=");

    // 初始化红外接收设备
    SAA3010Init();

    while(1);
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2008-5-16 18:24:11 | 显示全部楼层
Mark

出0入0汤圆

发表于 2008-5-17 09:26:09 | 显示全部楼层
不错,谢谢共享。

出0入0汤圆

发表于 2008-5-17 12:54:10 | 显示全部楼层

出0入0汤圆

发表于 2008-5-17 17:14:43 | 显示全部楼层
不错不错

出0入0汤圆

发表于 2008-5-19 23:45:17 | 显示全部楼层
请问楼主,没有LCD1602.H文件,可以提供上来吗?

出0入0汤圆

发表于 2008-5-20 00:29:03 | 显示全部楼层
又是一个用计数器的,支持一下

出0入54汤圆

发表于 2008-5-20 08:22:05 | 显示全部楼层
呵,以前做过,这种用相位来区分0和1的解码起来相对麻烦一点。

出0入0汤圆

 楼主| 发表于 2008-5-20 10:32:50 | 显示全部楼层
LCD1602操作库ourdev_287162.txt(文件大小:10K) (原文件名:LCD1602.txt)

出0入0汤圆

发表于 2008-5-20 14:06:05 | 显示全部楼层
uint8 bdata bdat; 这句编译有错误,什么问题?程序未调试好吗?

出0入0汤圆

发表于 2008-5-21 09:46:16 | 显示全部楼层
这么强,谢谢分享,辛苦啦!!

出0入0汤圆

发表于 2008-5-21 17:30:26 | 显示全部楼层
路过,不过还是收下,学习一下

出0入0汤圆

发表于 2008-5-26 15:45:46 | 显示全部楼层
不错,学习了!

出0入0汤圆

发表于 2008-9-22 21:14:39 | 显示全部楼层
dataElem

speaData



这个变量和函数都没有呀?

出0入0汤圆

发表于 2008-10-24 12:51:57 | 显示全部楼层
不错

出0入0汤圆

发表于 2008-11-17 18:16:26 | 显示全部楼层
谢谢共享谢谢共享

出0入0汤圆

发表于 2009-2-21 11:35:37 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2009-8-5 12:15:11 | 显示全部楼层
很不错,注解很到位

出0入0汤圆

发表于 2009-8-9 11:13:11 | 显示全部楼层
值得推荐

出10入10汤圆

发表于 2009-8-9 17:13:03 | 显示全部楼层
好,一直在想,没动手

出0入0汤圆

发表于 2010-1-31 09:16:43 | 显示全部楼层
学习中.........

出0入0汤圆

发表于 2010-9-4 15:59:22 | 显示全部楼层
谢谢!

出0入0汤圆

发表于 2010-9-30 15:06:13 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-10-23 15:11:01 | 显示全部楼层
不错

出0入0汤圆

发表于 2010-11-11 13:38:24 | 显示全部楼层

出0入0汤圆

发表于 2010-11-13 13:42:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-9 02:53:02 | 显示全部楼层
学习中

出0入0汤圆

发表于 2011-1-20 23:54:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-24 14:22:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-23 17:49:23 | 显示全部楼层
不错

出0入0汤圆

发表于 2011-11-9 15:36:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-21 19:02:22 | 显示全部楼层
牛叉

出0入0汤圆

发表于 2012-12-24 09:08:01 | 显示全部楼层
支持强人!

出0入0汤圆

发表于 2012-12-24 09:20:38 | 显示全部楼层
觉得很牛,顶

出0入0汤圆

发表于 2013-3-10 08:37:31 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2013-3-17 20:02:23 | 显示全部楼层
额,来学习一下。。。

出0入0汤圆

发表于 2013-4-2 10:03:51 | 显示全部楼层
很牛!学习一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 17:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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