标题: 第18章-单片机红外通信 [打印本页]
作者: wul 时间: 2016-3-28 23:22
标题: 第18章-单片机红外通信
51单片机轻松入门—基于STC15W4K系列(C语言版)
李友全 编著 详见:http://www.51hei.com/bbs/dpj-37954-1.html
第18章 红外通信
1 电路图
2 程序移植
红外遥控普遍运用在家用电器上,在工业控制中,对于存在高压、辐射、有毒
气体、粉尘等场合,可以使用红外遥控。
1电路图
1号单片机与红外接收头连接电路如图所示,红外接收头一般都可互换使用。
例18.4 红外接收数据,使用一个定时器模拟外中断方式,并通过串口发送接收到的用户码 与键码,R/C时钟:22.1184MHz,波特率9600, 要求串口助手按字符格式显示。 程序优点:通用性极强,可使用任意IO口接收红外数据,红外接收部分自适应R/C时钟频率
5~35M,模拟串口输出部分需要根据R/C时钟频率调整延时函数参数,此程序移植时只需更
改红外接收引脚定义与模拟串口发送引脚即可。
#include "STC15W4K.H"
#define MAIN_Fosc 22.1184 // 定义主时钟, 红外接收会自动适应5~36MHZ,
#define User_code 0xFD02 // 定义红外接收用户码 sbit Ir_Pin = P3^6; // 定义红外接收输入端口 sbit TXD1 = P3^1; // 定义模拟串口发送脚 void InitTimer0(void)
{
TMOD = 0x01; // 16位计数方式. TH0 = Timer0_Reload / 256;
TL0 = Timer0_Reload % 256; ET0 = 1;
TR0 = 1; EA = 1;
}
void main(void)
{
InitTimer0(); // 初始化Timer0
PrintString("定时器0初始化完毕\r\n"); // 上电后串口发送一条提示信息
while(1)
{
if(IR_OK) // 接收到一帧完整的红外数据
{
PrintString("红外键码: 0x"); // 提示红外键码 Tx1Send(HEX2ASCII(IR_code >> 4)); // 键码高半字节 Tx1Send(HEX2ASCII(IR_code)); // 键码低半字节 if(IrUserErr) // 用户码错误,则发送用户码
{
Tx1Send(' '); // 发空格 Tx1Send(' '); // 发空格 PrintString("用户码: 0x"); // 提示用户码 Tx1Send(HEX2ASCII(IR_UserH >> 4)); // 用户码高字节的高半字节 Tx1Send(HEX2ASCII(IR_UserH)); // 用户码高字节的低半字节 Tx1Send(HEX2ASCII(IR_UserL >> 4)); // 用户码低字节的高半字节 Tx1Send(HEX2ASCII(IR_UserL)); // 用户码低字节的低半字节
}
Tx1Send(0x0d); // 发回车 Tx1Send(0x0a); // 发回车
IR_OK = 0; // 清除IR键按下标志
}
}
}
程序运行结果如下图所示。
只要单片机能获取红外键码,单片机就可根据不同的键码执行不同的控制功能。
程序:
1.1—IR查询方式解码:
2.3—IR-中断方式(复杂的)
IR中断方式(简单版)的单片机红外解码程序:http://www.51hei.com/bbs/dpj-47283-1.html
只用一个单片机定时器的红外接收解码程序:http://www.51hei.com/bbs/dpj-47284-1.html
全部完整的4个源码请下载附件:
第18章 红外通信.rar
(84.33 KB, 下载次数: 169)
作者: lizhendong 时间: 2016-10-4 23:16
太好了,谢谢
作者: 国君 时间: 2018-7-10 15:25
路过学习学习。。。。。。。。。。
作者: xiexugang 时间: 2018-10-20 10:16
不错,很好的应用实例
作者: 北极泥 时间: 2018-11-1 09:13
很给力
作者: 水泊之星 时间: 2018-11-3 18:01
很实用,谢谢
作者: 无聊到处逛 时间: 2019-1-24 22:59
刚好,需要用到,谢谢了
作者: jpg阿福 时间: 2019-11-30 21:52
你好我是小白 请问一下:我用IR中断的形式写的串口显示按键码的程序 ,内容上面大致和您的大致相同,可是在按下同一个按键两次后就显示其他的数码(不是正常的00 ff 开头的数码) 我开始以为是程序的问题 但是第二次的显示还是正确的第三次错误,我就想不出来是什么原因了,您能指导指导吗? 必要的话可以叫我贴出程序出来 谢谢! 各位看到的朋友如果可以的话也请帮帮忙,。感谢。
作者: herui2128 时间: 2020-2-17 13:19
路过,学习大神的编程思路
作者: qiuabc1234 时间: 2020-4-24 15:06
jpg阿福 发表于 2019-11-30 21:52
你好我是小白 请问一下:我用IR中断的形式写的串口显示按键码的程序 ,内容上面大致和您的大致相同,可是在 ...
我比你白,是不是按键按下时连续发射信号?该搞个松开按键才发射的程序。或是你那个变量发射后没复位?发射完复位
作者: 君工创 时间: 2021-11-16 11:57
没看见连续键的解码部份。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |