51单片机测距程序_51单片机激光测距程序

2020-02-28 其他范文 下载本文

51单片机测距程序由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“51单片机激光测距程序”。

/*功能描述:

按下按键k检测距离,松开锁定结果

按下按键find 查询历史测量数据,本程序可查询5次历史数据 按下out键 退出历史数据查询功能 Test可不接 */ #include

#define uchar unsigned char #define uint unsigned int #define duan P1

//数码管段选接口 sbit w1=P2^0;

//数码管位选接口 sbit w2=P2^1;

//数码管位选接口 sbit w3=P2^2;

//数码管位选接口 sbit w4=P2^3;

//数码管位选接口 sbit Trig=P0^5;

//测距模块Trig接口 sbit Echo=P3^2;

//测距模块echo接口 sbit test=P3^1;

//测试灯接口 sbit k=P3^4;

//测距按键接口 sbit find=P3^5;

//查询历史数据按键接口 sbit out=P3^6;

//退出历史查询按键接口 sbit find_light=P2^4;

//历史数据查询指示灯(绿灯)sbit whithout_light=P2^5;

//历史数据查询完毕指示灯(红灯)sbit warn=P2^6;bit succeed_flag;

//测量成功标志位 uint timeL=0,timeH=0;

//接收时间数据中间变量 uchar code temp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uint save[6]={0,0,0,0,0,0};

//历史数据储存数组

/************************延时程序********************************/ void delay(uint z){ uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);} /**************************测距模块专用延时*******************************/ void delay_20us(){

uchar a;

for(a=0;a

/*****************数码管显示****************/ void display(uint num){

uchar q,b,s,g;q=num/1000;b=num/100%10;s=num/10%10;g=num%10;w1=0;

duan=~temp[q];delay(2);

//对传入参数进行分解

//打开位选

//段选赋值

w1=1;

//关闭位选

duan=0xff;

w2=0;duan=~temp[b];delay(2);w2=1;duan=0xff;

w3=0;duan=~temp[s];delay(2);w3=1;duan=0xff;

w4=0;duan=~temp[g];delay(2);w4=1;duan=0xff;} /***************************************************************/ void main(){

uint d,time=0;uchar u,s=1;find_light=1;whithout_light=1;P0=0xdf;

test =0;

Trig=0;

EA=1;

//打开中断总开关

TMOD=0x10;

//定时器1工作在方式1

while(1){

if(k==0){

//按键按下则测量,松开则锁定

delay(10);

//延时消抖

if(k==0){

EA=0;

Trig=1;

delay_20us();

Trig=0;

while(Echo==0);

succeed_flag=0;

EA=1;

EX0=1;

TH1=0;

TL1=0;

TF1=0;

TR1=1;

delay(20);

TR1=0;

EX0=0;

if(d3000){

warn=~warn;

delay(10);

}

} }else{

save[0]=d;

//关闭中断总开关

//给予Trig断高电平

//高电平持续20us //置Trig为低电平,以产生20US方波

//等待声波发出,发出后开启定时器中断

//测距成功标志位置0

//以下打开定时器中断并初始化

//关闭外部中断

//对测量数据进行储存

if(save[0]!=save[1]){

//若当前数值与前一数值不同,则数据整体后移

for(u=5;u>0;u--){

save[u]=save[u-1];

}

}

}

if(succeed_flag==1){

//若测距成功,对数据进行整理

time=timeH*256+timeL;

//声波收发时间=高8位*256+低8位

d=time*0.172;

//距离=时间*速度/2(单位为MM)

display(d);

}

if(succeed_flag==0){

//若测距失败则距离显示为0

d=0;

test =!test;

}

while(find==0){

//若按下历史数据查询按键,则进入查询程序

while(out!=0){

find_light=0;

display(save[s]);

if(find==0){

//每按下一次查询按键,就会显示前一次数据

s++;

if(s==6){

//若查询完一遍,则查询完指示灯亮起,从头重新显示

s=1;

whithout_light=0;

}

while(find==0);

}

if(out==0){

//若按下退出键,则退出查询

s=1;

find_light=1;

whithout_light=1;

break;

}

}

}

} } /**************************外部中断0********************************/ void exter()interrupt 0{

//当声波返回时获取TH1与TL1的数据

timeH =TH1;

timeL =TL1;

succeed_flag=1;

//成功标志位置1

EX0=0;

//关闭外部中断

} /****************************定时器1***********************************/ void timer1()interrupt 3{

//用于计算声波传播的时间

TH1=0;

TL1=0;

}

《51单片机测距程序.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
51单片机测距程序
点击下载文档
相关专题 51单片机激光测距程序 单片机 程序 51单片机激光测距程序 单片机 程序
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文