请教pic12f629电压比较器的用法

2020-02-09 11:39发布

在用pic12f629做一个超声波测距的东西

  用GP5延时产生47.6KHz的方波给超声波探头起振,并延时一段时间避开余振之后,开启电压比较器,比较电压用单片机内部设计。并用GP0口接受超声波的回波,当回波信号高过设定的电压后,判别此信号为回波信号并由GP2产生一个脉冲信号表明已经接受到回波。

   现在问题是我开启了GP5的起振信号后,探头已经起振。在示波器中也可以看到回波信号进入电压比较器GP0口,但GP2并没有产生脉冲信号。

  同样的程序用protues仿真时,在某个时间加入一个脉冲模仿回波信号,GP2同样没有产生脉冲,如果把GP0的发波信号去掉的话,GP2就会有反应。

  很苦恼,希望各位老师能帮个忙。

  

#include <pic.h>
//__CONFIG ( INTIO & PWRTEN & BOREN & MCLRDIS & UNPROTECT);//没有INTIO就会用不了4,5口,没有MCLRDIS所有口都用不了
__CONFIG ( INTIO & PWRTEN & BOREN & MCLRDIS & WDTDIS);
/*端口控制*/
#define GPIO0_0 GPIO&=~0X01
#define GPIO1_0 GPIO&=~0X02
#define GPIO2_0 GPIO&=~0X04
#define GPIO3_0 GPIO&=~0X08
#define GPIO4_0 GPIO&=~0X10
#define GPIO5_0 GPIO&=~0X20

#define GPIO0_1 GPIO|=0X01
#define GPIO1_1 GPIO|=0X02
#define GPIO2_1 GPIO|=0X04
#define GPIO3_1 GPIO|=0X08
#define GPIO4_1 GPIO|=0X10
#define GPIO5_1 GPIO|=0X20

/***************************************************
GP0电压比较输入
GP1
GP2输出数据给上位机
GP3复位
GP4外部驱动
GP5输出40KHz方波
*****************************************************/
void PORTINT( )
{
TRISIO=0X1B;          //0001 1011
GPIO=0X00;           /*先送低电平*/
}
void delay4us()
{
asm("nop");
}

/*delayxus(char x)函数,当X=1时延时30US,每增加1加10US*/
void delayxus(char x)  
{
char i;
for(i=x;i>1;i--);
}


void delay100us()
{
char i;
for(i=140;i>1;i--);
}

void delay500us()
{
char h;
for(h=70;h>1;h--);
}

void delay100ms()
{
int i;
for(i=3000;i>1;i--);
}
/************************************
发波程序,47.6KHz,20个脉冲
每次140ms发一次波
*************************************/
void fabo()
{
  char i;
  for(i=20;i>0;i--)
  {
   GPIO5_1;
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   GPIO5_0;
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   }

void EnableCompare()  
{
  
   INTCON=0X00;
   // VRCON=0B10001111;      //3.55为低   3.6为高
   //VRCON=0B10001101;      //3.25为低   3.3为高
   //VRCON=0B10001011;      //2.95为低   3.0为高
   VRCON=0B10101101;      //2.7为低    2.75为高
   //VRCON=0B10101011;      //2.25       2.3
   //VRCON=0B10100111;        //1.45       1.5
   //VRCON=0B10100100;      //0.8        0.84
   //VRCON=0B10100001;      //0.2        0.25
   CINV = 1;   //为0输出不反向
   CM2 = 1;
   CM1 = 1;
   CM0 = 0;   
   CIS = 1;    //比较器接在GP0口
//CMCON=0X1E;
   delayxus(100);
}  


void main()
{  
PORTINT();
while (1)
{
  fabo();
  delay100ms();
  delay500us();
  delay500us();
  delay500us();
  EnableCompare();
  if(COUT)
  {
    COUT=0;
    GPIO2_1;
    delay100us();
    GPIO2_0;
    delay100us();
   }
  }
}
0条回答

一周热门 更多>