模块就是那种很常见的HC-SR04的,头文件 12c5a.H下载: http://www.51hei.com/f/12c5a.rar
/*******************************************************************************************
程序内容:超声波测距
有待改善:10cm内的物体无法测量,会存在盲点,当采用stc89之类的单片机时候数码管会比较暗,不过反应速度并没有影响
优点:反应速度很快,实时传递距离信息并数码管显示。
*******************************************************************************************/
#include"12c5a.h"
#include"intrins.h"
#define BIN(x0,x1,x2,x3,x4,x5,x6,x7) x0|(x1<<1)|(x2<<2)|(x3<<3)|(x4<<4)|(x5<<5)|(x6<<6)|(x7<<7); //宏定义位
#define P(x) P2=~(1<<x);
sbit P20=P2^0;//数码管第1位
sbit P21=P2^1;//数码管第2位
sbit P22=P2^2;//数码管第3位
sbit P23=P2^3;//数码管第4位
sbit Trig=P1^7;//超声波测试trig
sbit Echo=P3^2;//超声波测距echo
sbit beeps=P3^7;//蜂鸣器
unsigned char code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF}; //数码管显示数据
unsigned int shuju,ychu; //距离数据
unsigned char *led;
void daley(unsigned int);
void TI0_init();
void beep();
void shumagan(unsigned int num);
void main()
{
led=LEDDis;
TI0_init();
daley(10);
while(1)
{
shumagan(shuju);
}
}
void daley(unsigned int time) //延时
{
unsigned int i;
unsigned int j;
for(i=0;i<1000;i++)
for(j=0;j<time;j++);
}
void beep() //蜂鸣器
{
char num,nun;
beeps=0;
for(num=100;num>=0;num--)
{
beeps=~beeps;
for(nun=60000;nun>0;nun--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void shumagan(unsigned int num) //数码管显示
{
P0=*(led+(num/1000));
P(0);
P2=0xff;
P0=*(led+((num%1000)/100));
P(3);
P2=0xff;
P0=*(led+(num%100)/10);
P(2);
P2=0xff;
P0=*(led+(num%100)%10);
P(1);
P2=0xff;
}
void TI0_init() //定时器0外部0初始化
{
Trig=0;
TMOD=BIN(1,0,0,0,0,0,0,0);
AUXR|=0xC0; //T0,T1工作在1T
EA=1;
ET0=1;
EX0=1;
TR0=1;
IT0=1; //外部中断设置为跳变,回波引脚echo在不接受回波型号是都是低电平,所以这里必须是跳变方式
}
void EX0_() interrupt 0 //外部0中断处理,用以接受回波并测量时差
{
TR0=0;
if(((TH0*256+TL0)+(ychu-1)*65536)>=15000) //排除测距模块工作范围之外的数据,消除干扰
{
TH0=0;
TL0=0;
TR0=1;
ychu=0;
beep();
return;
}
shuju=(TH0*256+TL0)*17/1000;
TH0=0;
TL0=0;
TR0=1;
ychu=0;
return;
}
void TI0() interrupt 1 //定时器0中断处理
{
int num;
TR0=0;
TH0=0;
TL0=0;
if(ychu==0|ychu==3)
{
Trig=1;
for(num=30;num>0;num--) //发送回波脉冲
{
_nop_();
_nop_();
}
Trig=0;
}
ychu++;
TR0=1;
return;
}