使用超声波模块并通过数码管显示距离
#include<stc15f2k60s2.h>
#include"intrins.h"
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();};
unsigned char wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
unsigned char tab[8]={11,11,11,11,11,11,11,11};
unsigned int distance=0;
unsigned int dis;
sbit TX=P1^0;//发送
sbit RX=P1^1;//接收
bit flag_wave=0;
void HC_138(unsigned char m)
{
switch(m)
{
case(4):P2|=0X80;P2&=0X9F;break;
case(5):P2|=0XA0;P2&=0XBF;break;
case(6):P2|=0XC0;P2&=0XDF;break;
case(7):P2|=0XE0;P2&=0XFF;break;
}
}
void allinit()
{
HC_138(4);P0=0xff;
HC_138(4);P0=0x00;
HC_138(4);P0=0x00;
HC_138(4);P0=0xff;
}
void time0init()///定时器0 /
{
TMOD=0X01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
TR0=1;
ET0=1;
}
void time1init()定时器1
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TF1=0;
TH1=0;
TL1=0;
TR1=0;
}
void time0() interrupt 1
{
static i=0,m=0;
TH0=(65535-1000)/256;
TL0=(65536-1000)%256;
HC_138(6);
P0=wei[i];
HC_138(7);
P0=duan[tab[i]];
i++;
if(i==8)
i=0;
m++;
if(m==500)
{
m=0;
flag_wave=1;
}
}
void send_wave()
{
unsigned char i=8;
while(i--)
{
TX=1;
somenop;somenop;somenop;somenop;somenop;
TX=0;
somenop;somenop;somenop;somenop;somenop;
}
}
unsigned int get_distance()
{
TH1=0;
TL1=0;
send_wave();
TR1=1;
while((RX==1)&(TF1==0));
TR1=0;
if(TF1==1)
{
distance=999;
TF1=0;
}
if(RX==0)
{
distance=(((TH1<<8)|TL1)*0.017);
RX=1;
}
return distance;
}
void main()
{
allinit();
time0init();
time1init();
while(1)
{
if(flag_wave==1)
{
dis=get_distance();
flag_wave=0;
}
tab[0]=dis/100;
tab[1]=dis%100/10;
tab[2]=dis%10;
}
}