当前位置:文档之家› 基于C51的超声波测距仪设计 —数码管显示

基于C51的超声波测距仪设计 —数码管显示


{
flag=0;
disbuff[0]=10; //“-”
disbuff[1]=10; //“-”
disbuff[2]=10; //“-”
}
else
{disbuff[0]=S%1000/100; //百位
disbuff[1]=S%1000%100/10; //十位
disbuff[2]=S%1000%10 %10;} //个位
unsigned char const discode[]
={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40,0xff/*-*/};
//数码管显示码0123456789—和不显示
unsigned char const positon[3]={ 0xfc,0xfd,0xfe};
_nop_(); _nop_();_nop_(); _nop_(); _nop_();
_nop_();
TX=0;
}
}
实验结果
刻度值/m 实测值/m 误差/m
0.1
0.09
0.01
0.2
0.18
0.02
0.3
0.27
0.03
0.4
0.37
0.03
0.5
0.45
0.05
0.6
0.55
显示
timer++;
if(timer>=400)
{timer=0;
TX=1;
//800ms 启动一次模块
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
posit=0; }
//扫描数码管
程序代码(子程序)
void Conut(void)
{
time=TH0*256+TL0; //读出T0计数值
TH0=0;
TL0=0;
//清空计数器
S=(time*1.7)/100; //算出来是cm
if((S>=700)||flag==1) //超出测量范围显示“-”
#define RX P1_1
// ECH0 接P1.1
#define TX P1_2
//模块TRIG接 P1.2
unsigned int time=0; //变量声明
unsigned int timer=0;
unsigned char posit=0;
unsigned long S=0;
bit flag =0;
while(1) { while(!RX); TR0=1; while(RX); TR0=0; Conut(); }
//设T0为方式1,GATE=1;
//2ms定时
//允许T0中断 //允许T1中断 //开启定时器 //开启总中断
//当RX为零时等待 //开启计数
//当RX为1计数并等待 //关闭计数 //调用Count函数计算
unsigned char disbuff[4] ={ 0,0,0,0,};//数组,用来存放距离数据
void Display(void);
void Conut(void);
程序代码(主程序)
void main( void ) { TMOD=0x11; TH0=0; TL0=0; TH1=0xf8; TL1=0x30; ET0=1; ET1=1; TR1=1; EA=1;
程序代码(子程序)
void Display(void) { P0=0x00; //关闭显示 if(posit==0) {P0=(discode[disbuff[posit]])|0x80;}
else {P0=discode[disbuff[posit]];}
P2=positon[posit]; posit++; if(posit>=3)
基于C51的超声波测距仪设计
—数码管显示
超声波测距原理
基本工作原理: (1)采用 IO 口 TRIG 触发测 距,给最少 10us 的高电平 信呈。 (2)模块自动发送 8 个 40khz 的方波,自动检测 是否有信号返回; (3)有信号返回,通过 IO 口 ECHO 输出一个高电平, 高电平持续的时间就是超 声 波从发射到返回的时间。 测试距离=(高电平时间*声 速(340M/S))/2;
程序流程图
开始 初始化 发送超声波T1计时 接收到反射波
T1停止计时,保存数据 根据时间算出距离 显示测量距离
程序代码
//接线:模块TRIG接 P1.2 ECH0 接P1.1 //数码管:共阴数码管P0接数据口,P2.3 P2.4 P2.5接选通数码管
#include <AT89x52.H>
#include <intrins.h>
0.07
0.8
0.73
0.07
0.9
0.81
0.09
1
0.9
0.1
1.5
1.35
0.15
2
1.82
0.18
结果展示
近距离测试
远距离测试
}
程序代码(子程序)
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1;
//中断溢出标志
}
void zd3() interrupt 3 //T1中断用来扫描数码管和计800ms启动模块
{
TH1=0xf8;
TL1=0x30;
//定时2ms
Display();
相关主题