STC15W系列单片机比较器中断
时间:10-02
整理:3721RD
点击:
路过的大神,已经设置了标志位,为什么每一次进中断都会执行中断里边的while循环呢,求解
#include "config.h"
#include <intrins.h>
sbit charge=P3^3;
sbit stimulate=P3^0;
u8 x;
u8 count=0;
#define CMPEN 0x80 //CMPCR1.7:比较器模块使能位
#define CMPIF 0x40 //CMPCR1.6:比较器中断标志位
#define PIE 0x20 //CMPCR1.5:比较器上升沿中断使能位
#define NIE 0x10 //CMPCR1.4:比较器下降沿中断使能位
#define PIS 0x08 //CMPCR1.3:比较器正极选择位
#define NIS 0x04 //CMPCR1.2:比较器负极选择位
#define CMPOE 0x02 //CMPCR1.1:比较器结果输出控制位
#define CMPRES 0x01 //CMPCR1.0:比较器比较结果标志位
#define INVCMPO 0x80 //CMPCR2.7:比较结果反向输出控制位
#define DISFLT 0x40 //CMPCR2.6:比较器输出端0.1us滤波控制位
#define LCDTY 0x3F //CMPCR2.[5:0]:比较器输出的区抖时间控制
/*初始化IO口*/
void GPIO_config(void)
{
P5M1=0x30; //设置P55高阻态
P5M0=0x00;
P3M1=0x00; //设置P33推挽输出
P3M0=0x09; //设置P30推挽输出
}
.
.
.
.
/******************** 主函数 **************************/
void main(void)
{
GPIO_config();
CMPCR1=0xB0; //配置比较器控制寄存器
CMPCR2=0;
EA=1;
while(1)
{
stimulate=1;
Delay3ms();
stimulate=0;
Delay3ms();
}
}
/*比较器中断*/
void CMP_Isr() interrupt 21 using 1
{
u8 y=0;
count=count+1;
CMPCR1=0xBF; //清完成标志
while(count==2)
{
if(y<150)
{
for(x=0;x<200;x++)
{
charge=1;
Delay3ms();
charge=0;
Delay5ms();
}
if(x==200)
{
x=0;
}
y++;
}
if(y==150)
{count=0;}
}
}
#include "config.h"
#include <intrins.h>
sbit charge=P3^3;
sbit stimulate=P3^0;
u8 x;
u8 count=0;
#define CMPEN 0x80 //CMPCR1.7:比较器模块使能位
#define CMPIF 0x40 //CMPCR1.6:比较器中断标志位
#define PIE 0x20 //CMPCR1.5:比较器上升沿中断使能位
#define NIE 0x10 //CMPCR1.4:比较器下降沿中断使能位
#define PIS 0x08 //CMPCR1.3:比较器正极选择位
#define NIS 0x04 //CMPCR1.2:比较器负极选择位
#define CMPOE 0x02 //CMPCR1.1:比较器结果输出控制位
#define CMPRES 0x01 //CMPCR1.0:比较器比较结果标志位
#define INVCMPO 0x80 //CMPCR2.7:比较结果反向输出控制位
#define DISFLT 0x40 //CMPCR2.6:比较器输出端0.1us滤波控制位
#define LCDTY 0x3F //CMPCR2.[5:0]:比较器输出的区抖时间控制
/*初始化IO口*/
void GPIO_config(void)
{
P5M1=0x30; //设置P55高阻态
P5M0=0x00;
P3M1=0x00; //设置P33推挽输出
P3M0=0x09; //设置P30推挽输出
}
.
.
.
.
/******************** 主函数 **************************/
void main(void)
{
GPIO_config();
CMPCR1=0xB0; //配置比较器控制寄存器
CMPCR2=0;
EA=1;
while(1)
{
stimulate=1;
Delay3ms();
stimulate=0;
Delay3ms();
}
}
/*比较器中断*/
void CMP_Isr() interrupt 21 using 1
{
u8 y=0;
count=count+1;
CMPCR1=0xBF; //清完成标志
while(count==2)
{
if(y<150)
{
for(x=0;x<200;x++)
{
charge=1;
Delay3ms();
charge=0;
Delay5ms();
}
if(x==200)
{
x=0;
}
y++;
}
if(y==150)
{count=0;}
}
}
自己先占一楼啊。
只要count不为0,当然会进入while循环,改if(count==2)试试
顶一个~~~~~~~~~~~~~~~