HeP028 发表于 2013-6-17 23:27:27

本帖最后由 HeP028 于 2013-6-17 23:32 编辑

经过改造成功:STC90C58RD+11.0592#define IRSENDPORT P0

#define TIMER9000US            (65536-8294)                 //9mS
#define TIMER4500US        (65536-4147)                 //4.5mS
#define TIMER1650US        (65536-1520)                 //1.65mS
#define TIMER0560US        (65536-516)                 //0.56mS
#define TIMER40000US           (65536-36863)               //40mS
#define TIMER56000US           (65536-51609)               //56mS

void IrUserTimerConfiguration(void)
{
        TMOD |= 0x01;
        IRSENDPORT = 0XFF;
}



void IRWriteOneBit(BIT send_Mode,unsigned int TimerInitValue,unsigned char ChangNumer)
{
        unsigned char NumBer = 1 << ChangNumer;
        unsigned char onlyOneChangorAllChang = 20;
       
        if (ChangNumer < 8 && ChangNumer >= 0)        onlyOneChangorAllChang = 0;                //单独通道发送
        else if (255 == ChangNumer)                          onlyOneChangorAllChang = 1;                //所有通道都发送
        TH0 = TimerInitValue >> 8;                                                                       
        TL0 = TimerInitValue;
        TF0 = 0;
        TR0 = 1;
        if (send_Mode == 0)        while(!TF0);
        else while(1)
        {
                if (0 == onlyOneChangorAllChang)          IRSENDPORT |= NumBer;                //置位相应的通道
                else if (1 == onlyOneChangorAllChang)        IRSENDPORT = 0xff;
               
                if (TF0) break; if (TF0) break;
               
                if (0 == onlyOneChangorAllChang)                IRSENDPORT &= ~NumBer;                //CLR相应通道
                else if (1 == onlyOneChangorAllChang)        IRSENDPORT = 0x00;
               
                if (TF0) break; if (TF0) break; if (TF0) break;
                if (TF0) break; if (TF0) break; if (TF0) break;
                if (TF0) break; if (TF0) break; if (TF0) break; if (TF0) break;               
        }
        TR0 = 0;
    if (0 == onlyOneChangorAllChang)          IRSENDPORT |=NumBer;
        else if (1 == onlyOneChangorAllChang)        IRSENDPORT = 0xff;
}


void IRWriteOneChar(unsigned char ircode,unsigned char ChangNumber)
{
        unsigned char I = 0x00;
        for (I = 0;I < 8;I++)
        {
                IRWriteOneBit(1,TIMER0560US,ChangNumber);
                if (ircode & 0x01)       
                        {
                                IRWriteOneBit(0,TIMER1650US,ChangNumber);
                        }
                else
                        {
                                IRWriteOneBit(0,TIMER0560US,ChangNumber);
                        }
                ircode >>= 1;
        }       
}

void IrPortWriteIrcode(unsigned char *Ircode,unsigned char ChangNumber)
{
        IRWriteOneBit(1,TIMER9000US,ChangNumber);
        IRWriteOneBit(0,TIMER4500US,ChangNumber);

    IRWriteOneChar(*Ircode    ,ChangNumber);       
        IRWriteOneChar(*(Ircode+1),ChangNumber);
        IRWriteOneChar(*(Ircode+2),ChangNumber);
        IRWriteOneChar(*(Ircode+3),ChangNumber);

        IRWriteOneBit(1,TIMER0560US,ChangNumber);
        IRWriteOneBit(0,TIMER40000US,ChangNumber);
}解码用的也是论坛的很好用,误码率还算比较低的哈,解100次可能错一次:SBIT IRrecPort = PORTD^3;


void IRUsereceiveTimerConfiuration(void)
{
        T2MOD = 0X00;
        T2CON = 0X00;
        RCAP2L= (unsigned int)(0XFFFF-(250/((12/FOSC)+0.00005))+1);
        RCAP2H= (unsigned int)(0XFFFF-(250/((12/FOSC)+0.00005))+1)>>8;
        TL2   = RCAP2L;
        TH2   = RCAP2H;
        TR2 = 1;
        ET2 = 1;
        EA= 1;
}



