超声波测距数码管显示源代码

合集下载

超声波测距C语言源程序代码

超声波测距C语言源程序代码

/*{HZ即单位s的倒数}本晶振为12MHZ,因此外部的时钟频率为12MHZ,所以部的时钟频率为(12MHZ)/12=1MH即1000000HZ,而机械频率为1/(1MHZ),即每完成一次计算(即定时器的值加一)用时0.000001s,即1us(微秒).*//***********************************************************************************///具有模式选择.*include<reg52.h>*define UC unsigned char*define UI unsigned intvoid delay(UI); //延时9.56us程序sbit beep = P1^3; //用于声音报警sbit Lv = P1^7; //用于光报警sbit Hong = P1^6;sbit QD = P3^7;//K8 //P3^7口(K8)为确定键,sbit G* = P3^1;//K7 //P3^3口(K2)为修改键,sbit S* = P3^6;//K6 //P3^2(K3)为测量键.sbit B* = P3^0;//K5 //个(K7),十(K6),百(K5),三位修改键sbit a = P1^2;//百位//数码管位选sbit b = P1^1;//十位sbit c = P1^0;//个位sbit trig = P1^4; //方波发射端sbit echo = P1^5; //超声波接收端void IntConfiguration(); //用来"设置中断"的函数,P3^3口(K2)为修改键,P3^2(K3)为测量键.void TimeConfiguration(); //用来"设置定时器"的函数sbit K1 = P3^4;//动态sbit K4 = P3^5;//静态//用于进展模式切换(K1、K4键)void *ia*ian(); //修改函数,用来修改下限void shang*ian(); //修改函数,用来修改上限UI min[3]={0,5,0}; //报警极限,拆分为"百十个"三位UI ma*[3]={3,0,0}; //MIN,MA* 用来存储最大和最小值void MIN*ianshi(UI); //最小围和最大围的显示void MA**ianshi(UI);UC code CharacterCode[10] = {0*3f,0*06,0*5b,0*4f,0*66,0*6d,0*7d,0*07,0*7f,0*6f};//数码管数字字符(P2口)/********************************主函数*********************************************/ void main(){TimeConfiguration(); //设置定时器0IntConfiguration(); //设置中断允许,K4键为修改键,K8键为确定键while(1){MIN*ianshi(40); //1.50169000sMA**ianshi(40); //1.50098300s}}/*******************************超声波测距函数********************************************/void zhongduan_0() interrupt 0 //测量中断函数(外部中断0){UI moshi = 0;UI juli = 0;UI time = 0;UI MA*, MIN;UI TT = 0;//用于第一次测量时给P1^5口置一,以便正确读取数值UI t1, t2, t3;UI GE = 0, SHI = 0, BAI = 0; //先定义三个变量,用来显示测量的距离.a = 0;b = 0;c = 0;P2 =~ 0*00; //防止最后显示的那个数码管一直亮MA* = ma*[0]*100 + ma*[1]*10 + ma*[2]; //计算最大与最小值MIN = min[0]*100 + min[1]*10 + min[2];while(1)//下面进展测量{while(1) /*先进展模式判断*/{if(0 == K1){moshi = 1;break; //模式1为动态测量}if(0 == K4){moshi = 2;break; //模式2为静态测量}if(0 == QD)return; //完毕测量函数}/********************************************计算距离************************************************/loop: beep = 1;//关掉定时器Lv = 1;Hong = 1;//关掉灯a = 0;b = 0;c = 0;P2 =~ 0*00;//防止最后显示的那个数码管一直亮if( (0 == QD)&&(1 == moshi) )break;if( (0 == QD)&&(2 == moshi) ){delay(55500);if(0 == QD){delay(55500);if(0 == QD)break;}}t1 = 35,t2 = 35;t3 = 35;trig = 0;echo = 0;delay(2); //初始化拉低两个端口trig = 1;delay(2);trig = 0; //输出端输出27us的高电压,并将输出端口拉低while(echo == 0); //判断是否有回波返回,有则开启定时器TR0 = 1; //当有高电平输出时,开启定时器while(echo == 1);TR0 = 0; //当高电平变成低电平时,关闭定时器++TT; //测量值加一,记录测量次数if(1 == TT){delay(55500);TH0 = 0*00;TL0 = 0*00; //定时器的初值,定时器的定时为65536us.goto loop;}time = TL0 + TH0*256; //接下来显示测量的距离TH0 = 0*00;TL0 = 0*00; //定时器的初值,定时器的定时为65536us.juli = ( int )( (time*0.034)/2 );BAI = ( (juli%1000)/100 ); SHI = ( (juli%100)/10 ); GE = ( juli%10 );/******************************************两种模式的距离显示********************************************/if(juli > MA*){Hong = 0;Lv = 1;while( t1-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(400);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(400);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(390);beep = 0;if( (1 == moshi)&&(0 == t1) )goto loop;if(moshi == 2){t1 = 2;if(0 == QD)goto loop;}}}else if(juli < MIN){Lv = 0;Hong = 1;while( t2-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(400);beep = 0;delay(100);beep = 1;if( (1 == moshi)&&(0 == t2) )goto loop;if(2 == moshi){t2 = 2;if(0 == QD)goto loop;}}}else{beep = 1;Lv = 1;Hong = 1;while( t3-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(600);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(600);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(600);if( (1 == moshi)&&(0 == t3) )goto loop;if(2 == moshi){t3 = 2;if(0 == QD)goto loop;}}}//显示完毕}}/***********************************************************************************/ void zhongduan_1() interrupt 1 //定时器溢出时的中断,显示测得的距离(定时器中断0){TH0 = 0*00;//定时器的初值,定时器的定时为65536us,TL0 = 0*00;}/***********************************************************************************/ void zhongduan_2() interrupt 2 //修改键(K4)的中断函数(外部中断1){*ia*ian();while(QD==0);shang*ian();}/**********************************************************************************/ void MIN*ianshi(UI TT) //显示最小距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[min[2]];delay(500);}P2 =~ 0*00;delay(55500);}void MA**ianshi(UI TT) //显示最大距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[ma*[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[ma*[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[ma*[2]];delay(500);}P2 =~ 0*00;delay(55500);}/***********************************************************************************/ void delay(UI T) //延时程序{while(T--);}/***********************************************************************************/ void IntConfiguration() //设置中断函数{//优先级设置PT2 = 0;PS = 0;PT1 = 0;P*1 = 0;PT0 = 1;P*0 = 0;IT1 = 1; //外部中断0为跳变沿触发E*1 = 1; //P3^3口(K4键)修改键,中断允许开启IT0 = 1; //外部中断1为跳变沿触发E*0 = 1; //P3^2口(K1键)测量键,中断允许开启ET0 = 1; //定时器0的中断允许开启EA = 1;}void TimeConfiguration() //设置定时器,以及定时器的初值{TMOD = 0*01;//设定只使用0号定时器; 模式:定时器; 工作方式:1号工作方式.//下面是定时器的初始值, TR0,TR1是用来开启定时器的TH0 = 0*00;//定时器的初值,定时器的定时为50us.TL0 = 0*00;/*1号定时器不用,所以没有TH1,TL1*/}/***********************************************************************************/ void *ia*ian() //修改下限{while(1){if(B*==0)//百位{P2=~0*00;min[0]++;if(min[0]==10)min[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(100);if(S*==0)//十位{P2=~0*00;min[1]++;if(min[1]==10)min[1]=0;delay(60000);}a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(100);if(G*==0)//个位{P2=~0*00;min[2]++;if(min[2]==10)min[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[min[2]];delay(100);if(QD==0){a = 0;b = 0;c = 0;P2 = 0*ff;break;}}}void shang*ian() //修改上限{while(1){if(B*==0)//百位{P2=~0*00;ma*[0]++;if(ma*[0]==10)ma*[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[ma*[0]];delay(100);if(S*==0)//十位{P2=~0*00;ma*[1]++;if(ma*[1]==10)ma*[1]=0;delay(60000);}a = 1;b = 0;c = 1;P2 =~ CharacterCode[ma*[1]];delay(100);if(G*==0)//个位{P2=~0*00;ma*[2]++;if(ma*[2]==10)ma*[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[ma*[2]];delay(100);if(QD == 0){a = 0;b = 0;c = 0;P2 = 0*ff;while(QD == 0);break;}}}/************************************************************************************/。

