51单片机测距程序_51单片机激光测距程序
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;
}