红外通信技术在现代电子设备中广泛应用,特别是在遥控器控制系统中。九齐单片机(如NQ系列)因其高性价比和易用性,成为实现红外接收功能的理想选择。本文将详细介绍如何使用九齐单片机编写红外接收程序。
一、红外接收原理
通用红外遥控系统主要由发射和接收两大部分组成。红外接收部分包括光、电转换放大器、解调、解码电路。红外接收头接收到红外信号后,通过滤波、放大和解调处理,将信号转化为单片机可以处理的电信号。
红外信号的编码方式多种多样,常见的有曼彻斯特编码和脉冲宽度编码。在XS-091等遥控板中,常采用PWM(脉冲宽度调制)编码,即以不同宽度的脉冲表示二进制的“0”和“1”。例如,“0”由0.565ms低电平和0.56ms高电平组成,周期为1.125ms;“1”由0.565ms低电平和1.685ms高电平组成,周期为2.25ms。
二、硬件连接
在九齐单片机上实现红外接收功能,首先需要将红外接收头的DATA脚连接到单片机的外部中断引脚(如INT0)。通常,九齐单片机的INT0引脚与P3.2相连。此外,为了调试和显示结果,可以连接LED灯到单片机的某个IO口。
三、程序设计
1. 初始化
在程序开始时,需要对单片机进行初始化,包括设置外部中断、定时器,以及IO口等。
c复制代码
#include // 包含九齐单片机寄存器定义的头文件
sbit IR_IN = P3^2; // 定义红外接收引脚
sbit LED = P1^0; // 定义LED引脚
void Timer0_Init() {
TMOD = 0x01; // 设置定时器0为模式1
TH0 = 0xFC; // 初始化定时器初值
TL0 = 0x66;
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启全局中断
TR0 = 1; // 启动定时器0
}
void EX0_Init() {
IT0 = 1; // 设置外部中断0为下降沿触发
EX0 = 1; // 开启外部中断0
}
void System_Init() {
Timer0_Init();
EX0_Init();
LED = 0;
}
2. 外部中断处理
在外部中断服务函数中,处理红外信号的接收。通过定时器计时,判断接收到的脉冲宽度,从而识别出“0”和“1”。
c复制代码
unsigned char irtime = 0;
bit startflag = 0;
unsigned char irdata[33]; // 存储接收到的红外数据
void EX0_ISR(void) interrupt 0 {
if (startflag) {
if (irtime >= 33 && irtime <= 63) { // 判断是否为起始码
// 开始存储数据
irdata[0] = irtime;
irtime = 0;
startflag = 0;
}
} else {
irtime = 0; // 重置时间计数器
startflag = 1; // 标记开始接收数据
}
}
void Timer0_ISR(void) interrupt 1 {
irtime++; // 定时器中断,用于计数脉冲宽度
if (irtime >= 255) irtime = 0; // 防止溢出
}
3. 数据解码
解码函数根据存储的红外数据,解析出按键的控制码。
c复制代码
void Ir_Decode() {
unsigned char i, j, temp;
for (i = 1; i < 33; i++) { // 跳过起始码
temp = 0;
for (j = 0; j < 8; j++) { // 一个字节8位
if (irdata[i] >= 8 && irdata[i] < 15) {
temp >>= 1;
} else if (irdata[i] >= 18 && irdata[i] < 25) {
temp |= 0x80;
temp >>= 1;
}
i++; // 移到下一位数据
}
// 存储解码后的数据(此处仅为示例,实际可能需要根据具体