51单片机超声波测距程序

合集下载

51单片机超声波测距离(带温度补偿)

51单片机超声波测距离(带温度补偿)

超声波模块原理图:发射接收原理图PCB:51单片机原理图:软件部分C语言程序:/*=========================================================== =========调试要求:1.MCU:A T89S52芯片或AT89C522.晶振:12MHz调试注意:本程序带温度补偿,采用DS18B20测量温度1.LCD1602液晶屏有显示后,才接入超声波模块。

2.注意超声波模块电源的极性。

不清楚请参好淘宝的电路图3.没有选用频率为12MHz晶振,用了别的频率晶振,单片机定时器的测量值与发出的40KHz频率脉冲不对。

4.使用者经常误发出20KHZ脉冲当40KHZ脉冲。

(40KHz频率脉冲,周期25us,占空比为50% = 12.5us)5.如果是用开发板调超声波模块,请检查开发板上的电路是否与超声波模块的控制脚复用了, 若复用了,请通过跳线分开发板上的电路。

6如果使用的是万用板,请确定单片机的复位电路和晶振电路是否正常,同时单片机的31脚(EA)记得接高电平。

============================================================= =======*/#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//===============================LCD1602接口定义=====================/*-----------------------------------------------------|DB0-----P2.0 | DB4-----P2.4 | RW-------P0.1 ||DB1-----P2.1 | DB5-----P2.5 | RS-------P0.2 ||DB2-----P2.2 | DB6-----P2.6 | E--------P0.0 ||DB3-----P2.3 | DB7-----P2.7 | 注意,P0.0到P0.2需要接上拉电阻---------------------------------------------------============================================================= */#define LCM_Data P2 //数据接口#define Busy 0x80 //用于检测LCM状态字中的Busy标识sbit LCM_RW = P0^1; //读写控制输入端,LCD1602的第五脚sbit LCM_RS = P0^2; //寄存器选择输入端,LCD1602的第四脚sbit LCM_E = P0^0; //使能信号输入端,LCD1602的第6脚//===============================超声波模块定义========================sbit RemPin =P3^2;// 接收端(这个不能修改,因为是外部中断(INT0)的引脚) sbit TxPin =P3^1;// 发射端//******************************************************************** ***//ds18b20数字温度传感器控制引脚定义sbit dq_ds18b20=P3^3;//定义控制DS18B20//******************************************************************** ***//LCD显示模块的函数声明void WriteDataLCM (uchar WDLCM);//LCD模块写数据void WriteCommandLCM (uchar WCLCM,BuysC); //LCD模块写指令uchar ReadDataLCM (void);//LCD模块读数据uchar ReadStatusLCM (void);//读LCD模块的忙标void DisplayOneChar (uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符void DisplayListChar (uchar X,uchar Y,uchar delayms,uchar code *DData); void DisplayCursorPos (uchar X, uchar Y);void LCMInit (void);void DisplayIntData (uchar X, uchar Y,int ZhengShu,uchar Digit,uchar XiaoShu);void DisplayCharData (uchar X, uchar Y,uchar ZiFu);//******************************************************************** **//延时函数声明void delay25us_40KHz(unsigned char us);void DelayUs(uint us);void DelayMs(uint Ms);void delay_3us();//3US的延时程序void delay_8us(unsigned int t);//8US延时基准程序void delay_50us(unsigned int t);//延时50*T微妙函数的声明//******************************************************************** ***//DS18B20测温函数定义void w_1byte_ds18b20(uchar value);//向DS18B20写一个字节uchar r_1byte_ds18b20(void);//从DS18B20读取一个字节的数据void rest_ds18b20(void);//DS18B20复位程序void readtemp_ds18b20(void);//读取温度void display_temp(void);//温度显示程序//******************************************************************** ***//参数定义uint length = 0; // 测距的长度0.00Muchar flag = 0; // 测距的标志有信号接收=1uchar templ,temph;uint speed;//根据温度计算出来的声音速度uchar t_b,t_s,t_g,t_x;//从左到右分别存储温度百位,十位,个位,小数位uchar flag1;//温度正负性暂存,1为正数,0为负数const unsigned char tabl3[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x0 8,0x09,0x09};/*=========================================================== ================主程序============================================================= ================*/void main(void){uchar i;LCMInit(); //1602初始化EX0 = 1; //允许总中断中断,使能INT0 外部中断ET0 = 1;TMOD=0x11; //设定T0为16位时器,设定T1为16位时器DisplayOneChar( 0,14,'m');DisplayListChar(0,0,0, "Distanc: "); //显示字符串while(1){readtemp_ds18b20();display_temp();//显示温度for(i=0;i<20;i++){DisplayIntData(0, 13,length,5,3);//显示测量距离TH0=0x00;TL0=0x00;TR0=1; //启动定时器0EA = 1; //允许所有中断delay25us_40KHz(15); //发出脉冲信号DelayMs(200);}}}//******************************************************************** ***********//温度显示函数void display_temp(){if(flag1==1)//温度为正数时的显示程序{DisplayOneChar( 1,2,'+');}else{DisplayOneChar( 1,2,'-');}//显示温度信息DisplayOneChar( 1,0,'T');DisplayOneChar( 1,1,':');DisplayOneChar( 1,3,t_s+0x30);DisplayOneChar( 1,4,t_g+0x30);DisplayOneChar( 1,5,'.');DisplayOneChar( 1,6,t_x+0x30);//显示速度信息DisplayOneChar( 1,8,'S');DisplayOneChar( 1,9,':');DisplayOneChar( 1,10,speed/100%10+0x30);DisplayOneChar( 1,11,speed/10%10+0x30);DisplayOneChar( 1,12,speed%10+0x30);DisplayOneChar( 1,13,'M');DisplayOneChar( 1,14,'/');DisplayOneChar( 1,15,'S');}//****************************************************//读取温度void readtemp_ds18b20(void){uchar temp32;rest_ds18b20();w_1byte_ds18b20(0xcc); //跳过读序列号的操作w_1byte_ds18b20(0x44); //启动温度转换delay_8us(2);rest_ds18b20();w_1byte_ds18b20(0xcc); //跳过读序列号的操作w_1byte_ds18b20(0xbe); //读取温度寄存器等(共可读9个寄存器)前两个就是温度templ=r_1byte_ds18b20();temph=r_1byte_ds18b20();if((temph&0xf0))//判断温度的正负性{flag1=0;temph=-temph;templ=-templ;t_x=tabl3[templ & 0x0f];//计算温度的小数temp32=temph & 0x0f;temp32<<=4;templ>>=4;temp32=temp32 | templ;t_b=temp32/100%10;//计算温度的百位数据t_s=temp32/10%10;//计算温度的十位数据t_g=temp32%10;//计算温度的个位数据speed=331.4-0.607*(temp32 | templ);}else//为正数{t_x=tabl3[templ & 0x0f];//计算温度的小数temp32=temph & 0x0f;temp32<<=4;templ>>=4;temp32=temp32 | templ;t_b=temp32/100%10;//计算温度的百位数据t_s=temp32/10%10;//计算温度的十位数据t_g=temp32%10;//计算温度的个位数据flag1=1;speed=311.4+0.607*(temp32 | templ);}}/*=========================================================== =========功能:在1602显示一个整数数据说明:显示一个整数数据-9999->32625. 从右至左显示数据5位:============================================================= =========*/void DisplayIntData(uchar X, uchar Y,int ZhengShu,uchar Digit,uchar XiaoShu) {uchar i=0,k=0, BCD[5]={0};if(Digit>5) Digit=5;if(ZhengShu<0){k=1;//负数示志位ZhengShu=-ZhengShu;}BCD[4] =ZhengShu / 10000; //求出万位数据ZhengShu = ZhengShu % 10000;BCD[3] =ZhengShu / 1000; //求出千位数据ZhengShu = ZhengShu % 1000;BCD[2] =ZhengShu / 100; //求出百位数据ZhengShu = ZhengShu % 100;BCD[1] =ZhengShu / 10; //求出十位数据BCD[0] =ZhengShu % 10; //求出个位数据for(i=0;i<Digit;i++)//输出显示的数值{if((i==XiaoShu)&&(0!=XiaoShu)){DisplayOneChar(X,Y-i,'.');//输出小数点Y= Y-1;}DisplayOneChar(X,Y-i,BCD[i]+0x30); //显示一个字符}if(k==1)DisplayOneChar(X,Y-1,'-');//输出负符}//****************************************************************//读一个字节uchar r_1byte_ds18b20(void){uchar i=0;uchar value= 0;for (i=0;i<8;i++){value>>=1;dq_ds18b20=0;// DQ_L;delay_3us();dq_ds18b20=1; //DQ_H;delay_8us(2);if(dq_ds18b20==1) value|=0x80;delay_8us(6); //延时40us}dq_ds18b20=1;return value;}//******************************************************************** ***********//子程序功能:向DS18B20写一字节的数据void w_1byte_ds18b20(uchar value){uchar i=0;for(i=0;i<8;i++){dq_ds18b20=1;delay_3us();dq_ds18b20=0;delay_8us(2);if (value& 0x01) dq_ds18b20=1; //DQ = 1delay_50us(1); //延时50us 以上delay_8us(2);value>>=1;}dq_ds18b20=1; //DQ = 1}//;**************************************************//ds18b20复位子程序void rest_ds18b20(void){rest:delay_3us(); //稍做延时delay_3us();dq_ds18b20=1;delay_3us();dq_ds18b20=0;// DQ_L;delay_50us(11);//480us<T<960usdq_ds18b20=1;//拉高总线delay_8us(5);if(dq_ds18b20==1){return;}delay_50us(2); //延时90usif(dq_ds18b20==1){return;}else{goto rest;}}//==============================超声波模块测试子程序================================================/*=========================================================== =========注意:是用12MHz晶振设定延时时间:x*25us 与产生40KHZ的脉冲============================================================= =======*/void delay25us_40KHz(unsigned char us){while(us--){TxPin = 0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();TxPin = 1;_nop_();_nop_();_nop_();_nop_();}TxPin = 1;}/*=========================================================== ==================中断程序的入口(注意:接收与发射的电平是相反的)============================================================= ==================*/void init0int() interrupt 0{uint timer_us = 0;TR0=0; //关闭定时器0timer_us =TH0*256+TL0;if(timer_us>190)timer_us=timer_us-180; //修正测距的距离if(timer_us<=735){timer_us=timer_us-96;//二次修正}if(timer_us>5059){timer_us+=29;}if(timer_us>5470){timer_us+=29;}if(timer_us>6410){timer_us+=29;}if(timer_us>7410){timer_us+=29;}if(timer_us>8410){timer_us+=29;}if(timer_us>9410){timer_us+=29;}if(timer_us>10410){timer_us+=29;}length = ((unsigned long)(speed)*timer_us)/2000;//计算长度,是扩大100倍flag = 0;EA = 0; //禁止所有中断}/*=========================================================== =========功能:在1602显示一个字符数据说明:显示一个字符数据0~256. 从左至右显示数据3位============================================================= =========*/void DisplayCharData(uchar X, uchar Y,uchar ZiFu){uchar i=0;uchar V alueBCD[3];V alueBCD[0] = ZiFu / 100; //求出百位数据ZiFu = ZiFu % 100;V alueBCD[1] = ZiFu / 10; //求出十位数据V alueBCD[2] = ZiFu % 10; //求出个位数据for(i=0;i<3;i++)//输出显示的数值{DisplayOneChar(X,Y+i,V alueBCD[i]+0x30); //显示一个字符}}/*=========================================================== ================超出测量时间============================================================= ================*/void timer0int (void) interrupt 1{TR0=0; //关闭定时器0length = 0; //超出测量时间显示示0flag = 1; //EA = 0; //禁止所有中断}/*=========================================================== ===========LCM初始化============================================================= =========*/void LCMInit(void){LCM_Data = 0;WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号DelayMs(5);WriteCommandLCM(0x38,0);DelayMs(5);WriteCommandLCM(0x38,0);DelayMs(5);WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1); //关闭显示WriteCommandLCM(0x01,1); //显示清屏WriteCommandLCM(0x06,1); // 显示光标移动设置WriteCommandLCM(0x0C,1); // 显示开及光标设置DelayMs(100);}/*=========================================================== =========显示光标的位置============================================================= =======*/void DisplayCursorPos( unsigned char X, unsigned char Y){X &= 0x1;Y &= 0xF; //限制Y不能大于15,X不能大于1if (X) Y |= 0x40; //当要显示第二行时地址码+0x40;Y |= 0x80; // 算出指令码WriteCommandLCM(Y, 1); //这里不检测忙信号,发送地址码}/*=========================================================== =========按指定位置显示一串字符:第X 行,第y列注意:字符串不能长于16个字符============================================================= =========*/void DisplayListChar(uchar X,uchar Y,uchar delayms, uchar code *DData){unsigned char ListLength;ListLength = 0;X &= 0x1;Y &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]!='\0') //若到达字串尾则退出{if (Y <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;Y++;DelayMs(delayms);//延时显示字符串}elsebreak;//跳出循环体}}/*=========================================================== =========设定延时时间:x*1us============================================================= =======*/void DelayUs(uint us){while(us--);}/*=========================================================== =========设定延时时间:x*1ms============================================================= =======*/void DelayMs(uint Ms){uint i,TempCyc;for(i=0;i<Ms;i++){TempCyc = 250;while(TempCyc--);}}//==============================LCD1602显示子程序================================================/*=========================================================== ==========写数据函数: E =高脉冲RS=1 RW=0============================================================= =========*/void WriteDataLCM(unsigned char WDLCM){ReadStatusLCM(); //检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E = 0; //若晶振速度太高可以在这后加小的延时LCM_E = 0; //延时LCM_E = 1;}/*=========================================================== =========写指令函数: E=高脉冲RS=0 RW=0============================================================= =========*/void WriteCommandLCM(unsigned char 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;}/*=========================================================== =========//读数据============================================================= =========*/unsigned char ReadDataLCM(void){LCM_RS = 1;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;return(LCM_Data);}/*=========================================================== =========正常读写操作之前必须检测LCD控制器状态:E=1 RS=0 RW=1;DB7: 0 LCD控制器空闲,1 LCD控制器忙。

