51单片机红外功能实例分析

2019-07-17 05:59:00 来源:电子发烧友网
标签:
一、简介
 
红外发射模块:电源3.3V或5V,通过发射管发射38KHz的红外信号,高电平驱动
 
红外接收模块:电源3.3V或5V,可接收红外信号,并解调成逻辑电平,低电平有效
 
二、电路图
 
红外发射电路图
 
红外接收电路图
 
三、红外发射模块代码
 
#include
 
#include
 
#define uchar unsigned char
 
#define uint unsigned int
 
//管脚定义
 
sbit key = P2^0;
 
sbit out = P2^1;
 
//函数声明
 
void delayms(uchar aa); //红外发射延时
 
void khz(uchar aa); //发射38KHz
 
void IR_OUT(uchar num); //红外发射
 
void keyScan(); //读取键盘信息
 
//变量声明
 
uchar i, a, num1;
 
//-----------------------
 
//红外发射延时
 
//-----------------------
 
void delayms(uchar aa)
 
{
 
for(a=aa; a》0; a--)
 
{
 
_nop_();
 
_nop_();
 
_nop_();
 
_nop_();
 
_nop_();
 
_nop_();
 
_nop_();
 
_nop_();
 
}
 
}
 
//-----------------------
 
//发射38KHz
 
//-----------------------
 
void khz(uchar aa)
 
{
 
for(a=aa;a》0;a--) //这个for语句可以得到准确的26.3波特率
 
{
 
out=0;
 
i=7;
 
while(i》0) i--; //38kHZ
 
out=1;
 
}
 
}
 
//-----------------------
 
//红外发射
 
//-----------------------
 
void IR_OUT(uchar num)
 
{
 
khz(116); //发射3ms 38khz
 
delayms(125);
 
for(num1=8; num1》0; num1--)
 
{
 
khz(40);
 
if(num&0x01)
 
delayms(93); //delay 1.5ms
 
else
 
delayms(65); //delay 1ms
 
num=num》》1;
 
}
 
khz(20);
 
}
 
//-----------------------
 
//读取键盘信息
 
//-----------------------
 
void keyScan()
 
{
 
if(key==0)
 
{
 
_nop_(); _nop_(); _nop_();
 
_nop_(); _nop_(); _nop_();
 
if(key==0)
 
IR_OUT(0xC0);
 
key = 1;
 
}
 
}
 
//-----------------------
 
//主函数
 
//-----------------------
 
void main()
 
{
 
key = 1;
 
while(1)
 
{
 
keyScan();
 
}
 
}
 
四、红外接收模块代码
 
#include
 
#include
 
#define uchar unsigned char
 
#define uint unsigned int
 
//管脚定义
 
sbit in = P3^2; //红外中断接收
 
//P2接静态数码管
 
//函数声明
 
void init(); //初始化函数
 
void delayms(uchar j); //延时函数
 
//变量声明
 
uchar i, num, a;
 
bit fleg;
 
//-----------------------
 
//初始化函数
 
//-----------------------
 
void init()
 
{
 
fleg = 1; //标志位
 
in = 1; //红外接收
 
EA = 1; //中断设置
 
EX0 = 1;
 
IT0 = 1;
 
}
 
//-----------------------
 
//延时函数
 
//-----------------------
 
void delayms(uchar j)
 
{
 
for(i=j; i》0; i--)
 
{
 
_nop_(); _nop_(); _nop_();
 
_nop_(); _nop_(); _nop_();
 
}
 
}//-----------------------
 
//主函数
 
//-----------------------
 
void main()
 
{
 
init();
 
while(1);
 
}
 
//-----------------------
 
//接收中断
 
//-----------------------
 
void sieasdf() interrupt 0
 
{
 
EX0 = 0;
 
for(a=5; a》0; a--)
 
{
 
delayms(35);//延时0.5ms 判断5次 5*0.5=2.5ms
 
if(in) fleg=0;
 
}
 
if(fleg)
 
{
 
delayms(72);//延时1ms 判断是不是高电平了
 
if(in)
 
{
 
delayms(115);//延时让它超过2ms; 2.5+1+1.623=5.123ms 开始读数据
 
delayms(118);//若偏移一位,可以去掉。
 
for(a=8; a》0; a--)
 
{
 
while(!in);
 
delayms(86);//延时1.188ms 判断IO高低,从而得0或1
 
num = num》》1;
 
if(in)
 
{
 
num = num|0x80;
 
delayms(31);//延时0.6ms 因为上面延时1.2ms+0.6 刚好跳过1.5ms
 
}
 
}
 
P2 = num;
 
}
 
}
 
fleg = 1;
 
EX0 = 1;
 
}
 
关注与非网微信 ( ee-focus )
限量版产业观察、行业动态、技术大餐每日推荐
享受快时代的精品慢阅读
 

 

继续阅读
一文读懂集成电路图
一文读懂集成电路图

看整机电路图、板块电路图和系统电路图都是看以集成电路为核心的电路图。应当怎样看集成电路图?看什么内容?应当达到什么要求呢?

高速串行总线要怎么走?难点在哪里?
高速串行总线要怎么走?难点在哪里?

差分走线,信号换层过孔数量,等长长度把控,阻抗控制要求,跨分割的损耗,走线拐角的位置形状,绕线方式对应的插损和回损,布局不妥当造成的一系列串扰和叠层串扰,布局不恰当操作焊盘存在的stub。

8421编码器、4线-2线编码器、优先编码器等,这些编码器的原理你都懂吗?
8421编码器、4线-2线编码器、优先编码器等,这些编码器的原理你都懂吗?

在数字系统里,常常需要将某一信息(输入)变换为某一特定的代码(输出)。把二进制码按一定的规律编排,例如8421码、格雷码等,使每组代码具有一特定的含义(代表某个数字或控制信号)称为编码。

PCB 材料对微带线和接地共面波导电路产生得影响分析
PCB 材料对微带线和接地共面波导电路产生得影响分析

在为某一电路设计选择最优PCB材料时,高频电路设计者通常需考虑电路的性能变化、物理尺寸和功率高低。

与器件输出、待测量和其他电压或电流的比例有关的比率特性解析
与器件输出、待测量和其他电压或电流的比例有关的比率特性解析

本文中所说的比率特性是指器件输出与待测量和其他电压或电流的比例有关。

更多资讯
大手笔,紫光将投资8000亿元用于DRAM芯片的研发量产?

与非网9月17讯,据韩媒报道,紫光集团最近宣布,将投资8000亿元,用于未来10年加快DRAM芯片的量产。公司将在武汉建设研发中心,在重庆建设生产基地,预计2021年投产。

海思推出首款基于AVS3标准的8K、120P超高清芯片

与非网 9 月 16 日讯,华为海思近日推出了一款超高清芯片Hi3796CV300。

印度也开始部署超级计算机,超算领域迎来新玩家

与非网 9 月 16 日讯,印度近日部署了首台超算,名为Param Shavak。

骁龙 865 处理器即将问世,骁龙 875 将重回台积电怀抱?

与非网9月16日讯,尽管高通今年的骁龙865处理器还没有公布,但关于骁龙875处理器的信息已经提前到来了。据外媒爆料称,骁龙875将采用5nm工艺生产。

力压麒麟980,麒麟990实现性能大升级

在CPU上,990 5G采用了7nm +EUV工艺制程,片上封装晶体管103亿个,而麒麟990和980分别为80亿个和69亿个。这就意味着更小的面积能封装更多的晶体管,带来更强的性能和更低的功耗。依旧采用A76的八核架构。