51单片机IrLink红外的使用

  • 元器件
  • 原理图部分
  • 代码
    • 单片机1发送main.c
    • 单片机2接受main.c
  • 工程文件

注意:本篇的密码接受有问题,不够仍然可以使用,想优化可以看我最新文章:最新优化,这个是没有bug的版本。

元器件

元器件 名称
51单片机 AT89C51
红外收发 IRLINK
按键 BUTTON
发光二极管 LED-RED
时钟激励源 DCLOCK
与门 74LS08
示波器

原理图部分


关于IRLINK的使用:
在Proteus上就是一个红外的发射接受一体的一个模块,另外在该模块红外接受上有一个解调的功能。如下图,1区域就是红外的发射区域,2区域就是红外的接受区域,3区域就是红外接受后进行解调的区域。

然后关于载波的频率,在IRLINK是可以选择对载波频率的要求的,双击元件。默认是40KHz。

这里频率采用的是Proteus激励源然后与单片机发出的信号经过们与门调制出来。下图是示波器观察信号的结果。

关于的发射的协议采用的网上说索尼的SonySIRC协议。本次实验采用类似的,以2.4ms的高电平加600us低电平为起始信号,600us为间隔,600us为高电平表示0,1200us为间隔,600us为高电平表示1,数据帧为:帧头为0x80,数据帧为0x40,帧尾为0x20,如果接受到0x40,且帧头帧尾不错误就点灯。本次irlink载波频率为20kHz。

代码

本次实验由单片机通过按键控制IrLink红外来进行通信点灯。

单片机1发送main.c

代码如下:

