mTouch 发表于 2012-11-17 12:26:04

C8051F340与PCA及红外解码与发射

本帖最后由 mTouch 于 2012-11-17 17:56 编辑

   有没有人写过采用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={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 43 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 43 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+irData==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;//接受来自 遥控器.....
        }
}

mTouch 发表于 2012-11-18 14:20:02

将端口设置修改如下
//红外捕捉,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
应该是多少呢?

页: [1]
查看完整版本: C8051F340与PCA及红外解码与发射