超声波测距程序_代码全

超声波测距程序_代码全

/*----------------------------------超声波子程序1、采用定时器0产生40KHZ的方波,同时也进行时间计数,等待中断;2、若超过30ms后,重新发送方波,重新计数,直到有中断(接收到返回信号)再做显示或其它处理。

3、在处理之后又后重新初始化定器0和中断0,又执行第一步------------------------------------*/#include <reg52.h>//1602已定义了#include "1602.h"#include "delay.h"#include <stdio.h>//包含sprintf函数sbitpwm=P3^7;//40KHZsbit led=P1^3;//接收到后亮灯unsigned intnum=0;//计数float s; //测出的距离bit flag=0;//中断0标志位unsigned char out_time=0;//超时标志位/*---------------------------------------定时器0用于产生40KHZ频率初始化---------------------------------------*/void T0_init(){TMOD=0X02; //定时器0工作在方式2,自动重装数据TL0=256-12; //产生40KHZTH0=256-12; //T=1/40k*1000000=25us即12.5us取反一次EA=1;ET0=1;TR0=1;}/*--------------------------------定时器0中断服务程序//用于工作计时、同时产生40KHZ方波---------------------------------*/void T0_time() interrupt 1{num++;if(num<30) pwm=~pwm;//产生15个40KHZ的方波if(num==2500) {num=0;out_time++;}//30ms后清除标志,同时}/*-----------------------------外部中断0初始化------------------------------*/void INT0_init(){IT0=1;//低电平触发方式EX0=1;//打开外部中断// PX0=1;//外部中断0为高优先级}/*-----------------------------外部中断0中断服务程序------------------------------*/void INT0_d() interrupt 0{EX0=0; //当中断了,证明接收到信号,关闭外断中断TR0=0; //关闭定时器0flag=1; //标志外部中断0产生}/*-------------------------------超声波测距函数//s的值为返回测距值--------------------------------*/void measure(){if(flag==1) //中断0标志,进入{flag=0; //清除标志位out_time=0; //清除超时标志位led=~led; //观察DelayMs(100); //延时,**适用STC12C5A60S2,低速单片机,要减少延时**s=(num*12)/2*0.34*0.001;//测距返回值TH0=256-12; //定时器0重新初始化TL0=256-12;TR0=1; //运行定时器0INT0_init(); //启动外部中断0}}/*-------------------------------超声波显示部分--------------------------------*/void display(){char displaytemp[16];//定义显示区域临时存储数组if(out_time==33) //大约1s的超时时间,再将显示为0.000{out_time=0; //清除标志位s=0; //显示0}sprintf(displaytemp,"distance:% 6.3f",s);//将数字转成字符串LCD_Write_String(0,1,displaytemp);//显示}//*********************主程序***********************//void main(){LCD_Init(); //1602初始化LCD_Clear(); //清屏T0_init(); //定时器0初始化INT0_init(); //启动外部中断0while(1){measure(); //超声波测距函数display(); //显示}}附链接文件程序:/* 1602.c *//*-----------------------------------------------名称:LCD1602引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<intrins.h>#include "1602.h"#include "delay.h"sbit RS = P2^6; //定义端口sbit RW = P2^5;sbit EN = P2^7;#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*------------------------------------------------判忙函数------------------------------------------------*/ bitLCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort& 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/ voidLCD_Write_Com(unsigned char com) {while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/ voidLCD_Write_Data(unsigned char Data){while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/voidLCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/voidLCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {if (y == 0){LCD_Write_Com(0x80 + x); //表示第一行}else{LCD_Write_Com(0xC0 + x); //表示第二行}while (*s){LCD_Write_Data( *s);s ++;}}/*------------------------------------------------写入字符函数------------------------------------------------*//* void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {if (y == 0){LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}LCD_Write_Data( Data);}*//*------------------------------------------------初始化函数------------------------------------------------*/voidLCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/}/* 1602.h *//*-----------------------------------------------名称:LCD1602.h引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK ------------------------------------------------*/#ifndef __1602_H__#define __1602_H__bitLCD_Check_Busy(void) ;voidLCD_Write_Com(unsigned char com) ;voidLCD_Write_Data(unsigned char Data) ;voidLCD_Clear(void) ;voidLCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ; voidLCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ; voidLCD_Init(void) ;#endif/* delay.c*/#include "delay.h"/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned int t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/voidDelayMs(unsigned int t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/* delay.h*/#ifndef __DELAY_H__#define __DELAY_H__/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned int t);/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/voidDelayMs(unsigned int t);#endif。

成功的超声波测距C源程序

成功的超声波测距C源程序

成功的超声波测距C源程序.c默认分类2008-11-1222:57:28阅读1379评论1字号:大中小订阅#include<REG2051.H>//成功的源程序P1.0-P1.7分别是数码管的A-H段码#define k1P3_4//晶振采用12M,P1口为数码管段输出口,P3.0~P3.2为数码管位输出口,P3.5超声波发送输出,P3.7超声波接收。