BIT IRprotLaststatus = 0;                                   // 端口状态位
unsigned char codeCount = 0;                      // 数据码位计数
unsigned char irTime;                               // 码时间,用于以125us时间计时
unsigned char InfarereceiveArray;                // 接收数据缓存


void IRreceive_Hander(void) interrupt 5
{
        TR0 = 0;
        if (TF2)
        {
                TF2 = 0;
                irTime++;
                if (irTime == 120)                                        //存活时间240*125=30MS
                        {
                                irTime--;
                                codeCount = 0x3f;
                        }
                if (IRrecPort)        IRprotLaststatus = 1;
                else if (IRprotLaststatus)
                        {
                                IRprotLaststatus = 0;
                                if (irTime < 12)
                                {
                                        codeCount++;
                                        codeCount &= 0x1f;                //限制其codeCount不大于某某数
                                        InfarereceiveArray <<= 1;
                                        if (irTime > 7)
                                                {
                                                        InfarereceiveArray++;
                                                }
                                }
                                irTime = 0;
                        }
        }
        TR0 = 1;
}
不过哪位大神看下,如果自发自收1个单片机好像完成不了哇!

jackmo 发表于 2013-7-16 15:53:07

红外发射接收

jackmo 发表于 2013-7-16 15:55:05

红外接收发射

yyinfo263 发表于 2013-7-31 23:20:43

楼主 请教下在解码头文件中定义了一个
#defineCA_S       8                             //长按时间设置,单位:108mS(即 108mS整数倍,10倍以上为宜)
请问这个 CA_S为什么是108的整数倍呢 在哪里进行了定义 我这个地方不是太明白 恳请楼主指点下 谢谢

BXAK 发表于 2013-8-1 01:03:12

yyinfo263 发表于 2013-7-31 23:20 static/image/common/back.gif
楼主 请教下在解码头文件中定义了一个
#defineCA_S       8                             //长按时间设置,单位:108mS(即 108 ...


示波器
或者
自制的简易逻辑分析仪
或者
直接用电脑录音原理,如:利用一个二极管,就可以检测315M/433M遥控器发射数据的波形,解码PT2262
记录一个完整的NEC发射波形(按住遥控某一键不放)看看它的 重复码就清楚了

如果嫌麻烦直接看网上的测试:http://www.tinyos.net.cn/?article-39.html

yyinfo263 发表于 2013-8-1 07:23:06

谢谢楼主的耐心解答 有点理解了长按有一个重复码的 我是初学单片机不久。
还有一点不明 就是 CA_S 定义为8这个数了 这个数8为什么是108mS的整数倍 是不是有一个换算关系在这里面。

BXAK 发表于 2013-8-1 13:49:31

yyinfo263 发表于 2013-8-1 07:23 static/image/common/back.gif
谢谢楼主的耐心解答 有点理解了长按有一个重复码的 我是初学单片机不久。
还有一点不明 就是 CA_S 定义为8 ...

那个没规定,看个人需要取值

yyinfo263 发表于 2013-8-1 20:41:38

了解了 再次谢谢楼主

甲小虫 发表于 2013-8-2 14:19:14

m ar   k!

n321 发表于 2013-8-2 23:38:40

BXAK 发表于 2012-2-29 01:39 static/image/common/back.gif
回复【58楼】b60885262
-----------------------------------------------------------------------



楼主,你用的是STC11L04E吗,我也有2片,想拿一片实现从串口收到遥控码值后通过11L04E接红外头发送出去,另一片实现接红外头接收遥控码值解码从串口输出码值,能指点一下吗。当然一片能实现收发最好了。

BXAK 发表于 2013-8-4 18:51:12

n321 发表于 2013-8-2 23:38 static/image/common/back.gif
楼主,你用的是STC11L04E吗,我也有2片,想拿一片实现从串口收到遥控码值后通过11L04E接红外头发送出去, ...

一片就可以了

jsntzxh 发表于 2013-8-4 19:51:42

好东东,收藏

linbao01 发表于 2013-8-4 22:45:34

