打印
[STC单片机]

PCA捕捉模式下 数据不对

[复制链接]
1371|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
583037637|  楼主 | 2014-6-19 13:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是用的12c56系列单片机  但是捕捉的数据不对

#include "STC12C56.H"
#include <intrins.h>
#include "delay.h"
#include "BIAOGE.h"
sbit EPCAI      =   IE^6;
bit ci1;

uchar cnt,cnt1;                           //存储PCA计时溢出次数
                     //记录上一次的捕获值
                      //记录本次的捕获值

                     //存储信号的时间长度(count1 - count0)  
unsigned  int count0,count11,count12,length,a,b,count1,count21,count22;            
void lcd_chushihua()
{
SendChars(ws,9); //握手
SendChars(bfk,9);        //不反馈
delay_100(250);
SendChars(bl,9);                   // 变亮
SendChars(bd,9);                  // busy低
delay_100(250);
SendChars(sc,9);         //         65536
SendChars(s1x1,9);       
SendChars(tabhs,9);         //          上1下1
SendChars(tab14,9);         //           图片14
delay_10000(144);
SendChars(tabhs,9);   
SendChars(tabsj1,12);
SendChar(0xFF);
}
void xianshi()
{         
        count0= count11*256+count12;  //保存本次的捕获值      
    count1= count21*256+count22;
        length = count1 - count0;   //计算两次捕获的差值,即得到时间长度
    a=length/256;
        b=length%256;
    SendChars(tabsj2,11);
    SendChar(a);
        SendChar(b);
        //count0 = count1;
  }
void PCA_isr() interrupt 6
{
   EA=0;
// if (CF)
   // {
   //     CF = 0;
   //     cnt1++;                      //PCA计时溢出次数+1
    //}
    if(ci1==0)
        {
         if (CCF2)
     {      
                 CCAP2H=0;
                 CCAP2L=0;
                 CCF2 = 0;
                 count11 = CCAP2H;
                 count12 = CCAP2L;
                 ci1=1;                 
     }
         else{}
        }
        else
        {
         if (CCF2)
     {      
                 CCF2 = 0;
                 count21 = CCAP2H;
                 count22 = CCAP2L;
                 ci1=0;
                 xianshi();
                 delay_10000(144);
                 //EPCAI=0;
                 CL=0;
                 CH=0;                 
                 //CCAP2H=0;
                // CCAP2L=0;
                 CR=1;                 
     }
         else{}       
        }
        EA=1;

}

void main()
{
AUXR = 0xf8;  //t0 t1 速度设置
TMOD = 0x22;        // to t1 8位自动重装
SCON = 0X50;        //串口设置
TH1 = TL1 = 0XFD;//波特率设置                          
TH0 = TL0 = 0XFE;//t0溢出设置
TR1=1;
TR0=1;
lcd_chushihua();
delay_100(250);
CCON=0;   //清0
CL=0;
CH=0;
CMOD = 0x04;
CCAPM2 = 0x31;
ci1=0;
CCAP2L = 0;
CCAP2H = 0;                       //PCA定时器开始工作
cnt = 0;
a=b=1;
count0 = 0;
count1=0;
count11 = count12 =count21=count22= 0;
length=0;
delay_10000(144);
SendChars(s1x1,9);
SendChars(tabhs,9);   
SendChars(tabsj1,12);
SendChar(28);
delay_10000(144);
CR=1;  
EPCAI=1;
EA = 1;
while (1);

}

相关帖子

沙发
coody| | 2014-6-19 15:04 | 只看该作者
如果时间长于计数器溢出周期,则要处理好。
如果在计数器周期内,则会非常准确,毕竟是硬件捕捉的。

使用特权

评论回复
板凳
583037637|  楼主 | 2014-6-19 15:43 | 只看该作者
我想测50k左右的高脉冲宽度 ,但是实际值是13,而且换到10k是86.5  基本都相差50%,能帮我瞅下程序那不合理吗

使用特权

评论回复
地板
583037637|  楼主 | 2014-6-19 15:43 | 只看该作者
我想测50k左右的高脉冲宽度 ,但是实际值是13,而且换到10k是86.5  基本都相差50%,能帮我瞅下程序那不合理吗

使用特权

评论回复
5
583037637|  楼主 | 2014-6-19 16:23 | 只看该作者
coody 发表于 2014-6-19 15:04
如果时间长于计数器溢出周期,则要处理好。
如果在计数器周期内,则会非常准确,毕竟是硬件捕捉的。 ...

我想测50k左右的高脉冲宽度 ,但是实际值是13,而且换到10k是86.5  基本都相差50%,能帮我瞅下程序那不合理吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