#define csbout P3_5//超声波发送#define csbint P3_7//超声波接收#define csbc=0.034//声速340米每秒.在电路图中的发射变压器是用电子镇流器的磁环,初级绕15匝,次级绕180匝后接发射头#define bg P3_3unsigned char csbds,opto,digit,buffer[3],xm1,xm2,xm0,key,jpjs;//显示标识unsigned charconvert[10]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9段码unsigned int s,t,i,xx,j,sj1,sj2,sj3,mqs,sx1;bit cl;void csbcj();void delay(j);//延时函数void scanLED();//显示函数void timeToBuffer();//显示转换函数void keyscan();void k1cl();void k2cl();void k3cl();void k4cl();void offmsd();void main()//主函数{EA=1;//开中断TMOD=0x11;//设定时器0为计数,设定时器1定时ET0=1;//定时器0中断允许ET1=1;//定时器1中断允许TH0=0x00;TL0=0x00;TH1=0x9E;TL1=0x57;csbds=0;csbint=1;csbout=1;cl=0;opto=0xff;jpjs=0;sj1=45;sj2=200;sj3=400;k4cl();TR1=1;while(1){keyscan();if(jpjs<1){csbcj();if(s>sj3){buffer[2]=0x76;//超出测量范围,显示HHHbuffer[1]=0x76;//超出测量范围,显示HHHbuffer[0]=0x76;//超出测量范围,显示HHH}else if(s<sj1){buffer[2]=0x40;//初始化显示000buffer[1]=0x40;//初始化显示000buffer[0]=0x40;//初始化显示000}else timeToBuffer();}else timeToBuffer();//将值转换成LED段码offmsd();scanLED();//显示函数if(s<sj2)bg=0;bg=1;}}void scanLED()//显示功能模块{digit=0x04;for(i=0;i<3;i++)//3位数显示{P3=~digit&opto;//依次显示各位数P1=~buffer[i];//显示数据送P1口delay(20);//延时处理P1=0xff;//P1口置高电平(关闭)if((P3&0x10)==0)//判断3位是否显示完key=0;digit>>=1;//循环右移1位}}void timeToBuffer()//转换段码功能模块{xm0=s/100;xm1=(s-100*xm0)/10;xm2=s-100*xm0-10*xm1;buffer[2]=convert[xm2];buffer[1]=convert[xm1];buffer[0]=convert[xm0];}void delay(i){while(--i);}void timer1int(void)interrupt3using2 {TH1=0x9E;TL1=0x57;csbds++;if(csbds>=40){csbds=0;cl=1;}}void csbcj(){if(cl==1){TR1=0;TH0=0x00;TL0=0x00;i=10;while(i--){csbout=!csbout;}TR0=1;i=mqs;//盲区while(i--){}i=0;while(csbint){i++;if(i>=2450)//上限值csbint=0;}TR0=0;TH1=0x9E;TL1=0x57;t=TH0;t=t*256+TL0;s=t*csbc/2;TR1=1;cl=0;}}void keyscan()//健盘处理函数{xx=0;if(k1!=1)//判断开关是否按下{delay(400);//延时去抖动if(k1!=1)//判断开关是否按下{while(!k1){delay(30);xx++;}if(xx>2000){jpjs++;if(jpjs>4)jpjs=0;}xx=0;switch(jpjs){case1:k1cl();break;case2:k2cl();break;case3:k3cl();break;case4:k4cl();break;}}}}void k1cl(){sj1=sj1+5;if(sj1>100)sj1=30;s=sj1;}void k2cl(){sj2=sj2+5;if(sj2>500)sj2=40;s=sj2;}void k3cl(){sj3=sj3+10;if(sj3>500)sj3=100;s=sj3;}void k4cl(){sx1=sj1-1;sx1=sx1/csbc;mqs=sx1/4.5;}void offmsd(){if(buffer[0]==0x3f)//开机三位数码管显示---buffer[0]=0x00;//全亮显示}。

超声波测距数码管显示源代码

超声波测距数码管显示源代码
/*******************************************************************ห้องสมุดไป่ตู้***************************************/
//hc-sr04超声波测距模块DEMO程序
//晶振:11。0592
//程序
//taobao店铺:创威电子
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX = 0;
}
}
/*********************************************************/
//接线:模块TRIG接P2.0 ECH0接P2.1
//数码管显示单位:米
/***********************************************************************************************************/
#include <reg51.h>//器件配置文件
unsigned char const positon[8]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};
unsigned char disbuff[4]={ 0,0,0,0,};
/********************************************************/

超声波测距用数码管显示

超声波测距用数码管显示

#include<reg52.h> //库文件#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6; //申明U1锁存器的锁存端sbit wela=P2^7; //申明U2锁存器的锁存端sbit RX=P1^0;sbit TX=P1^1;uchar bai,shi,ge;unsigned int time=0;unsigned int timer=0;unsigned char posit=0;unsigned long S=0;bit flag =0;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delayms(uint xms){uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=110;j>0;j--);}/********************************************************/ void display(){dula=1;P0=table[bai]; //送段选数据dula=0;P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时wela=1; //原来段选数据通过位选锁存器造成混乱P0=0x7e; //送位选数据wela=0;delayms(1); //延时dula=1;P0=table[shi];dula=0;P0=0xff;wela=1;P0=0x7d;wela=0;delayms(1);dula=1;P0=table[ge];dula=0;P0=0xff;wela=1;P0=0x7b;wela=0;delayms(1);}/********************************************************/ void Conut(){time=TH0;time=((time<<8)|TL0);TH0=0;TL0=0;S=(time*1.7)/100; //算出来是CMif((S>=700)||flag==1) //超出测量范围显示“-”{flag=0;bai=0;shi=0;ge=0;}else{bai=S%1000/100; //分出百,十,和个位shi=S%1000%100/10;ge=S%1000%10 %10;}}/********************************************************/void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围{flag=1; //中断溢出标志}/********************************************************/void zd3() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块{TH1=0xf8;//TL1=0x30;//display();timer++;if(timer>=10){timer=0;TX=1; //800MS 启动一次模块//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();// _nop_();//_nop_();// _nop_();// _nop_();//_nop_();//_nop_();//_nop_();_nop_();_nop_();_nop_();_nop_();TX=0;}}/*********************************************************/void main( void ){TMOD=0x11; //设T0为方式1,GA TE=1;TH0=0;TL0=0;TH1=0xf8; //2MS定时TL1=0x30;ET0=1; //允许T0中断ET1=1; //允许T1中断TR1=1; //开启定时器EA=1; //开启总中断while(1){while(!RX); //当RX为零时等待TR0=1; //开启计数while(RX); //当RX为1计数并等待TR0=0; //关闭计数Conut();//计算}}/********************************************************************结束*********************************************************************/。

超声波测距C程序

超声波测距C程序

#include<AT89X51.H>#include<intrins.h>/***************************数码管为共阴数码管***************************/sbit s0=P2^7;//个位选通sbit s1=P2^6;//十位选通sbit s2=P2^5;//百位选通sbit s3=P2^4;//千位选通sbit dp=P0^7;//小数点sbit in=P3^2;//外部中断,接CX20106的脚sbit csb=P3^3;//40KHz方波输出脚#define seg P0 //数码管的数据口为P1口#define uchar unsigned char#define uint unsigned int#define nop _nop_()/****************************/void init(void);//初始化void delay_nms(uint n);//延时nmsvoid delay100us();//延时usvoid display(uint dat);//4位数码管显示函数,只用了位void tran(void);//超声波测量函数/***************************/uint dis,H=100,L=20;uchar flag=0,high_time,low_time,m=0;uchar leddata[]={0x3F, //"0"0x06, //"1"0x5B, //"2"0x4F, //"3"0x66, //"4"0x6D, //"5"0x7D, //"6"0x07, //"7"0x7F, //"8"0x6F, //"9"0x77, //"A"0x7C, //"B"0x39, //"C"0x5E, //"D"0x79, //"E"0x71, //"F"0x76, //"H"0x38, //"L"0x37, //"n"0x3E, //"u"0x73, //"P"0x5C, //"o"0x40, //"-"0x00, //熄灭0x00 //自定义};void delay100us(){uchar i;for(i=0;i<50;i++);}/********************************** 函数名称:主函数修改日期:入口参数:无返回值: 无**********************************/ void main(void){init();while(1) //循环测量并显示{tran();//发送超声波信号测距display(dis);//显示距离}}/********************************** 函数名称:初始化函数修改日期:入口参数:无返回值: 无**********************************/ void init(void){TMOD=0x01;//定时器方式用于计时TH0=0;TL0=0; /* 设定T0的工作模式为*/EA=1;IT0=1;//下降沿有效,左传感器}/********************************** 函数名称:延时函数修改日期:入口参数:n返回值: 无**********************************/ void delay_nms(uint n){uchar i;while(n--){for(i=123;i>0;i--);}}/********************************** 函数名称:显示函数修改日期:入口参数:data返回值: 无**********************************/ void display(uint dat){uchar i,j,k;//分别为百十个位的缓存i=dat/100;//百位j=dat%100/10;//十位k=dat%100%10;//个位s3=1;s2=0;s1=1;s0=1;seg=~leddata[i];dp=0;delay_nms(2);dp=1;s2=1;s3=1;s2=1;s1=0;s0=1;seg=~leddata[j];delay_nms(2);s1=1;s3=1;s2=1;s1=1;s0=0;seg=~leddata[k];delay_nms(2);s0=1;}/**********************************函数名称:超声波测量函数修改日期:入口参数:无返回值: 无**********************************/ void tran(void){uchar i;float temp;TH0=0;TL0=0;//清定时TR0=1;//开定时for(i=8;i>0;i--){csb=!csb;nop;nop;nop;nop;nop;nop;nop;nop;nop;}csb=1;delay_nms(1);EX0=1;//开中断if(flag==1) //中断标志位置,说明有回波{ //以下为路程计算temp=high_time*256+low_time;temp=(temp/1000)/2;temp*=340;temp=temp/10;dis=(unsigned int)temp;flag=0;}}/********************************** 函数名称:中断函数修改日期:入口参数:无返回值: 无**********************************/void TT() interrupt 0{uint tmp;TR0=0;//关定时器ET0=0;//关外部中断flag=1; //置位标志位tmp=TH0*256+TL0; //读取定时器的值if((tmp>0)&&(tmp<60000))//判断是否超出范围,此设置的范围为到米,实际不能达到米{high_time=TH0;//把计时值放入缓冲low_time=TL0;}else//超出范围则重新测量{high_time=0;low_time=0;}}。

