您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 51单片机超声波程序
51单片机超声波程序//晶振=8M//MCU=STC10F04XE//P0.0-P0.6共阳数码管引脚//Trig=P1^0//Echo=P3^2#includereg52.h//包括一个52标准内核的头文件#defineucharunsignedchar//定义一下方便使用#defineuintunsignedint#defineulongunsignedlong//***********************************************sfrCLK_DIV=0x97;//为STC单片机定义,系统时钟分频//为STC单片机的IO口设置地址定义sfrP0M1=0X93;sfrP0M0=0X94;sfrP1M1=0X91;sfrP1M0=0X92;sfrP2M1=0X95;sfrP2M0=0X96;//***********************************************sbitTrig=P1^0;//产生脉冲引脚sbitEcho=P3^2;//回波引脚sbittest=P1^1;//测试用引脚ucharcodeSEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9uintdistance[4];//测距接收缓冲区ucharge,shi,bai,temp,flag,outcomeH,outcomeL,i;//自定义寄存器bitsucceed_flag;//测量成功标志//********函数声明voidconversion(uinttemp_data);voiddelay_20us();//voidpai_xu();voidmain(void)//主程序{uintdistance_data,a,b;ucharCONT_1;CLK_DIV=0X03;//系统时钟为1/8晶振(pdf-45页)P0M1=0;//将io口设置为推挽输出P1M1=0;P2M1=0;P0M0=0XFF;P1M0=0XFF;P2M0=0XFF;i=0;flag=0;test=0;Trig=0;//首先拉低脉冲输入引脚TMOD=0x11;//定时器0,定时器1,16位工作方式TR0=1;//启动定时器0IT0=0;//由高电平变低电平,触发外部中断ET0=1;//打开定时器0中断//ET1=1;//打开定时器1中断EX0=0;//关闭外部中断EA=1;//打开总中断0while(1)//程序循环{EA=0;Trig=1;delay_20us();Trig=0;//产生一个20us的脉冲,在Trig引脚while(Echo==0);//等待Echo回波引脚变高电平succeed_flag=0;//清测量成功标志EX0=1;//打开外部中断TH1=0;//定时器1清零TL1=0;//定时器1清零TF1=0;//TR1=1;//启动定时器1EA=1;while(TH130);//等待测量的结果,周期65.535毫秒(可用中断实现)TR1=0;//关闭定时器1EX0=0;//关闭外部中断if(succeed_flag==1){distance_data=outcomeH;//测量结果的高8位distance_data=8;//放入16位的高8位distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据distance_data*=12;//因为定时器默认为12分频distance_data/=58;//微秒的单位除以58等于厘米}//为什么除以58等于厘米,Y米=(X秒*344)/2//X秒=(2*Y米)/344==》X秒=0.0058*Y米==》厘米=微秒/58if(succeed_flag==0){distance_data=0;//没有回波则清零test=!test;//测试灯变化}///distance[i]=distance_data;//将测量结果的数据放入缓冲区///i++;///if(i==3)///{///distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;///pai_xu();///distance_data=distance[1];a=distance_data;if(b==a)CONT_1=0;if(b!=a)CONT_1++;if(CONT_1=3){CONT_1=0;b=a;conversion(b);}///i=0;///}}}//***************************************************************//外部中断0,用做判断回波电平INTO_()interrupt0//外部中断是0号{outcomeH=TH1;//取出定时器的值outcomeL=TL1;//取出定时器的值succeed_flag=1;//至成功测量的标志EX0=0;//关闭外部中断}//****************************************************************//定时器0中断,用做显示timer0()interrupt1//定时器0中断是1号{TH0=0xfd;//写入定时器0初始值TL0=0x77;switch(flag){case0x00:P0=ge;P2=0xfd;flag++;break;case0x01:P0=shi;P2=0xfe;flag++;break;case0x02:P0=bai;P2=0xfb;flag=0;break;}}//*****************************************************************/*//定时器1中断,用做超声波测距计时timer1()interrupt3//定时器0中断是1号{TH1=0;TL1=0;}*///******************************************************************//显示数据转换程序voidconversion(uinttemp_data){ucharge_data,shi_data,bai_data;bai_data=temp_data/100;temp_data=temp_data%100;//取余运算shi_data=temp_data/10;temp_data=temp_data%10;//取余运算ge_data=temp_data;bai_data=SEG7[bai_data];shi_data=SEG7[shi_data];ge_data=SEG7[ge_data];EA=0;bai=bai_data;shi=shi_data;ge=ge_data;EA=1;}//******************************************************************voiddelay_20us(){ucharbt;for(bt=0;bt100;bt++);}/*voidpai_xu(){uintt;if(distance[0]distance[1]){t=distance[0];distance[0]=distance[1];distance[1]=t;}/*交换值if(distance[0]distance[2]){t=distance[2];distance[2]=distance[0];distance[0]=t;}/*交换值if(distance[1]distance[2]){t=distance[1];distance[1]=distance[2];distance[2]=t;}/*交换值}*/
本文标题:51单片机超声波程序
链接地址:https://www.777doc.com/doc-8546125 .html