查看: 1921|回复: 0
打印 上一主题 下一主题

C8051F340与PCA及红外解码与发射

[复制链接]
跳转到指定楼层
沙发
发表于 2016-5-28 21:57:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有没有人写过采用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
应该是多少呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表