搜索
bottom↓
回复: 1

C8051F340与PCA及红外解码与发射

[复制链接]

出0入0汤圆

发表于 2012-11-17 12:26:04 | 显示全部楼层 |阅读模式
本帖最后由 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[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;  //接受来自 遥控器.....
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 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
应该是多少呢?

  
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 20:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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