超声波测距程序
2011-11-18 21:21
246 查看
利用51单片机实现超声波测距,也是大二做得,当时没有照相机,无法提供照片,比较遗憾,这个程序,有很多问题,但是还是实现了测距,误差两厘米,范围从20cm~500cm
#include <REG52.H>
#define uchar unsigned char
#define uint unsigned int
#define v 1.88 //声波在空气中的传播速度
sbit out=P3^0;
bit flag=0;
uchar p;
uchar display[10]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,
0x7a,0x20,0x60}; //数码管显示码
uint s; //距离长度
uchar sm=0; //数码管段位
uint fir,sec,thi,four,m; //显示值
void scan( );
void delay( uint i) ; //延时函数
void delay1(uchar n);
void main (void)
{
delay(500); //延时500微妙
TMOD=0x11; //工作方式为1
TH1=(65536-100)/256;
TL1=(65536-100)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
ET1=1;
//开定时器1中断
IT0=1;
p=20;
while(1)
{
while(p--)
{
scan();
}
if(flag==0)
{
EA=1;
m=0;
out=1;
TR1=1;
delay1(5);
out=0;
delay1(30);
EX0=1;
}
if(flag==1)
{
flag=0;
EX0=0;
TR1=0;
}
scan();
}
}
void scan( ) //显示函数
{
switch(sm++)
{
case 1: P0=display[fir];
P2=0xfe; delay(20); break;
case 2: P0=display[sec];
P2=0xfd; delay(20); break;
case 3: P0=display[thi];
P2=0xfb; delay(20); break;
case 4: P0=display[four];
P2=0xf7; delay(20); break;
default: { } break;
}
if(sm>4) sm=0;
}
void outer1() interrupt 0
{
EA=0;
TR1=0;
EX0=0;
s=m*v;
if(s<10)
{
EA=0;
TR1=0;
EX0=0;
flag=0;
}
else
{
flag=1;
fir=s/1000;
sec=(s-1000*fir)/100;
thi=(s-fir*1000-sec*100)/10;
four=s%10;
scan();
}
}
void time1() interrupt 3
{
TH1=(65536-100)/256;
TL1=(65536-100)%256;
m++;
if(m>=500)
{ m=0;
EA=0;
TR1=0;
EX0=0;
flag=0;}
}
void delay( uint i)
{
for(i;i>0;i--);
}
void time0() interrupt 1
{
TH0=(65536-50)/256;
TL0=(65536-50)%256;
}
void delay1(uchar n) //延时50*N微妙
{
TH0=(65536-50)/256;
TL0=(65536-50)%256;
TR0=1;
while(TF0)
{
TF0=0;
--n;
}
if(n==0)
TR0=0;
}
#include <REG52.H>
#define uchar unsigned char
#define uint unsigned int
#define v 1.88 //声波在空气中的传播速度
sbit out=P3^0;
bit flag=0;
uchar p;
uchar display[10]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,
0x7a,0x20,0x60}; //数码管显示码
uint s; //距离长度
uchar sm=0; //数码管段位
uint fir,sec,thi,four,m; //显示值
void scan( );
void delay( uint i) ; //延时函数
void delay1(uchar n);
void main (void)
{
delay(500); //延时500微妙
TMOD=0x11; //工作方式为1
TH1=(65536-100)/256;
TL1=(65536-100)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
ET1=1;
//开定时器1中断
IT0=1;
p=20;
while(1)
{
while(p--)
{
scan();
}
if(flag==0)
{
EA=1;
m=0;
out=1;
TR1=1;
delay1(5);
out=0;
delay1(30);
EX0=1;
}
if(flag==1)
{
flag=0;
EX0=0;
TR1=0;
}
scan();
}
}
void scan( ) //显示函数
{
switch(sm++)
{
case 1: P0=display[fir];
P2=0xfe; delay(20); break;
case 2: P0=display[sec];
P2=0xfd; delay(20); break;
case 3: P0=display[thi];
P2=0xfb; delay(20); break;
case 4: P0=display[four];
P2=0xf7; delay(20); break;
default: { } break;
}
if(sm>4) sm=0;
}
void outer1() interrupt 0
{
EA=0;
TR1=0;
EX0=0;
s=m*v;
if(s<10)
{
EA=0;
TR1=0;
EX0=0;
flag=0;
}
else
{
flag=1;
fir=s/1000;
sec=(s-1000*fir)/100;
thi=(s-fir*1000-sec*100)/10;
four=s%10;
scan();
}
}
void time1() interrupt 3
{
TH1=(65536-100)/256;
TL1=(65536-100)%256;
m++;
if(m>=500)
{ m=0;
EA=0;
TR1=0;
EX0=0;
flag=0;}
}
void delay( uint i)
{
for(i;i>0;i--);
}
void time0() interrupt 1
{
TH0=(65536-50)/256;
TL0=(65536-50)%256;
}
void delay1(uchar n) //延时50*N微妙
{
TH0=(65536-50)/256;
TL0=(65536-50)%256;
TR0=1;
while(TF0)
{
TF0=0;
--n;
}
if(n==0)
TR0=0;
}
相关文章推荐
- STM32的超声波测距程序
- 超声波测距程序
- 【Arduino官方教程第一辑】示例程序 6-4 超声波测距传感器
- 如何编写51单片机超声波测距SR04_lcd1602显示程序
- 51单片机 超声波测距 C程序
- 如何编写51单片机超声波测距SR04_lcd1602显示程序
- 51单片机超声波测距C程序
- 如何编写51单片机超声波测距SR04_lcd1602显示程序
- Arduino超声波测距程序
- 51单片机超声波测距程序(C调汇编)
- 51单片机 超声波测距组件
- 基于51单片机的按键控制超声波测距及显示(带提示音)的实现
- 智能小车32:安装超声波测距
- 51单片机课程设计:基于51单片机的超声波测距
- 基于STM32F103的超声波测距
- 树莓派B+实战之一 超声波测距传感器HC-SR04
- 超声波模块 测距模块 超声波 传感器 送资料
- 测距和避障传感器概述之:超声波
- C51超声波测距试验
- US-100超声波(测距与测温)基于stm32f103源码------方式串口通信(测距与测温)