单片机上的红外接收有什么功能
时间: 2024-04-23 14:23:15 浏览: 20
单片机上的红外接收可以用于接收红外信号,通过解码得到发送器发送的数据,常用于红外遥控器、红外通信等应用。具体的功能包括:
1. 红外遥控:通过红外接收器接收到遥控器发送的信号,解码后实现对电器的控制,如电视、空调等。
2. 红外通信:通过红外接收器和红外发射器实现设备之间的无线通信,如红外遥控小车、红外测距等。
3. 红外数据传输:通过红外接收器和红外发射器实现数据传输,如红外打印、红外传输文件等。
总之,单片机上的红外接收功能十分广泛,可以用于很多应用场景。
相关问题
51单片机的红外接收解码
51单片机的红外接收解码可以通过外部中断和定时器来实现。具体步骤如下:
1. 配置外部中断,使其在红外接收到信号时触发中断。
2. 在中断服务函数中,通过定时器来计算红外信号的高低电平时间,从而解码出红外信号的数据。
3. 对解码出的数据进行处理,比如判断是否为正确的红外遥控器编码,以及执行相应的操作。
51单片机」红外接收、发射模块代码
红外接收模块代码:
```c
#include <REG51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code IR_CODE[4] = {0x00, 0x00, 0x00, 0x00}; // 定义红外遥控码
sbit IR_IN = P3^2; // 红外接收器模块信号输入
sbit IR_OUT = P3^3; // 红外发射器模块信号输出
// 红外接收函数
void IR_Receive()
{
uchar i, j, k;
uchar m1, m2, m3, m4, n1, n2, n3, n4, temp;
IR_IN = 1; // 初始化为高电平
while(IR_IN); // 等待低电平出现
TR0 = 1; // 开始计时
while(!IR_IN); // 等待高电平出现
TR0 = 0; // 结束计时
if (TH0 > 30) return; // 判断是否为干扰信号
TH0 = TL0 = 0; // 计数器清零
for (i = 0; i < 4; i++) // 循环接收4个字节
{
for (j = 0; j < 8; j++) // 循环接收1个字节的8位
{
while(!IR_IN); // 等待高电平出现
TR0 = 1; // 开始计时
while(IR_IN); // 等待低电平出现
TR0 = 0; // 结束计时
if (TH0 > 15) // 判断是否为1
{
if (j < 2) // 判断是否为起始位
{
return;
}
IR_CODE[i] |= (0x80 >> j); // 组合接收到的字节
}
TH0 = TL0 = 0; // 计数器清零
}
}
// 判断接收到的红外遥控码是否正确
m1 = IR_CODE[0] & 0x0f; // 取出接收到的红外遥控码的低4位
m2 = (IR_CODE[0] >> 4) & 0x0f; // 取出接收到的红外遥控码的高4位
m3 = IR_CODE[1] & 0x0f;
m4 = (IR_CODE[1] >> 4) & 0x0f;
n1 = IR_CODE[2] & 0x0f;
n2 = (IR_CODE[2] >> 4) & 0x0f;
n3 = IR_CODE[3] & 0x0f;
n4 = (IR_CODE[3] >> 4) & 0x0f;
temp = m1 + m2 + m3 + m4 + n1 + n2 + n3 + n4;
if (temp != 0xff) // 校验和错误,表示接收到的红外遥控码有误
{
return;
}
// 根据接收到的红外遥控码执行相应操作
switch(m4)
{
case 0x01: // 按钮1
break;
case 0x02: // 按钮2
break;
case 0x03: // 按钮3
break;
case 0x04: // 按钮4
break;
default:
break;
}
}
// 定时器0中断函数
void Timer0_ISR() interrupt 1
{
TH0 = 0xff; // 重新装载初始值
TL0 = 0xff;
}
// 主函数
void main()
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = TL0 = 0xff; // 初始值设为0xff
TR0 = 0; // 定时器0停止计数
ET0 = 1; // 允许定时器0中断
EA = 1; // 开启总中断
while(1)
{
IR_Receive(); // 接收红外遥控码
}
}
```
红外发射模块代码:
```c
#include <REG51.h>
#define uchar unsigned char
#define uint unsigned int
uchar IR_CODE[4] = {0x00, 0x00, 0x00, 0x00}; // 定义红外遥控码
sbit IR_OUT = P3^3; // 红外发射器模块信号输出
// 红外发射函数
void IR_Send()
{
uchar i, j, k;
IR_OUT = 0; // 先拉低红外发射器模块的信号输出
for (i = 0; i < 4; i++) // 循环发送4个字节
{
for (j = 0; j < 8; j++) // 循环发送1个字节的8位
{
if ((IR_CODE[i] << j) & 0x80) // 判断发送的位为1还是0
{
IR_OUT = 1; // 发送高电平信号
for (k = 0; k < 20; k++); // 延时约10us
IR_OUT = 0; // 发送低电平信号
for (k = 0; k < 20; k++); // 延时约10us
}
else
{
IR_OUT = 1; // 发送高电平信号
for (k = 0; k < 10; k++); // 延时约5us
IR_OUT = 0; // 发送低电平信号
for (k = 0; k < 20; k++); // 延时约10us
}
}
}
}
// 主函数
void main()
{
IR_SEND(); // 发送红外遥控码
while(1);
}
```
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)