有没有人写过采用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 
应该是多少呢? 
 |