51单片机超声波测距

51单片机超声波测距

flag=0; TR0=0; TH0=0; TL0=0; IE0=0; }
//重置 flag 变量 //停止计数 //定时器重装初值(高八位) //定时器重装初值(低八位) //外中断 0 请求标志清零
Байду номын сангаас
void send() { fa=0;delay_3();_nop_();fa=1;delay_3(); fa=0;delay_3();_nop_();fa=1;delay_3(); fa=0;delay_3();_nop_();fa=1;delay_3(); TH0=0;TL0=0;//定时器装初值 TR0=1; //发送完后启动定时器 EX0=1; //外部中断允许位 IE0=0; //中断标志位清零 EA=1; //开启总中断 } void Display() { uint i; A[10]=Number[temp_B/1000]; A[11]=Number[temp_B/100%10]; A[12]=Number[temp_B%10]; write_cmd(0x90); for(i=0;i<16;i++) { write_dat(A[i]); } } void main() { init_time(); LCD_INIT(); while(1) { send(); // // // // // while(flag==0) { Display(); temp_C++; //当没执行中断时,flag=0,执行下面的语句
51 单片机超声波测距程序
#include<reg52.h> #include<intrins.h> #include"LCD12864Driver.h" #define unchar unsigned char #define unint unsigned int #define unlong unsigned long uchar A[]={"超声波测距 CM"}; uchar Number[]={"0123456789"}; sbit fa=P1^0; sbit di=P3^2; //位申明

基于51单片机控制的超声波测距程序

基于51单片机控制的超声波测距程序
sj2=40;
s=sj2;
}
void k3cl()
{
sj3=sj3+10;
if(sj3> 500)
sj3=100;
sj1-1;
sx1=sx1/csbc;
mqs=sx1/4.5;
}
void offmsd()
{
if (buffer[0] == 0x3f)
buffer[0] = 0x00;
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];
void delay(j);//延时函数
void scanLED();//显示函数
void timeToBuffer();//显示转换函数
void keyscan();
void k1cl();
void k2cl();
void k3cl();
void k4cl();
void offmsd();
void main()//主函数
}
{
csbds=0;
cl=1;
}
}
void csbcj()
{
if(cl==1)
{
TR1=0;
TH0=0x00;
TL0=0x00;
i=10;
while(i--)
{
csbout=!csbout;

基于51单片机的超声波测距系统的毕业设计

基于51单片机的超声波测距系统的毕业设计

基于51单片机的超声波测距系统的毕业设计超声波测距系统是一种常见的非接触式测距技术,通过发送超声波信号并测量信号的回波时间来计算距离。

本文将介绍基于51单片机的超声波测距系统的毕业设计。

首先,我们需要明确设计的目标。

本设计旨在通过51单片机实现一个精确、稳定的超声波测距系统。

具体而言,我们需要实现以下功能:1.发送超声波信号:通过51单片机的IO口控制超声波发射器,发送一定频率和波形的超声波信号。

2.接收回波信号:通过51单片机的IO口连接超声波接收器,接收并放大返回的超声波信号。

3.信号处理:根据回波信号的时间延迟计算出距离,并在显示器上显示出来。

4.稳定性和精确性:设计系统时需考虑测量过程中误差的影响,并通过合适的算法和校准方法提高系统的稳定性和精确性。

接下来,我们需要选择合适的硬件和软件配合51单片机实现上述功能。

硬件方面:1.51单片机:选择一款性能稳定、易于编程的51单片机,如STC89C522.超声波模块:选择一款合适的超声波传感器模块,常见的有HC-SR04、JSN-SR04T等。

模块一般包括发射器和接收器,具有较好的测距性能。

3.显示设备:选择合适的显示设备,如7段LED数码管或LCD显示屏,用于显示测距结果。

软件方面:1.C语言编程:使用C语言编写51单片机的程序,实现超声波测距系统的各项功能。

2.串口通信:通过串口与上位机进行通信,可以对系统进行监控和远程控制。

3.算法设计:选择合适的算法计算超声波回波时间延迟,并根据时间延迟计算距离值。

在设计过程中,我们需要进行以下步骤:1.硬件连接:按照超声波模块的说明书,将模块的发射器和接收器通过杜邦线与51单片机的IO口连接。

2.软件编程:使用C语言编写51单片机的程序,实现超声波模块的控制、信号接收和处理、距离计算等功能。

3.系统测试:进行系统的功能测试和性能测试,验证系统的可靠性和准确性,同时调试系统中出现的问题。

4.系统优化:根据测试结果,对系统进行优化,提高系统的稳定性和精确性。

超声波测距 51单片机 LCD12864显示

超声波测距 51单片机 LCD12864显示
}
if(flag==0)
{
led =1;
delay(200); //测试灯变化
}
}
}
#include <reg52.h> //包括一个52标准内核的头文件
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
#define LCD_data P0
uchar code dis3[]={"距离:"};
uchar code dis4[]={"单位:mm"};
uchar code dis5[]={"危险!!"};
uchar code dis6[]={"安全"};
void delay(uint z)
{ uchar i,j ;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void write_cmd(uchar cmd)
{
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
P0=cmd;
delay(1);
LCD_EN=1;
delay(1);
LCD_EN=0;
}
void write_dat(uchar dat)
timer1() interrupt 3 // 定时器0中断是1号
{
TH1=0;
TL1=0;
}
void display()

(完整word版)用51单片机实现HC-SR04超声波测距程序(word文档良心出品)

(完整word版)用51单片机实现HC-SR04超声波测距程序(word文档良心出品)

#include <reg52.h> //包括一个52标准内核的头文件#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned longsbit Trig = P1^0; //产生脉冲引脚sbit Echo = P3^2; //回波引脚sbit test = P1^1; //测试用引脚uchar code SEG7[10]={~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x90};//数码管0-9uint distance[4]; //测距接收缓冲区uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定义寄存器bit succeed_flag; //测量成功标志//********函数声明void conversion(uint temp_data);void delay_20us();void main(void) // 主程序{uint distance_data,a,b;uchar CONT_1;i=0;flag=0;test =0;Trig=0; //首先拉低脉冲输入引脚TMOD=0x11; //定时器0,定时器1,16位工作方式TR0=1; //启动定时器0IT0=0; //由高电平变低电平,触发外部中断ET0=1; //打开定时器0中断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(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现)TR1=0; //关闭定时器1EX0=0; //关闭外部中断if(succeed_flag==1){distance_data=outcomeH*256+outcomeL;distance_data= (distance_data*1.87)/100;} //为什么除以58等于厘米,Y米=(X 秒*344)/2// X秒=(2*Y米)/344 ==》X 秒=0.0058*Y米==》厘米=微秒/58if(succeed_flag==0){distance_data=0; //没有回波则清零test = !test; //测试灯变化}/********************************************每循环3次就显示结果一次*********************************************/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);}}}//***************************************************************//外部中断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=0xfe;flag++;break;case 0x01:P0=shi;P2=0xfd;flag++;break;case 0x02:P0=bai;P2=0xfb;flag=0;break;}}//显示数据转换程序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];ge_data =SEG7[ge_data];EA=0; //显示数据的时候不要测量bai = bai_data;shi = shi_data;ge = ge_data ;EA=1;}//****************************************************************** void delay_20us(){ uchar bt ;for(bt=0;bt<100;bt++);}。

基于51单片机超声波测距报警系统课程设计

基于51单片机超声波测距报警系统课程设计

基于51单片机超声波测距报警系统课程设计一、引言超声波测距技术是一种常见的非接触式测距技术,具有测距范围广、精度高等优点。

在日常生活中,超声波测距技术被广泛应用于车辆倒车雷达、智能家居中的人体感应等领域。

本文将介绍基于51单片机的超声波测距报警系统的课程设计。

二、设计思路本课程设计主要分为硬件设计和软件设计两部分。

硬件部分主要包括超声波模块、LCD显示屏、蜂鸣器等模块的连接和电路设计;软件部分主要包括51单片机程序设计及LCD显示程序编写。

三、硬件设计1. 超声波模块连接超声波模块是实现测距功能的核心部件。

在本课程设计中,我们采用HC-SR04型号的超声波模块。

该模块需要连接到51单片机上,具体连接方式如下:- 将VCC引脚连接到51单片机上的5V电源;- 将GND引脚连接到51单片机上的GND;- 将Trig引脚连接到P2.0口;- 将Echo引脚连接到P2.1口。

2. LCD显示屏连接LCD显示屏用于显示测距结果和报警信息。

在本课程设计中,我们采用1602型号的LCD显示屏。

该模块需要连接到51单片机上,具体连接方式如下:- 将VSS引脚连接到51单片机上的GND;- 将VDD引脚连接到51单片机上的5V电源;- 将VO引脚连接到一个10K电位器,再将电位器两端分别接到GND 和5V电源;- 将RS引脚连接到P1.0口;- 将RW引脚连接到P1.1口;- 将EN引脚连接到P1.2口;- 将D4-D7引脚分别连接到P0口的高四位。

3. 蜂鸣器连接蜂鸣器用于报警。

在本课程设计中,我们采用被动式蜂鸣器。

该模块需要连接到51单片机上,具体连接方式如下:- 将正极引脚(一般为长针)连接到51单片机上的P3.7口;- 将负极引脚(一般为短针)连接到51单片机上的GND。

四、软件设计1. 51单片机程序设计在本课程设计中,我们采用Keil C51作为编程工具,使用C语言编写程序。

主要程序流程如下:- 定义超声波模块的Trig和Echo引脚;- 定义LCD显示屏的RS、RW、EN和D4-D7引脚;- 定义蜂鸣器的引脚;- 定义变量存储测距结果和报警状态;- 初始化LCD显示屏、超声波模块等模块;- 循环执行以下操作:- 发送超声波信号并计算回波时间,从而得到距离值;- 根据距离值判断是否需要报警,并控制蜂鸣器发出报警声音;- 将测距结果和报警状态显示在LCD显示屏上。

基于51单片机的超声波测距仪设计.

基于51单片机的超声波测距仪设计.

江苏经贸职业技术学院毕业设计(论文)单片机的超声波测距仪设计基于题目:MCS51) 信息技术学院系 (院12应用电子专业班级1227031128 号学学生姓名万小伟董李江职校内导师称老师职夏国平企业导师称工程师职企业导师潘仕美称研究生5年2015月日12基于MCS51单片机的超声波测距仪设计摘要:伴随着社会的发展,人们的生活质量不断地提高,各个的城市不断地在发展,当然城市的排水系统得到了很大的发展和改进,由于很多的原因和很多的因素,每个城市的排水系统,现在的城市的发展和建设往往忽略一些重要的项目那就是排水系统。

所以好多的城市经常出现开挖已经建设好的建筑和工程设施来改进排水系统因此他们忽视到这个问题的严重性。

因此,我的论文设计是采用以AT89C51单片机为核心的高精度、微型化数字显示超声波测距仪的硬件电路和软件设计方法它还有一个重要的指标那就是低成本一种的设计方法。

通过一系列的实验反馈,这个软件设计的非常的合理、低成本、实时性良好,经过开发和研究,因此在许多的方面得到很多的发展和有效的解决一些重要的问题比如在汽车的倒车,建筑的工地上,还有一些重要的工业现场的重要的位置等等。

关键词:超声波测距仪AT89C51The design of ultrasonic range finder based onMCS51Abstract:With the development of science and technology, the improvement of people'sstandard of living, speeding up the development and construction of the city. urban drainagesystem have greatly developed their situation is constantly improving. control system Freesewage culvert clear guarantee robot, the robot is designed to clear the culvert sewage to thecore.At the core of the design using AT89C51 low-cost, high accuracy, Micro figures show that theultrasonic range finder hardware and software design methods. signal processing, and theultrasonic range finder function. On the basis of the overall system design, hardware andsoftware by the end of each module.Keywords: Silent Wave Measure Distance AT89S52目录第一章绪论 ................................................ - 1 -1.1课题设计的目的和意义 (1)1.2超声波测距仪设计思路 (1)1.2.1超声波测距原理及方案论证 (1)1.2.2超声波测距仪原理框图 (2)第二章课程的方案设计 ...................................... - 3 -2.1系统整体方案的设计 (3)第三章 51系列单片机的功能特点及测距原理 ................... - 3 -3.1基于51系列单片机的功能特点 (3)3.2单片机实现测距原理 (4)3.3超声波测距原理和结构 (5)3.4超声波检测发射电路 (5)3.5超声波检测接受电路 (5)第四章系统的软硬件的调试和程序图 .......................... - 6 -总结 ..................................................... - 10 -致谢 ..................................................... - 10 -参考文献 .................................................. - 11 -第一章绪论1.1课题设计的目的和意义论文设计目的;随着社会的不断地发展,电子测量技术得到了长远的展,超声波的精准测量得到了科技人员的重视和研究。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//超声波测距,测距范围2cm-400cm; #include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit 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);
dula=1;
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;
wela=0;
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;
}
}
/*主函数*/
void main()
{
initime0();
test=0;
trig=0;
EA=1;
while(1)
{
diaoyong();
display(distance);
}
}。

相关文档
最新文档