1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 单片机:红外遥控实验(内含红外遥控介绍+硬件原理+软件编程+配置环境)

单片机:红外遥控实验(内含红外遥控介绍+硬件原理+软件编程+配置环境)

时间:2018-09-28 10:33:57

相关推荐

单片机:红外遥控实验(内含红外遥控介绍+硬件原理+软件编程+配置环境)

注:红光波长0.62~0.76um 紫光0.38~0.46um

注:红外遥控器顶端有一个红外发光二极管

红外发送的频率是38KHZ(外部晶振455/12)

右下角为红外发光二极管发送信号,另一个接收端接收信号。。。。发送端高电平,经过二极管,取反,接收端变为低电平

如果要开发红外接收设备,必须知道红外遥控器的编码方式和载波频率

左下角为逻辑0,右下角为逻辑1

高电平+下降沿+9ms+上升沿+4.5ms+....

注:只显示控制码即可

地址码,地址反码,控制码,控制反码都是8位,从低位到高位。

地址反码是增加传输的可靠性,可用于检验传输数据是否准确

同一个遥控器,地址码,地址反码相同,不同按键的控制码不同,引导码只是判断是否运行

当我们对遥控器进行连续操作时,使用连发码。

一帧=地址码+地址反码+控制码+控制反码。

如果一帧结束后,红外遥控器还处于按下,则使用连发码

左图为塑料封装的红外接收头,右图为铁皮封装

左图,凸起部分,由左向右依次为1.2.3脚, 1脚为Vout,接收信号

2脚为GND 3脚为Vcc

接受下降沿时,计算下降沿时间,560us为逻辑0,1680us为逻辑1

上图为PZ产品A2-4 下图为A5-A7

上图绑定,即板载资源和IO口绑定,无法更改。P3^2端口自带上拉电阻

下图out连接J,可灵活接,J11等无上拉电阻

q:1483078351 v:15136037805, git为@qq1483078351a 已开源,里面有课件和代码。有问题欢迎询问,共同进步.

原始代码如下:

ired.h文件:

#ifnded _ired_H

#define _ired_H

#include"public.h"

sbit IRED=P3^2;//定义管脚

//声明变量

extern u8 gired_data[4];

//函数声明

void ired_init(void);

#endif

ired.c文件:

#include"ired.h"

u8 gired_data[4];//存储4个字节接收码(地址码+地址反码+控制码+控制反码)

//红外端口初始化函数,外部中断0配置

void ired_init(void)

{

IT0=1; //下降沿触发

EX0=1; //打开中断0允许

EA=1; //打开总中断

IRED=1; //初始化端口

}

//外部中断0服务函数

void ired() interrupt 0

{

u8 ired_high_time=0;

u16 time_cnt=0;

u8 i=0,j=0;

if(IRED==0)

{

time_cnt=1000;

while((!IRED)&&(time_cnt))//等待引导信号9ms低电平结束,若超过10ms强制退出

{

delay_10us(1);//延时约10us

time_cnt--;

if(time_cnt==0)return;

}

if(IRED)//引导信号9ms低电平已过,进入4.5ms高电平

{

time_cnt=500;

while(IRED&&time_cnt)//等待引导信号4.5ms高电平结束,若超过5ms强制退出

{

delay_10us(1);

time_cnt--;

if(time_cnt==0)return;

}

for(i=0;i<4;i++)//循环4次,读取4个字节数据

{

for(j=0;j<8;j++)//循环8次读取每位数据即一个字节

{

time_cnt=600;

while((IRED==0)&&time_cnt)//等待数据1或0前面的0.56ms结束,若超过6ms强制退出

{

delay_10us(1);

time_cnt--;

if(time_cnt==0)return;

}

time_cnt=20;

while(IRED)//等待数据1或0后面的高电平结束,若超过2ms强制退出

{

delay_10us(10);//约0.1ms

ired_high_time++;

if(ired_high_time>20)return;

}

gired_data[i]>>=1;//先读取的为低位,然后是高位

if(ired_high_time>=8)//如果高电平时间大于0.8ms,数据则为1,否则为0

gired_data[i]|=0x80;

ired_high_time=0;//重新清零,等待下一次计算时间

}

}

}

if(gired_data[2]!=~gired_data[3])//校验控制码与反码,错误则返回

{

for(i=0;i<4;i++)

gired_data[i]=0;

return;

}

}

}

main.c文件:

#include "public.h"

#include "smg.h"

#include "ired.h"

void main()

{

u8 ired_buf[3];

ired_init();//红外初始化

while(1)

{

ired_buf[0]=gsmg_code[gired_data[2]/16];//将控制码高4位转换为数码管段码

ired_buf[1]=gsmg_code[gired_data[2]%16];//将控制码低4位转换为数码管段码

ired_buf[2]=0X76;//显示H的段码

smg_display(ired_buf,6);

}

}

public.c文件:

#include "public.h"

void delay_10us(u16 ten_us)

{

while(ten_us--);

}

void delay_ms(u16 ms)

{

u16 i,j;

for(i=ms;i>0;i--)

for(j=110;j>0;j--);

}

public.h文件:

#ifndef _public_H

#define _public_H

#include "reg52.h"

typedef unsigned int u16; //对系统默认数据类型进行重定义

typedef unsigned char u8;

void delay_10us(u16 ten_us);

void delay_ms(u16 ms);

#endif

配置环境如下:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。