编写红外遥控的Keil程序需要考虑硬件和软件的配置,以及红外信号的解码和处理。以下是一个基于Keil C51的示例程序,适用于uPC1621/uPC1622及兼容的红外遥控器芯片,该程序使用外部中断0和定时器1来解码红外信号。
```c
include
define uchar unsigned char
define uint unsigned int
// 定义红外接收引脚
define IR_PIN P3^2
// 定义定时器1的初始值
define T1_init 0x0000
define T1_reload 0xFFFF
// 定义红外状态枚举
typedef enum {
IR_idle,
IR_waitstart,
IR_getaddr,
IR_getaddrinv,
IR_getdata,
IR_getdatainv
} IR_state;
// 定义红外数据变量
uchar IRdata;
IR_state IRstate = IR_idle;
// 初始化函数
void init(void) {
// 初始化P1端口
P1 = 0xFF;
// 初始化定时器1
TMOD = 0x01;
TH1 = T1_reload;
TL1 = T1_init;
ET1 = 1;
// 设置外部中断0为下降沿触发
EX0 = 1;
EA = 1;
}
// 定时器1中断服务函数
void timer1_ISR(void) interrupt 1 {
static uchar count = 0;
static uchar IRcode;
static uchar IRindex = 0;
// 读取定时器1的值
count++;
if (count >= 5000) { // 5ms定时
count = 0;
// 读取红外接收引脚的状态
if (IR_PIN == 0) {
IRstate = IR_waitstart;
IRtimer = 26;
} else {
IRstate = IR_idle;
}
}
}
// 外部中断0中断服务函数
void int0_ISR(void) interrupt 0 {
if (IRstate == IR_waitstart) {
// 读取红外接收引脚的状态
if (IR_PIN == 0) {
IRstate = IR_getdata;
IRtimer = 26;
}
} else if (IRstate == IR_getdata) {
// 读取红外接收引脚的状态
IRdata = P1;
IRindex++;
if (IRindex == 16) {
IRindex = 0;
// 解码红外数据
// 这里需要根据具体的红外编码格式进行解码
// 例如,如果使用的是NEC编码,可以在这里添加解码逻辑
}
}
}
// 主函数
void main(void) {
uchar i;
init();
while (1) {
// 主循环可以在这里添加其他任务
}
}
```
代码说明:
初始化函数 `init()`:
初始化P1端口,设置定时器1的初始值和重载值,启用定时器1的中断,并设置外部中断0为下降沿触发。
定时器1中断服务函数 `timer1_ISR()`:
每5ms产生一次中断,用于计时。
如果红外接收引脚为低电平,则进入等待启动状态,并设置定时器1开始计时。
外部中断0中断服务函数 `int0_ISR()`:
当红外接收引脚为低电平时,进入获取数据状态,并开始计时。
读取红外接收引脚的状态,并根据需要解码红外数据。
主函数 `main()`:
调用初始化函数,进入主循环。
注意事项:
该示例程序假设使用的是NEC编码格式,具体解码逻辑需要根据实际使用的编码格式进行调整。
需要根据实际硬件平台调整引脚定义和定时器配置。
可以在主循环中添加其他任务,例如红外信号的发送和接收。
希望这个示例程序能帮助你开始编写红外遥控的Keil程序。