非常不错哦,谢谢

zlpvch 发表于 2013-8-12 00:28:40

mark            

liliuqun 发表于 2013-10-14 20:54:17

好东西,顶

二进制 发表于 2013-10-15 18:55:43

老帖了感谢 楼主

caoxuedong 发表于 2014-5-26 22:06:31

最近才开始用STC 1T的单片机,原先一直用的PIC,Mark一下,做块板子试试!

蓝蓝的恋 发表于 2014-5-27 09:01:55

好东西,记下了~

clarkewayne 发表于 2014-5-28 16:17:18

多謝分享,讚一個

downtoearth 发表于 2014-6-1 18:50:04

楼主很厉害,帖子很好。不过我都无心机学了

yydd_1 发表于 2014-6-9 12:01:35


多任务的思想,不错

ZYBing 发表于 2014-6-9 13:42:44

mark,谢谢分享!

zlpvch 发表于 2014-6-9 16:20:59

mark                  

zlo007 发表于 2014-7-4 08:47:40

mark,谢谢分享!

mindrover 发表于 2014-8-7 11:43:47

mark,最近要做这方面,谢谢楼主的无私

lengque007 发表于 2014-8-28 14:09:17

收藏了,谢谢楼主

t1510794321 发表于 2014-9-5 15:25:20

mark               

atg525 发表于 2015-1-26 16:23:13

很好红外编解码资料,谢谢分享!

suny1022 发表于 2015-1-26 17:10:28

够详细,GOOD

captain_steve 发表于 2015-1-26 19:09:57

Mark一下,好东西

请叫我中路杀神 发表于 2015-1-26 22:00:47

楼主不错

xurenhui 发表于 2015-1-26 22:33:56

楼主你太给了,服务也很给力,及时还给人分析,无私啊

yzh 发表于 2015-1-26 23:29:49

很不错的分享!

夏朗 发表于 2015-5-8 20:14:58

楼主你好! 我把红外解码程序在STC12T单片机上运行可以,但在STC 1T单片机上就不能正常解码了。请问需要做何更改呢?

dexidz 发表于 2015-5-8 20:20:27

夏朗 发表于 2015-5-8 20:14
楼主你好! 我把红外解码程序在STC12T单片机上运行可以,但在STC 1T单片机上就不能正常解码了。请问需要 ...

都是是挖坟的主啊.....
主要是延时函数的不同,用小精灵什么,重新生成一直试试就好用了

trm99999 发表于 2015-10-9 23:51:38

找了好久,这个发须得顶

Honey_comb 发表于 2015-10-10 08:51:50

红外解码mark

usm4glx 发表于 2015-10-10 16:51:27

回去马上试试,谢谢楼主啊,一直想涉足红外遥控解码这块

wthacb 发表于 2015-12-14 01:06:21

mark 好东西 谢谢楼主分享

风铃夜思雨 发表于 2015-12-14 12:03:56

老贴, 不过质量不错,刚好有部份代码正须要的..

zenghl 发表于 2016-6-13 12:35:40

谢谢楼主啊

cos 发表于 2016-6-13 13:31:13

好贴 收藏。

hefen-cai 发表于 2016-8-26 14:30:42

好东西学习的好资料

zjsdlt2013 发表于 2017-5-16 20:45:01

mark,赞一个!!!

tangly2017 发表于 2017-11-1 17:11:30

好资料,找了很久,谢谢楼主的分享

tangly2017 发表于 2017-11-1 21:38:14

楼主真是大好人,好东西学习了,谢谢你的分享!!

hefen-cai 发表于 2018-2-19 11:23:46

好东西学习了

desireyao 发表于 2018-9-29 22:40:02

很不错,{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}

changshs 发表于 2018-10-1 00:42:47

不错,学习了。

zijunh 发表于 2020-7-9 20:15:52

学习收藏,谢谢楼主

fengyunyu 发表于 2020-7-9 21:33:39

不错,收藏
页: 1 2 [3]
查看完整版本: 发一个红外线解码程序+仿真文件(可定义任意I/O作接收脚,支持长/短按,自适应主频6MHz~40