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)
|