在用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();
}
}
}
一周热门 更多>