打印

用STC单片机PCA做脉宽采集,为什么只能采集一路?

[复制链接]
3531|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ihafd|  楼主 | 2007-10-8 09:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用STC 的 12LE5404AD做脉宽采集1致2mS的脉宽.只能采集第一路(PCA0)第二路(PCA1)不会采集,没有产生CCF1的中断信号?是不是我的程序有什么问题?
麻烦帮忙看看,谢谢.
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
#include<STC12C5410AD.H>
#include<INTRINS.H>

typedef unsigned int uint;
typedef unsigned char uchar;

sbit led2 = P2^6;
sbit led1 = P2^7;
sbit Key1 = P2^2;
sbit Key2 = P2^3;
sbit PWM1 = P1^7;
sbit PWM2 = P1^5;

uint temp,Count1,PWM_compare1,PWM_compare2;
uchar PWM_out1,PWM_out2,CCAP2_time; 
uchar bdata SB;
sbit tp1 = SB^0;
sbit tp2 = SB^1;
sbit tp3 = SB^2;
sbit tp4 = SB^3;

void Delay(uchar i);
void Initiate();
void Key_scan();

// IAP read and write//
void IAP_enable();
void IAP_disable();
void Sector_erase(uint);
uchar Byte_read(uint adr);
void  Byte_write(uint adr,uchar or_data);


main()
{
Count1 = 0;
tp1 = 1;
tp3 = 1;
Initiate();
Delay(20);
  while(1)
  {
   Key_scan();
  }
}


void Key_scan()
{
if(Key2 == 0)
  {
    EA = 0;
    Delay(10); //防抖动.
    if(Key2 == 0)
     { Sector_erase(0x2800); Byte_write(0x2801,PWM_compare1); led2 = !led2;  while(Key2 == 0); }
      EA = 1; 
   } 
  if(tp2 == 1)
  { PWM_compare1 = Byte_read(0x2801); led2 = !led2;Count1 = 0;EA = 1;}  //如果1.3秒内收不到信号,输出保存的占空比.

  if(Count1 > 65500) //1.3秒.
   tp2 = 1;
   else
    tp2 = 0;

  if(PWM_compare1 > 50)     //防止读EEPROM错误.
   {
    if(PWM_compare1 < 130)
     PWM_out1 = PWM_compare1; 
   }

}

void Delay(uchar i)
{
  uchar k1;
  for(k1 = 0; k1 < 9; k1++)
    for(; i > 0; i--);
}

void Initiate()
{
  CMOD = 0x00;
  CCON = 0x00;
  CL = 0x00;
  CH = 0x00;
  CCAPM0 = 0x21;//上升沿触发.允许中断.
  CCAPM1 = 0x31; //上降上伸沿触发.                
  EPCA_LVD = 1;
  EA = 1;
  CR = 0;

  ET0 = 1;
  TMOD = 0x02;
  TL0 = 0xF6;   //20uS 定时器. CRYSTAL:6Mhz.
  TH0 = 0xF6;
  TR0 = 1;
  P1M0 = 0x00; //强上拉.
  P1M1 = 0x80;
  PWM_out1 = 0;
  PWM_out2 = 0;

}
// CPA 中断//////////////////////
void CUT() interrupt 6
{
if(CCF0 == 1)    //CAP0模块.
  {
   if(tp1 == 1)
   {
    CL = 0;
    CH = 0;
    CCF0 = 0;
    CR = 1;    //开始计数.
    tp1 = 0;
    Count1 = 0;
    CCAPM0 = 0x11;//下降沿触发.允许中断.
    led1 = !led1;
   }
   if(CCF0 == 1 & tp1 == 0)
    {
     temp = CH;
     temp = (temp << 8) | CL;
     PWM_compare1  = temp /10;
     CR = 0;
     CL = 0;
     CH = 0;
     CCF0 = 0;
     tp1 = 1;
     CCAPM0 = 0x21;//上升沿触发.允许中断.

    }  
if(CCF1 == 1) //CAP1模块.不会运行到这里,没有CCF1 = 1的中断信号,.不能采集这里的信号??????????
  {
   led1 = !led1;
   if(tp3 == 1)
   {
       CCF1 = 0;
    CCAP2_time = 0;
    tp3 = 0;
    CCAPM1 = 0x11;//下降沿触发.允许中断.
    led1 = !led1;
   }
   if(CCF1 == 1 & tp3 == 0)
   {
    CCF1 = 0;
    PWM_compare2 = CCAP2_time;
    tp3 = 1;
    CCAPM1 = 0x21; //上升沿触发.允许中断.
   }
  }

}
   
}
//////定时器O,用于输出PWM脉冲.//////////
void Time0() interrupt 1
{
static uint tt;
tt++;
if(tt == 920) //   频率控制  920 * 20uS = 18.4mS.
   tt = 0;
if(PWM_out1 > 50)   //防止干扰.
  {
  if(PWM_out1 < 130)
   if(tt < PWM_out1)    //占空比控制.
    PWM1 = 1;
     else
     PWM1 = 0;
   }
   else
    PWM1 = 0;

  if(tt < PWM_compare2)
    PWM2 = 1;
     else
     PWM2 = 0;
   Count1++;
  CCAP2_time++; 

}







相关帖子

沙发
yangyxun| | 2007-10-8 14:41 | 只看该作者

为什么不用C8051单片机呢,这个可以配置多路PCA

0755-25155089
杨先生
tyler_yang@secomtel.com

使用特权

评论回复
板凳
ayb_ice| | 2007-10-8 15:21 | 只看该作者

应该是程序的问题

使用特权

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

本版积分规则

290

主题

844

帖子

3

粉丝