请用stc15的pca捕获模式完成红外接收
时间: 2023-08-13 14:05:30 浏览: 96
STC15红外遥控接收_红外遥控_stc单片机红外线遥控器解码程序_
5星 · 资源好评率100%
好的,以下是一段STC15的PCA捕获模式完成红外接收的程序,可以实现对红外信号的接收和解码:
```c
#include <STC15F2K60S2.H>
#define IR_PIN P3_2
#define IR_CH 0
sbit IR_LED = P3^3;
unsigned int code remote[] = {0x20DF, 0x609F, 0x827D, 0xA05F, 0x48B7, 0xE01F, 0x10EF, 0x12ED};
unsigned int code buffer[50];
unsigned char pos = 0;
void InitPCA(void);
void InitIR(void);
void IR_ISR(void);
void main()
{
InitPCA();
InitIR();
while(1);
}
void InitPCA(void)
{
CCON |= 0x40; // 开启PCA时钟
CMOD = 0x00; // PCA时钟源为系统时钟
CL = 0x00; // 清零PCA计数器
CH = 0x00;
CCAP0L = 0xFF; // 设定捕获寄存器0的初始值为0xFF
CCAP0H = 0xFF;
CCAPM0 = 0x21; // 设定捕获模式,同时开启中断
IE |= 0x10; // 开启PCA中断
EA = 1; // 开启总中断
}
void InitIR(void)
{
IT0 = 1; // 设置外部中断0为下降沿触发
EX0 = 1; // 使能外部中断0
EA = 1; // 全局中断开关
}
void IR_ISR(void) interrupt 0
{
unsigned int time, high_time, low_time;
while(!IR_PIN); // 等待高电平结束
high_time = CCAP0H * 256 + CCAP0L; // 记录高电平时间
while(IR_PIN); // 等待低电平结束
low_time = CCAP0H * 256 + CCAP0L; // 记录低电平时间
time = high_time + low_time; // 计算总时间
if((time > 5000) && (time < 7000)) // 判断是否为起始码
{
pos = 0; // 重置缓冲区指针
}
else if((time > 2000) && (time < 3000)) // 判断是否为数据位
{
if(pos < 16) // 只有前16位是数据位
{
buffer[pos++] = high_time; // 记录高电平时间
buffer[pos++] = low_time; // 记录低电平时间
}
}
else if((time > 9000) && (time < 11000)) // 判断是否为结束码
{
if(pos == 16) // 如果接收到了16个数据位,则认为解码成功
{
unsigned char i;
for(i=0; i<8; i++)
{
if(buffer[2*i] > buffer[2*i+1]) // 判断高电平时间是否大于低电平时间
{
IR_LED = 1; // 高电平表示1,点亮LED
}
else
{
IR_LED = 0; // 低电平表示0,熄灭LED
}
if(buffer[2*i] < 1000) // 判断高电平时间是否小于1ms
{
// 如果高电平时间小于1ms,则表示此数据位为0,熄灭LED
IR_LED = 0;
}
if(buffer[2*i+1] < 1000) // 判断低电平时间是否小于1ms
{
// 如果低电平时间小于1ms,则表示解码出错,退出解码
return;
}
}
// 判断解码结果是否与预期一致
for(i=0; i<8; i++)
{
if(buffer[2*i] > buffer[2*i+1])
{
if((buffer[2*i] - buffer[2*i+1]) > 200) // 判断高电平时间是否大于500us
{
return;
}
}
else
{
if((buffer[2*i+1] - buffer[2*i]) > 200) // 判断低电平时间是否大于500us
{
return;
}
}
}
// 解码成功,执行相应的操作
// TODO: 在这里添加您的操作代码
}
}
}
void PCA_ISR(void) interrupt 7 using 1
{
CCAP0L = 0xFF; // 设定捕获寄存器0的初始值为0xFF
CCAP0H = 0xFF;
}
```
注意:上述程序仅供参考,具体情况需要根据实际需求进行调整。另外,由于红外信号的解码方式不同,您需要根据您所使用的红外解码模块的规格书进行调整。
阅读全文