首页 > 代码库 > 「51单片机」红外接收、发射模块代码
「51单片机」红外接收、发射模块代码
一、简介
红外发射模块:电源3.3V或5V,通过发射管发射38KHz的红外信号,高电平驱动
红外接收模块:电源3.3V或5V,可接收红外信号,并解调成逻辑电平,低电平有效
二、电路图
红外发射电路图
红外接收电路图
三、红外发射模块代码
#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//管脚定义sbit key = P2^0;sbit out = P2^1;//函数声明void delayms(uchar aa); //红外发射延时void khz(uchar aa); //发射38KHzvoid 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<reg51.h>#include<intrins.h>#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;}
「51单片机」红外接收、发射模块代码
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。