网络上集的STC89C52RC单片机超声波测距程序及电子制作实物,使用单片机最小系统进行试验,超声波部分使用HC-SR04模块,测量范围:4-300cm,实际测量上最长可达到5.70m。下面是实物图,文章后面附源程序。
4-300cn,实际测量上最长可达到5.7m
#include ‘AT89X51.H’ //头文件
unsigned char code fseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code segbit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char disbuf[8]={0,0,0,0,0,0,0,0};
//-----------------------------------------------------------------------------
// 函数原形定义
#define uchar unsigned char
#define uint unsigned int
void main (void); // 主函数
void LED4_Display (void); // LED显示
void LED_OUT(uchar X); // LED单字节串行移位函数
void delayms(uint); //延时子函数 ms
void jisuan(void);
unsigned char code LED_0F[]; // LED字模表
sbit DIO=P1^0; //串行数据输入
sbit RCLK=P1^1; //时钟脉冲信号——上升沿有效
sbit SCLK=P1^2; //打入信号————上升沿有效
sbit echo=P3^2; //echo
sbit trig=P3^3; //trig
//-----------------------------------------------------------------------------
// 全局变量
uchar LED[8]; //用于LED的8位显示缓存
uint temp;
uint temp1;
uint a,b; //定义一个变量a,b 后者用于判断是否收到信号
//
// 主程序
//
void main(void) //主函数开始
{
uint f;
echo=0; //先拉低echo,trig引脚
trig=0;
f=500;
while(f》0); //启动延时 消除第一次上电产生的波动
{
LED[3]=16;
LED[2]=15;
LED[1]=15;
LED[0]=16;
f--;
}
EA=1; //开总中断
TMOD=0x11; //设置定时器为方式1
ET0=1; //允许定时器中断 这里主要是防止超声波模块未发送信号
ET1=1;
while(1)
{
echo=0;//a赋值
a=0;
b=1;
TH0=0; //定时器装初值
TL0=0;
TH1=(65536-25000)/256; //定时器装初值
TL1=(65536-25000)%6;
trig=1; //trig送高
LED4_Display (); // 延时3ms
LED4_Display ();
LED4_Display ();
LED4_Display ();
LED4_Display ();
LED4_Display ();
LED4_Display ();
trig=0; //trig送低
TR1=1;
while(echo==0); //等待echo变为高电平
if(b==1) 判断是否收到信号
{