单片机源代码-超声波测距

单片机源代码-超声波测距
lcd_en=1;//高电平,数据送入液晶液晶数据RAM
_nop_();//保持一会儿,使显示数据可靠地送入液晶数据RAM
lcd_en=0;//低电平,显示数据
}
void lcd1602_init()//液晶显示初始化操作
{
P0=0x00;
hc573_sg_le=0;//关闭HC573使数码管不显示
if(distance<5)//*本程序最小测量距离为5cm
return 4;//*如果小于5cm将返回一个4
//*的值作为报警处理的判断数据
if(distance>=300)//**本程序最大测量距离为300cm
return 301;//**如果超过300cm将返回一个301
//**的值作为报警处理的判断数据
hc573_bit_le=0;
lcd_en=0;//为0,为实现高脉冲作准备
lcd_write_cmd(0x38);//设置为5x7显示
lcd_write_cmd(0x0c);//打开显示-不显示示光标
lcd_write_cmd(0x6);//地址加一,光标右移,整屏显示不移动
lcd_write_cmd(0x01);//清屏
}
voidlcd_write_data(unsigned chardat) //液晶写数据函数
{
lcd_busy_check();//每次操作之前都要进行忙信号检测
lcd_rs=1;//执行数据操作,为1
lcd_rw=0;//写操作,为0
P0=dat;//送数据到液晶数据端口P0,准备执行数据操作
_nop_();
}
else
{//如果测量距离满足要求
FM=1;//那么蜂鸣器不发声

51单片机超声波测距程序

51单片机超声波测距程序

//超声波测距,测距X围2cm-400cm; #include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit trig=P1^0;sbit echo=P3^2;sbit test=P1^1;//测试灯sbit dula=P2^6;sbit wela=P2^7;sbit BEEP=P2^3;uint timeh,timel,distance;uint ge,shi,bai,xiaoshu,flag,time;/*共阴极数码管不带小数点代码表*/ uchar code list[]={0x3f , 0x06 , 0x5b , 0x4f ,0x66 , 0x6d ,0x7d , 0x07 ,0x7f , 0x6f , 0x77 , 0x7c ,0x39 , 0x5e , 0x79 , 0x71 };/*共阴极数码管带小数点代码表*/ uchar code listtwo[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};/*长延时函数*/void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=100;y>0;y--); }/*短延时函数*/void delay20us() {uchar a;for(a=0;a<100;a++); }/*报警函数*/ void beer(){//BEEP=0;delay(10);}/*定时器初始化*/ void initime0() {TMOD=0x01;TH0=0;TL0=0;EA=0;ET0=0;EX0=0;}/*外部中断函数*/void estern() interrupt 0{timeh=TH0;timel=TL0;beer();flag=1;//进入中断,标志位就置1 EX0=0;//同时关断外部中断和定时器 TR0=0;}/*显示函数*/void display(distance) {bai=distance/1000;shi=distance%1000/100; ge=distance%100; xiaoshu=distance%10;dula=1;P0=list[xiaoshu];dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(2);P0=listtwo[ge]; dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(2);dula=1;P0=list[shi]; dula=0;P0=0xff;wela=1;P0=0xfd;delay(1);dula=1;P0=list[bai]; dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(1);}/*被调用子函数*/ void diaoyong(){uint i;EA=0;echo=1;//为了检测电平的上下,首先必须拉高trig=1;delay20us();trig=0;while(echo==0);//如果进入中断即接收到超声波就向下执行flag=0;//接收到就去除标志位EA=1;//同时打开总中断EX0=1;//打开外部中断TR0=1;//开定时器TH0=0;//定时器清零TL0=0;for(i=0;i<100;i++)//等待测量的结果{display(distance);//用100次显示循环来延时,解决数码管显示不亮问题}//delay(50);//用延时函数数码管闪烁TR0=0;//延时一段时间后关断定时器EX0=0;//延时一段时间后关断外部中断if(flag==1)//如果进入中断,说明测距已经测好{time=timeh*256+timel;//计算测定距离,并显示distance=time*0.1720;display(distance);}if(flag==0)//如果没有进入中断,距离为0,同时灯闪烁{distance=0;test=!test;}}word/*主函数*/void main(){initime0();test=0;trig=0;EA=1;while(1){diaoyong();display(distance);}}11 / 11。

51单片机超声波测距程序

51单片机超声波测距程序

// 超声波测距,测距范围2cm-400cm;#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char sbittrig=P1A0;sbit echo二卩3八2;sbit test=P1A1; // 测试灯sbit dula=P2A6;sbit wela=P2A7;sbit BEEP=P2A3;uint timeh,timel,distance;uint ge,shi,bai,xiaoshu,flag,time;/* 共阴极数码管不带小数点代码表*/ uchar code list[]={0x3f , 0x06 , 0x5b , 0x4f , 0x66 ,0x6d ,0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71 };/* 共阴极数码管带小数点代码表*/ uchar code listtwo[] ={ 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};/* 长延时函数*/void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=100;y>0;y--);/* 短延时函数*/ void delay20us() {uchar a;for(a=0;a<100;a++); }/* 报警函数*/void beer(){// BEEP=0; delay(10);}/* 定时器初始化*/ void initime0() {TMOD=0x01;TH0=0;EA=0;ET0=0;EX0=0;}/* 外部中断函数*/ void estern() interrupt 0 {timeh=TH0;timel=TL0;beer();flag=1;EX0=0;TR0=0;}/* 显示函数*/void display(distance) bai=distance/1000;shi=distance%1000/100; ge=distance%100; xiaoshu=distance%10; // 进入中断,标志位就置 1 // 同时关断外部中断和定时P0=list[xiaoshu]; dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(2);dula=1;P0=listtwo[ge]; dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(2);dula=1;P0=list[shi]; dula=0;wela=1;P0=0xfd; wela=0;delay(1);dula=1;P0=list[bai]; dula=0;P0=0xff;wela=1;P0=0xfe; wela=0;delay(1);}/* 被调用子函数 */ void diaoyong(){ uinti;EA=0;echo=1; // 为了检测电平的高低,首先必须拉高trig=1;delay20us();trig=0;while(echo==0);向下执行flag=0;EA=1;EX0=1;TR0=1;TH0=0;TL0=0;for(i=0;i<100;i++) display(distance); // 用 100 次显示循环来延时, 解决数码管// 如果进入中断 即接收到超声波就 // 接收到就清除标志位 // 同时打开总中断 // 打开外部中断 // 开定时器 // 定时器清零// 等待测量的结果显示不亮问题}// delay(50); // 用延时函数数码管闪烁TR0=0; // 延时一段时间后关断定时器EX0=0; // 延时一段时间后关断外部中断if(flag==1) // 如果进入中断,说明测距已经测好{time=timeh*256+timel;// 计算测定距离,并显示distance=time*0.1720;display(distance);}if(flag==0) // 如果没有进入中断,距离为0,同时灯闪烁{distance=0;test=!test;}}/* 主函数*/void main(){initime0();test=0;trig=0;EA=1;while(1){ diaoyong();display(distance);。

超声波测距51代码

超声波测距51代码

#include<reg52.h>#include<intrins.h>#include<stdio.h>#define uint unsigned int #define uchar unsigned char sbit RS = P2^4; //定义端口sbit RW = P2^5;sbit EN = P2^6;sbit Trig=P3^1;sbit Echo=P3^2;uchar Distance[10]={0}; uchar outh=0,outl=0;float Echo_data=0;bit Echo_Flag=0;bit Start_Flag=0;//bit Error_Flag=0;bit ov=0;sbit test=P1^0;//start测试用sbit test1=P1^4;//溢出ov测试//sbit test2=P1^4;//保留void Timer_init();void Trig_pulse();void Distance_deal();void delay(uchar x){uchar i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}// 判忙函数bit lcd_busy(){P0=0xff;RS=0;RW=1;EN=0;_nop_();EN=1;return(bit)(P0&0x80);}void write_com(char com){while(lcd_busy());RS=0;RW=0;EN=1;P0=com;_nop_();EN=0;}void write_data(char date){while(lcd_busy());RS=1;RW=0;EN=1;P0=date;_nop_();EN=0;}/*void lcd_clear(){write_com(0x01);delay(5);} */void lcd_wstring(uchar x,uchar y,uchar *s) //些字符串函数{if(y==0){write_com(0x80+x);}else{write_com(0xc0+x);}while(*s){write_data(*s);s++;}}/*void lcd_wchar(uchar x,uchar y,uchar s) //些字符函数{if(y==0){write_com(0x80+x);}else{write_com(0xc0+x);}write_data(s);} */void lcd_init(){write_com(0x38);delay(5);write_com(0x38);//显示模式设置write_com(0x08);//显示关闭write_com(0x01);//显示清屏write_com(0x06);//显示光标移动设置delay(5);write_com(0x0c);//显示开及光标设置}void main(){Timer_init();while(1){while(Start_Flag){test=~test;Start_Flag=0;Echo=0;Trig_pulse();while(!Echo);TR0=1;while(Echo);TR0=0;outh=TH0;outl=TL0;TH0=0;TL0=0;lcd_init();delay(1);Distance_deal();delay(5);}}}void Timer_init(){EA=1;TMOD|=0X11;TH0=0;TL0=0;ET0=1;TR0=0;ET1=1;TR1=1;TH1=-10000/256;TL0=-10000%256;}void Trig_pulse(){Trig=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();Trig=0;}void Timer0() interrupt 1{ov=1;test1=~test1;}void Timer3() interrupt 3{uchar cnt;TH1=-10000/256;TL1=-10000%256;cnt++;if(cnt==100){cnt=0;Start_Flag=1;}}void Distance_deal(){// uchar i;uint temp=0;// Error_Flag=0;temp=256*outh+outl;Echo_data=(float)(temp*0.017);sprintf(Distance,"(cm):%6.2f",Echo_data);if((Echo_data)>480+'0'||ov){ov=0;lcd_wstring(0,0,"Erroe Distance");}else{lcd_wstring(0,0,"Current Distance!");lcd_wstring(3,1,Distance);}}。

超声波测距—1602显示

超声波测距—1602显示

#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit ech0=P3^2;sbit trig=P1^4;sbit rs=P1^2;sbit rw=P1^1;sbit en=P1^0;unsigned int time,timeH,timeL,distance;unsigned char succeed_flag;/**************************延时函数*******************************/ void delay(unsigned int z){unsigned char x,y;for(x=z;x>0;x--)for(y=110;y>0;y--); //延时1ms}/*************************延时20us***********************************/ void delay_20us(){unsigned char a;for(a=0;a<10;a++);}/**************液晶1602显示程序**************************/void write_com(unsigned char com) //写命令{rs=0;rw=0;P2=com;delay(5);en=1;delay(5);en=0;}void write_data(unsigned char date) //写数据{rs=1;rw=0;P2=date;delay(5);en=1;delay(5);en=0;}/************************液晶字符输入**************************/ void zifu_1602(unsigned char *str) //写字符{while(*str!='\0'){write_data(*str);str++;}}/**************************数字输入*****************************/ void shuzi_1602(unsigned char dat) //写数字{unsigned char dat1;dat1=dat+'0';write_data(dat1);}/************************液晶输入的位置*************************/ void weizhi_1602(unsigned char x,unsigned char y){if(x==1){write_com(0x80+y); //第一行}if(x==2){write_com(0x80+0x40+y); //第二行}}/***************************液晶显示函数***************************/ void display(unsigned int k){unsigned char aa,bb,cc;aa=distance / 100;bb=distance / 10%10;cc=distance % 10;weizhi_1602(1,4);shuzi_1602(aa);weizhi_1602(1,5);shuzi_1602(bb);weizhi_1602(1,6);shuzi_1602(cc);}/****************************液晶初始化******************************/ void init(){rw=0;en=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);weizhi_1602(1,2);zifu_1602("S");weizhi_1602(1,3);zifu_1602("=");weizhi_1602(1,7);zifu_1602("c");weizhi_1602(1,8);zifu_1602("m");}void main(){init();trig=0;EA=1;TMOD=0X10; //定时器1,16位工作方式while(1){EA=0;trig=1; //触发控制信号delay_20us();trig=0; //产生一个延时为20us的波while(ech0==0); //等待echo回波引脚边为高电平succeed_flag=0; //清测量成功标志EA=1;EX0=1; //开外部中断0TH1=0;TL1=0; //定时器1清0TF1=0; //计数溢出标志TR1=1; //启动定时器1delay(20); //等待测量结果TR1=0; //关闭定时器1EX0=0; //关闭外部中断0if(succeed_flag==1){time=timeH*256+timeL;distance=time*1.87/100; //cmdisplay(distance);}if(succeed_flag==0) //无回波,清0{distance=0;}}}void exter() interrupt 0 //外部中断0,判断回波电平{timeH=TH1;timeL=TL1; //取出定时器值succeed_flag=1; //成功测量的标志EX0=0; //关闭外部中断}void timer1() interrupt 3 //定时器1中断,用做超声波测距计时{TH1=0;TL1=0;}。

超声波测距实验报告含代码

超声波测距实验报告含代码

实验六超声波测距一、实验内容编写C51程序,使用超声波测量实验板距离障碍物的距离,将结果(以厘米计)显示到数码管上。

测量距离在30cm~200cm之间。

二、实验原理振动频率超过20kHz,不能被人耳所接收的声波称作“超声波”。

超声波频率高,波长短,在一定距离内沿直线传播,具有良好的束射性和方向性,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪等。

当超声波在发射后遇到障碍物反射回来之后,根据发射和接收的时间差计算出发射点到障碍物的实际距离。

在不考虑温度等因素的情况下,超声波在空气中的传播速度约为340m/s,根据记录的时间差t,就可以计算出发射点距障碍物的距离(s),即:s=340*t/2。

超声波测距装置分为两部分:超声波发生器和超声波接受器。

本实验中采用压电式超声波发生器。

它利用压电晶体的谐振原理来进行电能和机械能之间的相互转换。

超声波发生器内部有两个压电晶片和一个共振板。

当压电晶片外加一定电压的脉冲信号,并且其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,将电能转换为机械能,产生超声波。

反之,如果两电极间未外加电压,而共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。

因此同一种装置即可作为发生器,也可以作为接收器。

本实验使用的压电晶片的固有振荡频率为40kHz左右。

超声波测距产生误差的原因包括时间误差和超声波传播速度误差两大方面。

时间误差方面可以通过各种软件措施进行弥补,使用单片机也可以达到微秒级,对整体误差影响很小。

超声波的传播速度受空气的密度所影响,空气的密度越高则超声波的传播速度就越快,而空气的密度又与温度有着密切的关系,另外和湿度也有一定的关系。

整体来说,实际速度变化的幅度能够达到5%,是更加重要的影响因素。

本实验基本原理框图如下:本实验基本电路原理图如下:三、实验流程图1、外部中断服务程序e0流程图2、定时器0中断服务程序Timer0流程图3、定时器1中断服务程序Timer1流程图4、主程序流程图四、程序源代码1.#include <reg52.h>2.3.sfr P4 = 0xC0;4.sfr P4SW = 0xBB;5.sbit CLK = P4^4;6.sbit DAT = P4^5;7.sbit out = P1^0;8.9.bit badvalue;10.unsigned int count = 0;11.unsigned long int result = 0;12.unsigned long int n = 0;13.unsigned int m = 0;14.int i;15.unsigned int code tab[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};16.17.void show(unsigned int count){18. unsigned int i, num, c;19. num = tab[count];20.for (i = 0; i < 8; i++)21. {22. CLK = 0;23. c = num & 0x80;24. DAT = c;25. CLK = 1;26. num <<= 1;27. }28.}29.30.void display(unsigned int c)31.{32. show(c % 10);33. c /= 10;34. show(c % 10);35. show(c / 10);36.}37.38.void delay(unsigned char i,unsigned char j)39.{40.while(i--)41. {42.while(j--);43. j=255;44. }45.}46.47.void e0() interrupt 048.{ unsigned long t;49.if(INT0 == 0)50. {51. TR1=0;52. delay(2,255);53.if(badvalue)54. {55. TR1=0;56. result=0;57. }58.else59. {60. t=TH1;61. t = t << 8;62. t |= TL1;63. t=t*170;64. result=t/10000;65. }66.if(result != 11)67. n = 0;68.if(result < 300)69. m = 0;70.if(result >= 11 && result<= 15 )71. {72. n++;73.if(n > 10)74. {75. display(result);76. n = 0;77. }78. }79.else80. {81. display(result);82. }83. EX0=0;84. }85.}86.87.void timer0() interrupt 188.{89. out = ~out;90.if(count != 0x00)91. count-=1;92.else93. {94. TR0=0;95. delay(3,120);96. EX0=1;97. }98.}99.100.void timer1() interrupt 3101.{102. badvalue = 1;103.}104.105.void main()106.{107. P4=0xFF;108. P4SW=0x70;109. TMOD = 0x12;110. EA = 1;111. EX0 = 0;112. ET0 = 1;113. ET1 = 1;114. IT0 = 1;115.116.while(1)117. {118. count = 4;119. out = 0;120. badvalue = 0;121.122. TH0=0xf3;123. TL0=0xf3;124. TH1=0x00;125. TL1=0x00;126.127. TR0=1;128. TR1=1;129.for(i = 0; i < 5; i++)130. delay(255,255);131.132. }133.}五、思考题1. 当时间测量定时器溢出时,能够测量的最大距离是多少?定时器1在工作方式1下是16位定时器,最大值65535,也就是可以累加65536个数值,用65536*340/2/10000 = 1114cm,这便是能够测量的最大距离。

超声波测距仪代码(C)

超声波测距仪代码(C)
ulong TIME; uchar DISTANCE; uchar code discode[11]={'0','1','2','3','4','5','6','7','8','9',' '}; ulong data disnum[5]; bit data ReceiveOK=0; bit data TOut; bit data FLAG;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_ (); _nop_();_nop_(); CSOut=1;//6
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_ (); _nop_(); CSOut=0;//7
Hale Waihona Puke if(FLAG==1) //启动测量一次 {
TH0=0x00; TL0=0x00; TIME=0x00;
ET0=1; CCOut(); ct=100; while(--ct); EX0=1; while(TOut==0) {
if(ReceiveOK==1) //接收成功 {
DataProcess(); //数据处理
/*-----------------------------------------------------------*/ //出错提示函数 /*-----------------------------------------------------------*/ void ErrorDisplay(void) { lcd_home(); lcd_writestr(0,0," 超声波测距仪 "); lcd_writestr(1,0,"********"); lcd_writestr(2,0,"未收到回波信号,"); lcd_writestr(3,0,"请缩短测量距离!"); }

超声波测距12864显示程序带语音播报

超声波测距12864显示程序带语音播报
#include <AT89X52.H>
#include <string.h>
#include "stdio.h"
#define uchar unsigned char
#define uint unsigned int
#define LCD_DATA P2 //数据口
sbit RS=P3^7;
flag=0;
time=0;
P16=1;
}
if((flag==1)&&(time>=200)&&(time<=500)){
Dis_string(1,0,"距离");
Dis_string(1,7,"米");
display(time,4);
Dis_string(2,2,string2);
}
void main()
{
flag=0;
P0=0XFF;
P14=0;
P15=0;
P16=0;
LcdInit(); //液晶初始化
Clear_txt();//清除液晶上的的文本
Dis_string(0,2,"欢迎使用");
Dis_string(2,0,"超声波测距离系统");
void DelayMs(uint z)
{
uint x,y;
for(x=z;x!=0;x--)
for(y=255;y!=0;y--);
}
//延时函数
void delay(unsigned int MS)
{

超声波测距c语言程序

超声波测距c语言程序

//超声波模块显示程序#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned longsbit Tx = P3^3; //产生脉冲引脚sbit Rx = P3^2; //回波引脚sbit fmq=P1^7;uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9 uint distance[4]; //测距接收缓冲区uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定义寄存器bit succeed_flag; //测量成功标志void conversion(uint temp_data) //显示数据转换程序{uchar ge_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]&0x7f;ge_data =SEG7[ge_data];EA=0;bai = bai_data;shi = shi_data;ge = ge_data ;EA=1;}//20us延时函数void delay_20us(){ uchar bt ;for(bt=0;bt<22;bt++);}//1ms基准延时程序void delay1ms(unsigned int i){unsigned char j;while(i--){for(j=0;j<115;j++){;}}}//产生1KHZ频率声音的函数void beep(){fmq=0;delay1ms(500);fmq=1;delay1ms(500);}// 主程序void main(void){ uint distance_data,a,b;uchar CONT_1;i=0;flag=0;Tx=0; //首先拉低脉冲输入引脚TMOD=0x11; //定时器0,定时器1,16位工作方式TR0=1; //启动定时器0IT0=0; //由高电平变低电平,触发外部中断ET0=1; //打开定时器0中断EX0=0; //关闭外部中断EA=1; //打开总中断0while(1) //程序循环{EA=0;Tx=1;delay_20us();Tx=0; //产生一个20us的脉冲,在Tx引脚while(Rx==0); //等待Rx回波引脚变高电平succeed_flag=0; //清测量成功标志EX0=1; //打开外部中断TH1=0; //定时器1清零TL1=0; //定时器1清零TF1=0; //TR1=1; //启动定时器1EA=1;while(TH1 < 50);//等待测量的结果,周期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; //没有回波则清零}distance[i]=distance_data; //将测量结果的数据放入缓冲区i++;if(i==3){distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;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);if(b>0&&b<200){fmq=0;delay1ms(100);fmq=1;}}i=0;}}}//外部中断0,用做判断回波电平INTO_() interrupt 0 // 外部中断是0号{outcomeH =TH1; //取出定时器的值outcomeL =TL1; //取出定时器的值succeed_flag=1; //至成功测量的标志EX0=0; //关闭外部中断}//定时器0中断,用做显示timer0() interrupt 1 // 定时器0中断是1号{TH0=0xfd; //写入定时器0初始值TL0=0x77;switch(flag){case 0x00:P0=ge; P2=0x7f;flag++;break;case 0x01:P0=shi;P2=0xbf;flag++;break;case 0x02:P0=bai;P2=0xdf;flag=0;break;}}。

一个超声波测距的程序源码

一个超声波测距的程序源码

一个超声波测距的程序源码下面是一个超声波测距的程序,硬件电路由于电脑格盘已丢失,下面的代码是从样机上复制的。

硬件电路包括液晶显示、超声波的发射、超声波的接受、滤波、单片机处理。

液晶显示采用LCD1602模块,下面的代码里有液晶的驱动,可以拷贝用于它处。

超声波发射电路包括压电换能器及其支持电路,发射约44KHz的超声波。

超声波的接收电路包含一块CD40106处理芯片。

技术指标大约是测距范围在三米左右,测量精度约在厘米级别。

大量用于倒车雷达的测距中。

#include<reg51.h>#include <intrins.h>#define Busy 0x80 //用于检测LCM状态字中的Busy标识#define LCM_Data P0#define uchar unsigned char#define uint unsigned int#define ulong unsigned longextern void cs_t(void);extern void delay(uint);void LCMInit(void);void DisplayOneChar(uchar X, uchar Y, uchar DData);void DisplayListChar(uchar X, uchar Y, uchar *DData);void Delay5Ms(void);void Delay100Ms(void);void WriteDataLCM(uchar WDLCM);void WriteCommandLCM(uchar WCLCM,BuysC);data float distant=0.0;uchar ReadDataLCM(void);uchar ReadStatusLCM(void);uchar cdle_net[] = {"--Daoche_Leida--"};uchar email[] = {"Juli:"};uchar cls[]={" "};uchar DIS[7];data ulong time;float distant;sbit LCM_RS=P1^1; //定义LCD引脚sbit LCM_RW=P1^2;sbit LCM_E=P1^3;sbit P10=P1^0;data uchar flag;void zhuanhuan(float juli){unsigned long juli1;juli1=juli*100;DIS[6]=juli1%10+0x30;juli1=juli1/10;DIS[5]=juli1%10+0x30;juli1=juli1/10;DIS[4]='.';DIS[3]=juli1%10+0x30;juli1=juli1/10;DIS[2]=juli1%10+0x30;juli1=juli1/10;DIS[1]=juli1%10+0x30;DIS[0]=juli1/10+0x30;}void main(void){Delay100Ms(); //启动等待,等LCM讲入工作状态P10=1;TMOD=0x01; //计数器0工作在方式1 TH0=0;TL0=0; //计数值初始化IT1=0; //低电平触发中断EA=1; //开总中断//IP=0x04; //设置外部中断1为高优先级中断 flag=0;LCMInit(); //LCM初始化while(1){cs_t();Delay5Ms();ET0=1; //打开计数器0中断EX1=1; //打开外部中断1TR0=1;while(!flag){DisplayListChar(0, 0, cdle_net);DisplayListChar(0, 1, email);}if(flag==1){time=TH0;time=(time<<8)|TL0;distant=time*1.72/100;zhuanhuan(distant);if(DIS[0]=='0') DisplayOneChar(5,1,' ');else DisplayOneChar(5,1,DIS[0]);if((DIS[0]=='0')&&(DIS[1]=='0')) DisplayOneChar(6,1,' ');else DisplayOneChar(6,1,DIS[1]);if((DIS[0]=='0')&&(DIS[1]=='0')&&(DIS[2]=='0')) DisplayOneChar(7,1,' '); else DisplayOneChar(7,1,DIS[2]);DisplayOneChar(8,1,DIS[3]);DisplayOneChar(9,1,DIS[4]);DisplayOneChar(10,1,DIS[5]);DisplayOneChar(11,1,DIS[6]);DisplayOneChar(12,1,'c');DisplayOneChar(13,1,'m');flag=0;}else{DisplayListChar(5,1,"error! ");flag=0;}TH0=0;TL0=0;Delay100Ms();}}void cs_r(void) interrupt 2{TR0=0;EX1=0;ET0=0;flag=1;}void overtime(void) interrupt 1{EX1=0;TR0=0;ET0=0;flag=2;}//写数据void WriteDataLCM(uchar WDLCM){ReadStatusLCM(); //检测忙LCM_Data=WDLCM;LCM_RS=1;LCM_RW=0;LCM_E=0; //若晶振速度太高可以在这后加小的延时LCM_E=0; //延时LCM_E=1;}//写指令void WriteCommandLCM(uchar WCLCM,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCM(); //根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;}//读数据uchar ReadDataLCM(void){LCM_RS = 1;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;return(LCM_Data);}//读状态uchar ReadStatusLCM(void){LCM_Data=0xFF;LCM_RS=0;LCM_RW=1;LCM_E=0;LCM_E=0;LCM_E=1;while(LCM_Data & Busy); //检测忙信号return(LCM_Data);}void LCMInit(void) //LCM初始化{LCM_Data=0;WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号 WriteCommandLCM(0x08,1); //关闭显示WriteCommandLCM(0x01,1); //显示清屏WriteCommandLCM(0x06,1); // 显示光标移动设置WriteCommandLCM(0x0F,1); // 显示开及光标设置}//按指定位置显示一个字符void DisplayOneChar(uchar X, uchar Y, uchar DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCM(X, 1); //发命令字WriteDataLCM(DData); //发数据}//按指定位置显示一串字符void DisplayListChar(uchar X, uchar Y, uchar *DData){uchar ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]>0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符 ListLength++;X++;}}}//5ms延时void Delay5Ms(void){uint TempCyc = 200;while(TempCyc--);}//400ms延时void Delay100Ms(void){uchar TempCycA = 1;uint TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);}}。

超声波测距程序(详细C语言数码管显示)

超声波测距程序(详细C语言数码管显示)

超声波测距程序(详细C语言数码管显示)#include<reg52.h> //头文件#include<intrins.h>// _nop_() 函数延时1US用#include <stdio.h>#include <string.h>#define uchar unsigned char#define uint unsigned int#define nop _nop_()sbit csb=P1^0;//超声波发送端口为P1.0sbit bai=P2^2;//数码管百位sbit shi=P2^1;//数码管十位sbit ge=P2^0;//数码管个位uchar flag;//超声波接收标志float juli1;//距离变量,用来数码管显示用int juli;uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管0到9的代码int xianshi[3];void delayshow(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void ledshow(void){xianshi[0]=juli/100;xianshi[1]=((juli%100)/10);xianshi[2]=juli%10;bai=0;P0=table[xianshi[0]];delayshow(2);bai=1;delayshow(2);shi=0;P0=table[xianshi[1]];delayshow(2);shi=1;delayshow(2);ge=0;P0=table[xianshi[2]];delayshow(2);ge=1;delayshow(2);}/***************n个ms函数*******************/ void delay_nms(uint ms) //delay ms 函数{uchar i;while(ms--){for(i=0;i<123;i++);}}/************************************************ 延时100us函数***********************************************/ void delay100us(){uchar j;for(j=50;j>0;j--);}/********************************************** 发送超声波函数,实测为38KHz信号,4个这样的方波***********************************************/ void tran(){uchar i;for(i=8;i>0;i--){csb=!csb;nop;nop;nop;nop;nop;nop;nop;nop;nop;}csb=1;//关超声波发送ET0=1;EA=1;delay100us();//延时100us左右后再开中断,避免直接回来的回波//理论上可以测量的最小距离为:0.0001×344=0.0344M=3.44CMEX0=1;//打开外部中断1TR0=1;//开定时0}void main(){uchar i;delay_nms(10);//等待单片机复位TMOD=0x11;//定时器0方式1用于计时TL0=0;TH0=0;IT0=0;//中断0下降沿有效EA=1;while(1){tran();//发送超声波while(flag==0);//等待接收if(flag==1){juli1*=17.2;//计算距离,因为时间是来回的时间,声速为344M/S 除以2就为172juli1=juli1/1000;juli=(int)(juli1);flag=0;for(i=0;i<50;i++)ledshow();juli=0;}else{juli=0;//超出距离显示000for(i=0;i<10;i++)ledshow();flag=0;}}}/*超声接收程序(外中断0)*/void cs_r() interrupt 0{EX0 = 0;//关闭外部中断0,也就是超声波接收中断TR0 = 0;//关闭定时器0EA=0;juli1=TH0*256+TL0-100;//减去开始延时的100usTL0=0;//清定时0TH0=0;flag= 1;//成功接收标志置1}/*超时清除程序(定时器中断T0)*/void overtime() interrupt 1{EA=0;TL0=0;//清定时0TH0=0;EX0 = 0;//关闭定时器0的中断TR0 = 0;//关闭定时器0ET0 = 0;//关闭定时器0的中断flag= 2;//接收标志置2}。

超声波测距源程序

超声波测距源程序

#include <SST89x5x4.H>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit dp1=P2^4;sbit dp2=P2^5;sbit dp3=P2^6;sbit dp4=P2^7;sbit beeper=P3^5;sbit SquareOut=P1^0;sbit ReceiveInt=P3^3;uchar code dplib[11]={0x18,0x7B,0x2C,0x29,0x4B,0x89,0x88,0x3B,0x08,0x09,0x0EF}; uchar dpbuf[4];uchar dnt,cnt,Pn;bit dply,rcv,flag;long time;uint distance;void init();void send();void convert();void delay1ms();void delay10ms();void delay();void delayus();void main(){init();while(1){if(dply){dply=0;if(rcv){convert();}else{dpbuf[0]=dpbuf[1]=dpbuf[2]=dpbuf[3]=10;Pn=20;}}}}//void timer0(void) interrupt 1 using 2 {TH0=0xee;TL0=0x00;if(dnt>3) dnt=0;P0=dplib[dpbuf[dnt]];switch(dnt++){case 0:dp2=dp3=dp4=1;dp1=0;break;case 1:dp1=dp3=dp4=1;dp2=0;break;case 2:dp1=dp2=dp4=1;dp3=0;break;case 3:dp1=dp2=dp3=1;dp4=0;}if(cnt<100) cnt++;else{cnt=0;dply=1;TH1=TL1=0;TR1=1;if(flag==0) rcv=1;else rcv=0;beeper=0;send();beeper=1;flag=1;delay();EX1=1;}}//void exint1(void) interrupt 2 using 3 {_nop_(); //延时1usif(ReceiveInt==0){TR1=0;EX1=0;time=TH1<<8;time=time+TL1;flag=0;// while(ReceiveInt==0);}}void init(){cnt=dnt=time=distance=0;Pn=4;dply=rcv=flag=0;dpbuf[0]=10;dpbuf[1]=10;dpbuf[2]=10;dpbuf[3]=10;TMOD=0x11;TH0=0xee;TL0=0x00;TH1=0;TL1=0;PT0=0;PX1=1;ET0=1;ET1=0;EX1=0;EA=1 ;TR0=1;TR1=0;}void send(){uchar k,n;for(n=0;n<Pn;n++){SquareOut=1;for(k=5;k>0;k--);SquareOut=0;SquareOut=0;SquareOut=0;}}void convert (void){distance=(uint)(time/54)-4;Pn=4+(uchar)(distance/10);dpbuf[0]=(uchar)(distance%10);distance/=10;dpbuf[1]=(uchar)(distance%10);distance/=10;dpbuf[2]=(uchar)(distance%10);distance/=10;dpbuf[3]=(uchar)distance;}//延时xmsvoid delay1ms () //延时约1ms,经调试,延时时间受j影响很大{uint j;for(j=110;j>0;j--);}void delay(){uchar i,k;for(i=Pn;i>0;i--)for(k=50;k>0;k--);}void delayus() //延时266us,防绕射波,延时时间不能太长,否则影响死区,使死区变大{uchar i;for(i=120;i>0;i--);}void delay10ms(){uchar i,j;for(i=20;i>0;i--)for(j=248;j>0;j--);}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <intrins.h>
sbit RX = P2^1;
sbit TX = P2^0;
unsigned int time=0;
unsigned int timer=0;
unsigned char posit=0;
unsigned long S=0;
bit flag =0;
unsigned char const discode[] ={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40/*-*/};
TR0=1;//开启计数
while(RX);//当RX为1计数并等待
TR0=0;//关闭计数
Conut();//计算
}
}
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX = 0;
}
}
/*********************************************************/
{பைடு நூலகம்
TH1=0xf8;
TL1=0x30;
Display();
timer++;
if(timer>=400)
{
timer=0;
TX = 1;//800MS启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
//接线:模块TRIG接P2.0 ECH0接P2.1
//数码管显示单位:米
/***********************************************************************************************************/
#include <reg51.h>//器件配置文件
void Display(void)//扫描数码管
{
if(posit==0)
{P0=(discode[disbuff[posit]])|0x80;}
else
{P0=discode[disbuff[posit]];}
P1=positon[posit];
if(++posit>=3)
posit=0;
}
/********************************************************/
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出来是CM
if((S>=700)||flag==1) //超出测量范围显示“-”
{
flag=0;
disbuff[0]=10;//“-”
disbuff[1]=10;//“-”
unsigned char const positon[8]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};
unsigned char disbuff[4]={ 0,0,0,0,};
/********************************************************/
void main( void )
{
TMOD=0x11;//设T0为方式1,GATE=1;
TH0=0;
TL0=0;
TH1=0xf8;//2MS定时
TL1=0x30;
ET0=1; //允许T0中断
ET1=1;//允许T1中断
TR1=1;//开启定时器
EA=1;//开启总中断
while(1)
{
while(!RX);//当RX为零时等待
disbuff[2]=10;//“-”
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
}
}
/********************************************************/
void zd0() interrupt 1//T0中断用来计数器溢出,超过测距范围
{
flag=1;//中断溢出标志
}
/********************************************************/
void zd3() interrupt 3//T1中断用来扫描数码管和计800MS启动模块
/***********************************************************************************************************/
//hc-sr04超声波测距模块DEMO程序
//晶振:11。0592
//程序
//taobao店铺:创威电子
相关文档
最新文档