#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
sbit LED=P1^2;//模拟蜂鸣器
sbit ECHO=P1^0;//超声波回响引脚
sbit TRIG=P1^3;//超声波触发引脚
uint flag=0;
uint time;
long S;
void delay(uint z) //声音延时子函数
{
int x;
for(;z>0;z--)
for(x=110;x>0;x--);
}
void zd1() interrupt 1
{
TR0=0;
flag=1;
TH0=0;
TL0=0;
}
void count()
{
time=TH0*256+TL0;
S=time*0.00017; //算出来是M 12M晶振
}
/*----------声音部分--------*/
void mansu()
{
LED=1;
delay(600);
LED=0;
delay(600);
}
void zhongsu()
{
LED=1;
delay(300);
LED=0;
delay(300);
}
void kuaisu()
{
LED=1;
delay(50);
LED=0;
delay(50);
}
/*--------超声处理部分--------*/
void chaoshengjingbao()
{
if(flag!=1)
{
if((S>3)&&(S<4))
{
mansu();
S=500;
//delay(1000);
}
if((S>2)&&(S<=3))
{
zhongsu();
S=500;
//delay(1000);
}
if(S<=2)
{
kuaisu();
S=500;
//delay(500);
}
}
if(flag==1)
{
LED=1;
delay(1000);
flag=3;
}
}
void timerinit() //定时器初始化
{
TMOD=0x01; //设T0为方式1,GATE=1
TH0=0;
TL0=0;
TR0=1;
}
void StartModule() //超声波触发程序,打开定时器开始计时
{
TRIG=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TRIG=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TRIG=0;
}
/*------------------------------------------------------*/
void main()
{
ECHO=0;
for(;;)
{
timerinit();
StartModule();
//delay(1000);
while(ECHO==0)
{
_nop_();
}
TR0=0;
count();
//delay(110);
chaoshengjingbao();
}
}
//这个程序是一个简易的通过超声波模块测距的程序,程序烧录到单片机以后不能正常运行,观察LED发现它只在一个频率闪烁,但正常的应该是随着距离的变化LED以不同的频率闪烁 。程序已经调了3,4天了,还是没结果,故请求各路高手帮我查出错误,万分感谢 。PS:我这超声波模块是通过TRIG引脚发送10UF的高脉冲后模块自动发射40KHZ的超声波,反射回来的超声波通过ECHO引脚产生高脉冲。 |