登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 制作学习型红外遥控器

[复制链接]
发表于 2019-2-13 14:45:22 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 红外线的调制与解调
PWM
EEPROM
学习安排: 做一个具有掉电记忆能解码别的遥控器并且并且具有学习功能
开始时间: 2019-02-11
结束时间: 2019-02-13
    学到现在开发板上没有用过的模块已经不多了;nRF24L01无线模块,AD转换,红外发射,学习了红外线的解码之后知道了遥控器的工作原理,之前以为是用不同波长的红外线表示不同的信号,现在知道了用的是大概38KHz的调频,通过载波和空闲不同时间的配合来实现传输0和1,组成引导码用户吗和按键码,很想用上红外发射管,于是先做一个能学习能发射红外线的遥控器,但是两天了,并没有做好,从目前的现象推测可能是延时函数不准确,导致红外线不能被设备识别出来,时间不多了,先继续学习别的,或许会突然灵光一现,想通解决办法了,要是有对这个项目感兴趣的可以一块讨论一下,部里的单片机有内部PWM模块,还在研究中。
定时器0用于接收时计算时间,定时器1用于产生38K载波
[mw_shl_code=c,true]
bit fashe(unsigned char yhm,unsigned char ajm)
{
        bit flag = 0;
        unsigned char dat;
        unsigned char i;
        TR1 = 1;
        delayms(9);
        TR1 = 0;
        delayus(4500);//引导码
                dat = yhm;  //用户码
        for (i=0;i<8;i++)
        {
                if(dat&1 ==1)
                {
                        TR1 = 1;
                  delayus(560);
      TR1 = 0;
            delayus(1680);//"1"               
                }
                else
                {
                        TR1 = 1;
                  delayus(560);
      TR1 = 0;
            delayus(560);//"0"               
                }
                dat=dat>>1;
        }
                  dat = yhm;//用户码(有时候是反码)
        for (i=0;i<8;i++)
        {
                if(dat&1 ==1)
                {
                        TR1 = 1;
                  delayus(560);
      TR1 = 0;
            delayus(1680);//"1"               
                }
                else
                {
                        TR1 = 1;
                  delayus(560);
      TR1 = 0;
            delayus(560);//"0"               
                }
                dat=dat>>1;
        }


                dat = ajm;//按键码
        for (i=0;i<8;i++)
        {
                if(dat&1 ==1)
                {
                        TR1 = 1;
                  delayus(560);
      TR1 = 0;
            delayus(1680);//"1"               
                }
                else
                {
                        TR1 = 1;
                  delayus(560);
      TR1 = 0;
            delayus(560);//"0"               
                }
                dat=dat>>1;
        }
                        dat = ~ajm;//按键反码
        for (i=0;i<8;i++)
        {
                if(dat&1 ==1)
                {
                        TR1 = 1;
                  delayus(560);
      TR1 = 0;
            delayus(1680);//"1"               
                }
                else
                {
                        TR1 = 1;
                  delayus(560);
      TR1 = 0;
            delayus(560);//"0"               
                }
                dat=dat>>1;
        }

        flag=1;
return flag;
}

/*定时器一产生38K载波*/
void Interrupt_Timer_1() interrupt 3
{
        TH1 = 0xff;
        TL1 = 0xdc;
        PWMOUT = ~PWMOUT;     
}[/mw_shl_code]


第一位成功标志位

第一位成功标志位
学习笔记.png

评分

参与人数 1银币 +1 收起 理由
如果让他嘎斯 + 1 很给力!

查看全部评分

好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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