首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

51单片机学习札记:红外接收(对原子哥的ALIENTEK遥控器进行解码)

2013-02-24 
51单片机学习笔记:红外接收(对原子哥的ALIENTEK遥控器进行解码)??红外接收管? 通用型即可??--------------

51单片机学习笔记:红外接收(对原子哥的ALIENTEK遥控器进行解码)

?

?

红外接收管? 通用型即可
51单片机学习札记:红外接收(对原子哥的ALIENTEK遥控器进行解码)
?


?---------------------------------------

下面是类似的波形图,这个是网上找的,图片较大,缩小后看上去有些模糊,不过没关系,数据手册上一般都有


51单片机学习札记:红外接收(对原子哥的ALIENTEK遥控器进行解码)
?

遥控器在发射红外信号之前,我们的mcu已经开启了定时器
在定时器中断函数中的全局变量irTimeCounts++ 一直在自加
irTimeCounts多长时间加一次? 或者说多长时间进入一次定时器中断函数呢?
在方式2时,t=256*12/11059200 约为277.78us
============================================================
1.对于1.125ms的时间,timer0会中断1.125/t=4.05次 也就是要5次,算上各种误差,(顶多5次,至少4次)
2.对于2.25ms 的时间,timer0会中断 2.25/t=8.1次, 也就是要9次,算上各种误差,(顶多9次,至少8次)
? 对于这里的次数,比N次小一点,就是N次,比N次大一点,就是N+1次,因为不会有半次,
? 误差给它正负0.4次足够了,给了误差后再算次数,直接舍入就行

那么我们就检测irTimeCounts的值,
如果小于6或7,那么接收到的数据为0
如果大于6或7,那么接收到的数据为1

从计算结果来看,我觉得0.56,1.125,2.25这些值的出现是比较合理的,
能有效避免由于器件误差和环境造成的数据误判,而且计算也方便

?

#include "smg.h"#include "my51.h"static u8 code table[]= { //0~F外加小数点和空输出的数码管编码0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 30x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 70x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B0x39 , 0x5e , 0x79 , 0x71 , // C D E F0x80 , 0x00 , 0x40          // . 暗 负号    暗即不显示是第17索引号 };//负号为第18索引号元素/*  由于此表只能一次显示一个小数点,故已注释掉,仅供查询例如想要第一个和第六个数码管小数点同时点亮,则执行 pWela->dot = 0xfe & 0xdf  即可u8 code dotTable[]={   //小数点位置,某一位置0时,小数点亮0xff ,                 //那么全暗就是0xff0xfe , 0xfd , 0xfb ,   //1 2 30xf7 , 0xef , 0xdf     //4 5 6                    };*/u8 data smgWela[7]={0,0,0,0,0,0,0}; //第一位到第六位,最后一个是小数点位置控制//P0口的数码管位选控制锁存器只用了低6位,我们保留高2位的数据,留作它用void displaySMG(u8* pWela){u8 i=0;    //控制6位数码管显示函数,不显示的位用参数dark    u8 preState=P0|0x3f;  //保存高2位状态,其中最高位是ADC0804的片选信号wela=0;dula=0;_nop_();//先锁定数据,防止吴亮及位选锁存器高2位数据被改变P0=0;         //由于数码管是共阴极的,阳极送低电平,灯不亮    dula=1;_nop_();    dula=0;         //段选数据清空并锁定    P0=preState;    //共阴极数码管是阴极置高不亮,低6位置1,高2位保留    wela=1;_nop_();  //注:wela和dula上电默认为1     wela=0;    //位选锁定,初始保留高2位的数据,低6位置高不亮for(i=0;i<6;i++)  //显示6位数码管{P0=table[pWela[i]]|(((1<<i) & pWela[6])?0x00:0x80);    dula=1;_nop_();     //送段数据,叠加小数点的显示,0x00点亮小数点    dula=0;       P0=preState&~(1<<i); //不影响高2位数据,低6位是数码管位选,低电平有效    wela=1;_nop_(); //送位选号    wela=0;    delayms(1); //稍作延时,让灯管亮起来{  //消除叠影及误亮,阴极置1不亮,低6位置1,高2位保留并锁定        P0=preState;        wela=1;_nop_();        wela=0;    }}}

?

热点排行