#include "reg51.h"
#include "intrins.h"typedef unsigned char uint_8;
typedef unsigned int uint_16;sbit TX=P2^0;
sbit KEY=P1^0;//600us
#define High_Low_Wide_H 0XFD
#define High_Low_Wide_L 0xA8 //600us
#define Low_Gap_H 0XFD
#define Low_Gap_L 0xA8//1200us
#define High_Gap_H 0xFB
#define High_Gap_L 0x50//2400us
#define Start_High_H 0xF6
#define Start_High_L 0xA0void scan_Key(void); //按键扫描函数
void Ir_Send_Bit(uint_16 us_h,uint_16 us_l,bit Status);
void Ir_Send_Data(uint_8 Data);
void TimerInit(void);
void main(void)
{bit key=0;TimerInit();TX = 0;while(1){scan_Key();}
}//按键扫描函数
void scan_Key(void)
{if(KEY==0){TX = 0;Ir_Send_Bit(Start_High_H,Start_High_L,1); //起始信号2.4msIr_Send_Bit(Low_Gap_H,Low_Gap_L,0); //间隔输出0.6msIr_Send_Data(0x80);//起始帧0x80Ir_Send_Data(0x40); //数据Ir_Send_Data(0x20);//终止帧}
}//一位发送
void Ir_Send_Bit(uint_16 us_h,uint_16 us_l,bit Status)
{TH0 = us_h;       //设置定时初值TL0 = us_l;        //设置定时初值TF0 = 0;       //清除TF0标志TR0 = 1;      //定时器0开始计时if(Status==1){TX = 1;while(TF0==0);}else if(Status==0){TX = 0;while(TF0==0);}TF0 = 0;TR0 = 0;  //关闭定时器TX = 0;
}//八位发送 从最低位往高位发送
void Ir_Send_Data(uint_8 Data)
{uint_8 i=0;for(i=0;i<8;i++){if(Data&0x01) //高电平{Ir_Send_Bit(High_Low_Wide_H,High_Low_Wide_L,1); //脉宽输出Ir_Send_Bit(High_Gap_H,High_Gap_L,0); //间隔输出}else{Ir_Send_Bit(High_Low_Wide_H,High_Low_Wide_L,1); //脉宽输出Ir_Send_Bit(Low_Gap_H,Low_Gap_L,0); //间隔输出            }Data >>=1;}
}void TimerInit(void)       //12微秒@12.000MHz
{TMOD=0X01;        //设置定时器模式
}

单片机2接受main.c

#include "reg51.h"
#include "intrins.h"typedef unsigned char uint_8;
typedef unsigned int uint_16;sbit RX=P2^1;
sbit LED=P1^0;void Ir_Receive(void);
uint_8 Ir_Receive_8Bit(void);
void TimerInit(void);
uint_8 All_Data[3]={0,0,0};
uint_16 time=0;void main(void)
{TimerInit();while(1){  if((All_Data[1]==0x40)&&(All_Data[0]==0x80)&&(All_Data[2]==0x20))LED=1;else LED=0;Ir_Receive();}
}//接受数据
void Ir_Receive(void)
{uint_8 i=0;if(RX==0){time=0;TR0 = 1;      //定时器0开始计时while(RX==0);time=TH0*256+TL0; //计算时间TR0 = 0;if((time>2000)&&(time<3000)) {TH0=0;TL0=0;  time=0;TR0 = 1;       //定时器0开始计时while(RX==1);time=TH0*256+TL0; //计算时间         TR0 = 0;if((time>300)&&(time<1000)) {time=0;while(i<3){All_Data[i]=Ir_Receive_8Bit();i++;}}}}
}//8位接受
uint_8 Ir_Receive_8Bit(void)
{uint_8 Data=0;uint_8 i=0;while(i<8){if(RX==1){TH0=0;TL0=0;    time=0;TR0=1;while(RX==1);time=TH0*256+TL0; //计算时间TR0 = 0;TF0=0;if((time>300)&&(time<1000)) Data>>=1;else if(time>1000) Data |=0x80;i+=1;}}return Data;
}void TimerInit(void)       //12微秒@12.000MHz
{TMOD=0X01;        //设置定时器模式TH0=TL0=0;TR0 = 0;
}

运行效果如图,led被正常点亮:

工程文件

工程文件

Proteus8仿真:51单片机IrLink红外发送加接受模块的使用相关推荐

  1. Proteus8仿真:51单片机LCD1602显示

    51单片机LCD1602显示 元器件 原理图部分 代码 main.c 工程文件 元器件 元器件 名称 排阻 RESPACK-8 51单片机 AT89C51 LCD1602 LM016L 按键 BUTT ...

  2. Proteus8仿真:51单片机A/D转换(ADC0808)

    51单片机A/D转换 元器件 原理图部分 代码 main.c 工程文件 元器件 元器件 名称 排阻 RESPACK-8 51单片机 AT89C51 数码管 7SEG-MPX4-CA-BLUE ADC芯 ...

  3. Proteus8仿真:51单片机使用ULN2003A控制步进电机

    51单片机使用ULN2003A控制步进电机 元器件 原理图部分 代码 main.c 工程文件 实验内容: 使用按键控制步进电机正反转. 元器件 元器件 名称 电阻 RES 51单片机 AT89C51 ...

  4. 51单片机 玩转按键加减切换+数码管+Proteus仿真

    51单片机 玩转按键加减切换+数码管+Proteus仿真 实例代码 /* 实验说明:实验接线:1,动态数码管模块-->单片机管脚2,独立按键模块-->单片机管脚 K1-->P10K2 ...

  5. 51单片机串口通信发送以及接收代码详解1

    #include <reg51.h> //实验现象:单片接收电脑发送的字符串,并发回给PC端的代码.//函数声明 void uart_init(void); void uart_seng_ ...

  6. 51单片机串口通信发送以及接收代码详解2

    #include <reg51.h> //实验现象:在电脑端没按下发送的时候,单片一直给电脑发送aaa字符串: //实验现象:在电脑端按下发送的时候,结束字符串aaa的发送代码,执行单片接 ...

  7. 基于51单片机的红外体温计的设计

    硬件设计 本系统利用51单片机控制红外温度传感器进行温度的非接触式检测并显示,能够实现快速测量人体体温.            整体电路主要由51单片机最小系统,LCD1602液晶显示电路,蜂鸣器报警 ...

  8. 51单片机使用和配置HC-05蓝牙模块

    需要的工具: usb转ttl模块*1 模块如下: 要想使用HC-05蓝牙模块进行单片机之间通讯或者单片机和蓝牙设备之间通讯,首先要配置好HC-05蓝牙模块的参数.设置好蓝牙的名称.密码.波特率等待. ...

  9. protues仿真51单片机教程

    protues是一款常用的单片机仿真软件,在很多情况下,我们做一些简单的项目,手边没有单片机或者不想麻烦的情况下,可以借助protues来仿真测试程序,protues内集成了几款常用的51内核的单片机 ...

最新文章

  1. Pytorch: 命名实体识别: BertForTokenClassification/pytorch-crf
  2. BZOJ2091 [Poi2010]The Minima Game
  3. 数据仓库的架构与设计
  4. [转]ubuntu系统中遇到的一些问题及解决
  5. echarts鼠标事件以及自定义数据获取
  6. [one day one question] safari缓存太厉害
  7. python_day7 绑定方法与非绑定方法
  8. 千万并发连接下,如何保障网络性能
  9. 当ASP.NET Forms验证方式遭遇苹果IOS
  10. 30G 超大数据文件,如何用一周时间导入生产数据库?
  11. 根据标准word模板生成word文档类库(开源)
  12. 职场必备:公司高层职位的英文缩写
  13. 【javascript】 的严格模式 详解
  14. mysql数据表字段繁体转简体_【WORD】阿拉伯数字变大写数字、简繁体转换等实用小技巧...
  15. CI框架 where 跟 OR 怎么连用
  16. 太阳电池IV测试软件,太阳能电池IV测试系统
  17. 一日精通python编程_爱上Python:一日精通Python编程
  18. 基于伽马变换自适应修正的全景首尾融合算法
  19. HCNA基础篇问答式笔记整理
  20. MES与设备层的集成

热门文章

  1. 用计算机代码选址的优点,计算机机房选址原则
  2. vs2010单文档对话框窗口界面设置
  3. 学asp.net的自己学做网站的第一感受
  4. adb connect 远程adb连接手机无法连接,显示由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。(10060)windows调试Linux解决方式 ip连接方式
  5. 受限玻尔兹曼机和深度置信网络
  6. 华为HCIE证大数据证书社会认可度怎么样?
  7. Cisco 交换、路由和无线基础期末考试答案
  8. 西班牙语dele等级_2019年西班牙语dele考试各等级要求
  9. java 地址_java地址收藏(持续更新中...)
  10. qt designer 建qrc文件供Eric6使用步骤