有没有人写过采用C8051F340的PCA功能实现红外解码与发射的程序?
试着写了下面的代码:
目前发现的问题是, 红外遥控器没有发码,也会引起CCF0中断发生,不知道问题所在!
希望知道帮助修改一下代码,谢谢!
#include "C8051F340.h"
#include <stdio.h>
unsigned int nCapValue; //存储捕获的值
bit irStart = 0; //解码开始标志位
bit irFinish = 0; //解码完成标志位
unsigned char irCount=0; //记录解码过程中的每一个bit,总共32bit
unsigned char irData[4]={0}; //存储红外解码的4个字节
sbit IrInput = P3^0; //红外线接收头输出端口
sbit IrOutput = P3^1; //控制红外发射管
sbit LED1=P2^2;
sbit LED2=P2^3;
void SysClkInit(void)//配置系统时钟
{
int n = 0;
OSCICN |= 0x03; // Configure internal oscillator for
// its maximum frequency 内部12M晶振
// OSCICN = 0x83; // Set internal oscillator to run
// at its maximum frequency
CLKSEL = 0x00; // Select the internal osc. as
}
void PortInit(void)//端口配置
{
// 交叉开关配置
// 7 6 5 4 3 2 1 0
// 0 0 0 0 0 1 0 0
P0SKIP = 0xFF; //跳过前面I/O端口
P1SKIP = 0xFF; //跳过前面I/O端口
P2SKIP = 0xFF; //跳过前面I/O端口
// 7 6 5 4 3 2 1 0
// 0 1 0 1 0 0 0 0
// P2MDOUT |= 0x50; // 使能P2.6,P2.4为推挽输出
// 1 1 1 1 1 1 0 0
P2MDOUT |= 0xfc;
P3MDIN = 0xFF;
P3MDOUT = 0xff; // P3.0 - CEX0 (PCA), Push-Pull, Digital
XBR1 = 0x41; //将PCA输出配置到P3.0脚(CEX0)
}
void main(void)
{
SysClkInit(); //配置系统时钟,使用外部晶振,系统上电默认使用内部2M时钟
PortInit(); //I/O端口配置
EIE1 = 0x10; //允许PCA0中断
PCA0L = 0;
PCA0H = 0;
PCA0MD = 0X01; //选择计数器时钟为系统时钟12分频,允许计数器溢出中断
PCA0CPM0 = 0x11;//负沿捕获使能,允许捕捉比较中断
LED1 = 0;
LED2 = 1;
IrInput = 1;
EA = 1; //允许总中断
CR = 1; //启动PCA0计数器工作
while(1)
{
if((irFinish==1)&&(irData[2]+irData[3]==255)) //解码完成,并且接收数据正确可以读取接收的数据
{
irFinish = 0;
LED1 = 0;
}
}
}
void PCA0_ISR(void) interrupt 11 //PCA0中断服务函数
{
if(CF == 1) //计数器溢出中断
{
CF = 0; //计数器溢出标志清零,必须用软件清零,硬件不能自动清零
}
if(CCF0 == 1) //捕获中断处理
{
CCF0 = 0;
nCapValue = PCA0CPH0*256 + PCA0CPL0;//读取捕获值
PCA0L = 0; //每次捕获以后,需要将计数器清零,以备下一次数据捕获
PCA0H = 0;
LED1= 1; //接受来自 遥控器.....
}
}
将端口设置修改如下
//红外捕捉,P3.0红外输入,串口输出
P0SKIP = 0xCF; //跳过前面I/O端口
P1SKIP = 0xFF; //跳过前面I/O端口
P2SKIP = 0xFF; //跳过前面I/O端口
P3SKIP = 0xFE;
XBR0 = 0x01; // Enable UART on P0.4(TX) and P0.5(RX)
XBR1 = 0x41; //交叉开关打开,将PCA输出配置到P3.0脚(CEX0)
P0MDOUT |= 0x10; // Enable UTX as push-pull output
//1 1 1 1 1 1 0 0
P2MDOUT = 0xfc;
P3MDOUT = 0x03; // 使能P3.0为推挽输出
PCA0CN = 0x00; // Stop counter; clear all flags
PCA0L = 0; // PCA0 Counter
PCA0H = 0;
PCA0CPH0 = 0x00; //PCA0 Capture 0
PCA0CPL0 = 0x00;
PCA0MD = 0x00; //PCA0采用系统时钟12分频,禁止PCA0溢出中断
EIE1 |= 0x10; //EPCA0 = 1,允许PCA0中断 C8051F340
PCA0CPM0 = 0x11; //模块0下降沿中断允许, 模块0负沿捕捉使能与配匹使能
后, 当遥控器 发射红外码时,产生了中断CCF0,能进入void PCA_ISR (void) interrupt 11了!
如上设置时, nCapValue = PCA0CPH0*256 + PCA0CPL0;//读取捕获值
的值,对应门限为13ms---13.8ms,门限为0.8ms---1.4ms,门限为1.8ms---2.4ms
应该是多少呢?
|