Proteus8仿真:51单片机IrLink红外发送加接受模块的使用
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红外发送加接受模块的使用相关推荐
- Proteus8仿真:51单片机LCD1602显示
51单片机LCD1602显示 元器件 原理图部分 代码 main.c 工程文件 元器件 元器件 名称 排阻 RESPACK-8 51单片机 AT89C51 LCD1602 LM016L 按键 BUTT ...
- Proteus8仿真:51单片机A/D转换(ADC0808)
51单片机A/D转换 元器件 原理图部分 代码 main.c 工程文件 元器件 元器件 名称 排阻 RESPACK-8 51单片机 AT89C51 数码管 7SEG-MPX4-CA-BLUE ADC芯 ...
- Proteus8仿真:51单片机使用ULN2003A控制步进电机
51单片机使用ULN2003A控制步进电机 元器件 原理图部分 代码 main.c 工程文件 实验内容: 使用按键控制步进电机正反转. 元器件 元器件 名称 电阻 RES 51单片机 AT89C51 ...
- 51单片机 玩转按键加减切换+数码管+Proteus仿真
51单片机 玩转按键加减切换+数码管+Proteus仿真 实例代码 /* 实验说明:实验接线:1,动态数码管模块-->单片机管脚2,独立按键模块-->单片机管脚 K1-->P10K2 ...
- 51单片机串口通信发送以及接收代码详解1
#include <reg51.h> //实验现象:单片接收电脑发送的字符串,并发回给PC端的代码.//函数声明 void uart_init(void); void uart_seng_ ...
- 51单片机串口通信发送以及接收代码详解2
#include <reg51.h> //实验现象:在电脑端没按下发送的时候,单片一直给电脑发送aaa字符串: //实验现象:在电脑端按下发送的时候,结束字符串aaa的发送代码,执行单片接 ...
- 基于51单片机的红外体温计的设计
硬件设计 本系统利用51单片机控制红外温度传感器进行温度的非接触式检测并显示,能够实现快速测量人体体温. 整体电路主要由51单片机最小系统,LCD1602液晶显示电路,蜂鸣器报警 ...
- 51单片机使用和配置HC-05蓝牙模块
需要的工具: usb转ttl模块*1 模块如下: 要想使用HC-05蓝牙模块进行单片机之间通讯或者单片机和蓝牙设备之间通讯,首先要配置好HC-05蓝牙模块的参数.设置好蓝牙的名称.密码.波特率等待. ...
- protues仿真51单片机教程
protues是一款常用的单片机仿真软件,在很多情况下,我们做一些简单的项目,手边没有单片机或者不想麻烦的情况下,可以借助protues来仿真测试程序,protues内集成了几款常用的51内核的单片机 ...
最新文章
- Pytorch: 命名实体识别: BertForTokenClassification/pytorch-crf
- BZOJ2091 [Poi2010]The Minima Game
- 数据仓库的架构与设计
- [转]ubuntu系统中遇到的一些问题及解决
- echarts鼠标事件以及自定义数据获取
- [one day one question] safari缓存太厉害
- python_day7 绑定方法与非绑定方法
- 千万并发连接下,如何保障网络性能
- 当ASP.NET Forms验证方式遭遇苹果IOS
- 30G 超大数据文件,如何用一周时间导入生产数据库?
- 根据标准word模板生成word文档类库(开源)
- 职场必备:公司高层职位的英文缩写
- 【javascript】 的严格模式 详解
- mysql数据表字段繁体转简体_【WORD】阿拉伯数字变大写数字、简繁体转换等实用小技巧...
- CI框架 where 跟 OR 怎么连用
- 太阳电池IV测试软件,太阳能电池IV测试系统
- 一日精通python编程_爱上Python:一日精通Python编程
- 基于伽马变换自适应修正的全景首尾融合算法
- HCNA基础篇问答式笔记整理
- MES与设备层的集成
热门文章
- 用计算机代码选址的优点,计算机机房选址原则
- vs2010单文档对话框窗口界面设置
- 学asp.net的自己学做网站的第一感受
- adb connect 远程adb连接手机无法连接,显示由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。(10060)windows调试Linux解决方式 ip连接方式
- 受限玻尔兹曼机和深度置信网络
- 华为HCIE证大数据证书社会认可度怎么样?
- Cisco 交换、路由和无线基础期末考试答案
- 西班牙语dele等级_2019年西班牙语dele考试各等级要求
- java 地址_java地址收藏(持续更新中...)
- qt designer 建qrc文件供Eric6使用步骤