本帖最后由 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);
}
}
}
|