模塊就是那種很常見(jiàn)的HC-SR04的,頭文件 12c5a.H下載: http://www.zg4o1577.cn/f/12c5a.rar
/*******************************************************************************************
程序內(nèi)容:超聲波測(cè)距
有待改善:10cm內(nèi)的物體無(wú)法測(cè)量,會(huì)存在盲點(diǎn),當(dāng)采用stc89之類(lèi)的單片機(jī)時(shí)候數(shù)碼管會(huì)比較暗,不過(guò)反應(yīng)速度并沒(méi)有影響
優(yōu)點(diǎn):反應(yīng)速度很快,實(shí)時(shí)傳遞距離信息并數(shù)碼管顯示。
*******************************************************************************************/
#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;//數(shù)碼管第1位
sbit P21=P2^1;//數(shù)碼管第2位
sbit P22=P2^2;//數(shù)碼管第3位
sbit P23=P2^3;//數(shù)碼管第4位
sbit Trig=P1^7;//超聲波測(cè)試trig
sbit Echo=P3^2;//超聲波測(cè)距echo
sbit beeps=P3^7;//蜂鳴器
unsigned char code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF}; //數(shù)碼管顯示數(shù)據(jù)
unsigned int shuju,ychu; //距離數(shù)據(jù)
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) //延時(shí)
{
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) //數(shù)碼管顯示
{
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() //定時(shí)器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; //外部中斷設(shè)置為跳變,回波引腳echo在不接受回波型號(hào)是都是低電平,所以這里必須是跳變方式
}
void EX0_() interrupt 0 //外部0中斷處理,用以接受回波并測(cè)量時(shí)差
{
TR0=0;
if(((TH0*256+TL0)+(ychu-1)*65536)>=15000) //排除測(cè)距模塊工作范圍之外的數(shù)據(jù),消除干擾
{
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 //定時(shí)器0中斷處理
{
int num;
TR0=0;
TH0=0;
TL0=0;
if(ychu==0|ychu==3)
{
Trig=1;
for(num=30;num>0;num--) //發(fā)送回波脈沖
{
_nop_();
_nop_();
}
Trig=0;
}
ychu++;
TR0=1;
return;
}