BXAK 发表于 2012-10-12 22:19:57

基于STC89C52的简易学习型红外遥控器

做了个简单的单键学习,需要多键自行扩展添改程序

主程序main.c:// 简易学习型红外遥控器,STC89C52RC @ 12MHz,使用定时器2可编程时钟输出 P1.0 产生38KHz
//

#include "share_main.h"
#include "EEPROM.H"

sbitIRS   =P1^0;   //发送【不可改】
sbitIRR   =P1^1;   //接收
sbitkeyA=P3^2;   //学习键
sbitkeyB=P3^3;   //发射键
sbitLED   =P1^3;   //学习指示灯

#define   _NUM    68            //捕捉电平数目
#define   NUMS    (_NUM*2)//缓存大小

uint8ibuf;
bit   B_finish;



//定时器2可编程时钟输出初始化(输出引脚P1.0)
// 6T模式 频率 = CPU_FOSC/(2*(65536-RCAP2HL))
//12T模式 频率 = CPU_FOSC/(4*(65536-RCAP2HL))
#define   T2CLKO_INIT(_Hz)\
                TR2 = 0;\
                T2CON = 0;\
                T2MOD = 0x02;\
                RCAP2H = (uint16)(65536-(CPU_FOSC/4/_Hz+0.5))/256;\
                RCAP2L = (uint16)(65536-(CPU_FOSC/4/_Hz+0.5))%256

#define   T2CLKO_ON()           TR2=1   //打开T2时钟输出
#define   T2CLKO_OFF()   TR2=0          //关闭T2时钟输出

/*****************************************************
函数:捕捉红外电平时间
*****************************************************/
void catch ()
{
        uint8 i;

        for (i=0; i<NUMS; i++) buf = 0;//清缓存

NEW_START:
        TR0 = 0;
        TH0 = 0;
        TL0 = 0;
        TF0 = 0;
        while (IRR);         //等待IRR=0
        TR0 = 1;                           //启动T0计数低电平时间
        for (i=0; i<4; i++) if (IRR)goto NEW_START;        //是干扰误触发,跳往起点

        for (i=0; (i<NUMS) && !TF0; )
        {
                while (!IRR && !TF0);      //等待IR=1
                TR0 = 0;
                buf = TH0;             //保存(管脚)低电平时间
                i++;
                buf = TL0;
                TL0 = 0;
                TR0 = 1;                              //启动T0计数高电平时间
                TH0 = 0;
                i++;

                while (IRR && !TF0);       //等待IR=0
                TR0 = 0;
                buf = TH0;
                i++;
                buf = TL0;
                TL0 = 0;
                TR0 = 1;                              //启动T0计数高电平时间
                TH0 = 0;
                i++;
        }
        TR0 = 0;
        B_finish = 1;    //接收完成
}

void SIR()
{
        uint8i;
        uint16 nc;

        for (i=0; i<NUMS; i+=2)
        {
                nc = 65536 - (buf*256 + buf);//定时赋值计算
                nc += 10;      //数据修正
                buf = nc/256;
                buf = nc%256;
        }

        for (i=0; i<NUMS; )
        {
                TH0 = buf;
                i++;
                TL0 = buf;
                i++;
                TF0 = 0;
                TR0 = 1;
                T2CLKO_ON();
                while (!TF0);
                T2CLKO_OFF();
                IRS = 1;               //发射结束端口常态
                TR0 = 0;

                TH0 = buf;
                i++;
                TL0 = buf;
                i++;
                TF0 = 0;
                TR0 = 1;
                while (!TF0);
                TR0 = 0;
        }
}

void main(void)
{
        s_uint16 count;

        T2CLKO_INIT(38000);
        TMOD &= 0xF0;                  //清除定时器0模式位
        TMOD |= 0x01;                 //定时器0为16位工作方式

        while (1)
        {
                if (!keyA)
                {
                        LED = 0;
                        catch ();
                        EROM_C(0);    //擦除扇区0
                        EROM_W_STR(0x0000, buf, NUMS);//将捕捉到的数据(缓存buf)从EEPROM地址0x0000开始依次装入
                        LED = 1;
                }


                if (!keyB)
                {
                        if (++count > 10000)
                        {
                                count = 0;
                                EROM_R_STR(0x0000, buf, NUMS);//将EEPROM地址0x0000开始连续NUMS字节 读出装入缓存buf
                                SIR();   //发送红外
                                while (!keyB);
                        }
                }
                else {
                        count = 0;
                }
        }
}TKStudio、Keil工程源码:



yihui184 发表于 2012-10-13 09:06:01

谢谢BXAK,哈哈!

15813191501 发表于 2012-10-13 09:55:09

学习一下,

maxims 发表于 2012-10-13 10:56:14

{:smile:}mark
折腾完电源再说

tonyone 发表于 2012-10-13 15:42:47

记号一下

Xlt123gO 发表于 2012-10-15 13:08:13

有机会电脑上看看,标记

yihui184 发表于 2012-11-27 13:56:01

BXAK,我想问两个问题:
1.NEC的重复码里面有约96ms的低电平、长虹遥控RC5连续发射时的间隔有约86ms低电平,不存这些重复码,有没有影响呢?
2.NEC编码有68个电平要保存,一个电平用两个字节保存,需要134个字节,假如我以NEC的这个容量,那其他制式的编码,这个容量够保存其他制式的电平么?
BXAK大哥,希望有空回复我一下,谢谢!

mTouch 发表于 2012-11-30 12:48:54

有人试验成功过吗?

zhxshseu 发表于 2013-4-8 14:44:37

多谢分享~~{:smile:}

number007cool 发表于 2013-5-29 13:56:21

发射电路怎么接   
我手头上应该有红外的发射头就是不知道是不是38khz的

wkman 发表于 2013-5-29 15:49:17

{:victory:}{:handshake:}支持一下。学习
页: [1]
查看完整版本: 基于STC89C52的简易学习型红外遥控器