打印
[STC单片机]

关于PCA定时器扩展外部中断

[复制链接]
1038|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lfengyuwuzuy|  楼主 | 2017-4-19 15:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lfengyuwuzuy 于 2017-4-19 15:33 编辑

我用的单片机是STC15F2K60S2,我将3路PCA都用捕获功能-----扩展成外部中断功能,PCA0为上升沿中断,PCA1为上升沿中断,PCA2为下降沿中断,三路不同时中断,
我用这3个扩展外部中断来检测同一个脉冲信号,我的脉冲信号是30Hz的脉冲波。90个脉冲为一组,组与组之间有1s的间隔。不断地发送。我用PCA0做感应有脉冲到了,进入中断,后面用PCA1,PCA2每10个沿中断一次。每个中断中我用LED,LED1,LED2做指示灯。但是下载到单片机后,显示灯显示状态不对。请各位帮忙指导。我用的输入引脚:PCA0--P1.1.PCA1--P1.0。PCA2--P3.7
以下是程序:请各位指导。哪里有问题
#include"STC15F2K60S2.h"
#define uchar unsigned char
#define uint unsigned int
sbit  out=P0^3;
sbit  led=P0^4;
sbit  led1=P0^5;
sbit  led2=P0^6;
sbit  led3=P0^7;
uint  t=5;
uchar  num[10];
uint  a=0,b=0,c=0;
uint  bz=0;
uint  bzz=0;
void  T2_Init();
void  PCA_Init();
void  delay(uint);
//*************************延时1ms
void delay(uint x)
{
    uint i, j;
    for (i=0; i<x; i++)
    for (j=0; j<1200; j++);
}
void  T1_Init()
{
   TCON=0x00;
         TMOD=0x00;
         AUXR=0x40;
         TL1=0x80;
         TH1=0x44;
         TR1=0;
         ET1=1;
         EA=1;
}
void  PCA_Init()
{
   
        //P0M0=0x00;
        //P0M1=0x00;
        //P3M0=0x00;
        //P3M1=0x00;
        CCON=0x00;
        CMOD=0x08;
        CCAPM0=0x21;
        CCAPM1=0x20;
        CCAPM2=0x10;
        P_SW1=0x00;
        CL=0;
        CH=0;
        /*CCAP0L=0;
        CCAP0H=0;
        CCAP1L=0;
        CCAP1H=0;
        CCAP2L=0;
        CCAP2H=0;*/
        CR=1;
        EA=1;
}
void  PCA_IN()  interrupt 7
{
   
          if(CCF1)
                  {
          CCF1=0;
                                  led=0;
                                  delay(10);   //延时10ms
                                  CCAPM0=(CCAPM0 & 0xfe);
                                  CCAPM1=(CCAPM1 | 0x01);
                                  //led=1;
                                  CCAPM2|=0x01;
       }
                if(CCF1)
                 {
                            CCF1=0;
                            led1=0;
                            led=1;
                            CCAPM2&=0xfe;
                            delay(10);
                            //led2=1;
                                        b++;
                                        if(b==10)        //每个码中断10次
                                          {
               b=0;
                                                         num[8-a]=0;
                                                         TR1=1;
                                                         while(bz!=1);
                                                         //delay(200);
                                                         //led1=1;
                                                         bz=0;
                                                         bzz++;
                                                         a++;
                                                         CCAPM1|=0x01;
                                                         CCAPM2|=0x01;
            }
                                        if(a==9)      //一共9个码
                                          {
               a=0;
                                                         TR1=0;
                                                         CCAPM1&=0xfe;
                                                         CCAPM2&=0xfe;
             }
      }
                if(CCF2)
                        {                        
                                  CCF2=0;
                                  led2=0;
                                  led1=1;
                                  CCAPM1&=0xfe;
                                 // led1=1;        
                                        c++;
                                        if(c==10)     //每个码中断10次
                                          {
               c=0;
                                                         num[8-a]=1;
                                                         TR1=1;
                                                         while(bz!=1);
                                                         //delay(200);
                                                         //led2=1;
                                                         bz=0;
                                                         bzz++;
                                                         a++;
                                                         CCAPM1|=0x01;
                                                         CCAPM2|=0x01;
            }
          if(a==9)     //一共9个码
                                          {
               a=0;
                                                         TR1=0;
                                                         CCAPM1&=0xfe;
                                                         CCAPM2&=0xfe;
             }                                                
      }
}
//********************延时20ms
void  Time1_IN()  interrupt 3 using 1
{
   TF1=0;
         //TL1=0x80;
         //TH1=0x44;
         if((t--)==0)
                 {
                         t=5;
                         TR1=0;
                         led3=!led3;
                         bz=1;
                 }
}
void  main()
{
    int  i;
          led=1;
          led1=1;
          led2=1;
          led3=1;
          delay(20);
          T2_Init();
    PCA_Init();        
          while(1);
                 {
      if(bzz==9)
                                 {
            for(i=0;i<9;i++)
                                            {
                  out=num[8-i];
                                                                  led3=!led3;
                                                                  delay(40);
              }
                                                bzz=0;
                                                CCAPM0|=0x01;
                                          CCAPM1&=0xfe;
                                          CCAPM2&=0xfe;
         }
                                else
                                 {
            out=0;
                                          //delay(20);
         }                        
     }
}

相关帖子

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

本版积分规则

1

主题

1

帖子

0

粉丝