自己动手亲自做超声波测距仪.doc_第1页
自己动手亲自做超声波测距仪.doc_第2页
自己动手亲自做超声波测距仪.doc_第3页
自己动手亲自做超声波测距仪.doc_第4页
自己动手亲自做超声波测距仪.doc_第5页
免费预览已结束,剩余52页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

超声波测距仪一、电子模块准备51单片机最小系统板程序下载器1602液晶显示屏电位器(050欧姆)18B20温度传感器HC-SR04超声波传感器排针、杜邦线5V电源图1-1(全家福)1、1602液晶显示屏图1-2(1602液晶显示屏)在日常生活中,液晶显示屏已成为很多电子产品的必备器件,如在计算器、万用表、电子表等很多家用电子产品中都可以看到。它的功能主要是显示数字、专用符号和图形。从图1-2中我们可以看到,1602液晶显示屏一共有16个引脚,其各个引脚的功能分别如下:第1脚:VSS接地第2脚:VDD接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令第714脚:D0D7为8位双向数据线第15脚:背光电源正极第16脚:背光电源负极2、超声波传感器HC-SR04图1-3(超声波传感器HC-SR04)VCC:接5V正电源GND:接地Trig:超声波信号发射端口Echo:超声波信号接收端口3、温度传感器18B20图1-4(温度传感器18B20)右边:电源端,接5V正电源左边:接地端中间:数据端,为温度信息I/O口4、51单片机最小系统板图1-5(51单片机最小系统板)5、电位器(050欧姆)图1-6(电位器)相当于一个滑动变阻器,在本实验中用来控制液晶屏的对比度6、程序下载器图1-7(程序下载器)5V:接电源GND:接地TXD:接单片机3.0口RXD:接单片机3.1口7、杜邦线图1-8(杜邦线)8、电源图1-9(电源)9、排针图1-10(排针) 上述器件建议上淘宝店购买,店名为西安盛华的比较齐全,研发实力比较强。二、设计步骤1、准备工作 在18B20温度传感器、电位器的引脚上焊接排针:图2-1(焊接排针后的温度传感器)图2-2(焊接排针后的电位器)因为有多个器件(如液晶显示屏、温度传感器、超声波传感器、电位器)都需要接电源或接地,而51单片机最小系统板上的接口有限,所以我们还需要自制一个多引脚的杜邦线:图2-3(自制多引脚杜邦线) 图2-4(细节展示)步骤:先取一个3根的杜邦线排,然后将其中两根杜邦线分别扩展成三分口和两分口(图2-4),还剩的一根杜邦线不做变化,完成后效果如图2-32、程序下载需要事先安装软件STC_ISP_V479d l 首先打开软件图2-5(双击图标打开下载软件)l 点击打开文件图2-6(点击打开文件)l 选中我们所要下载的程序,点击打开。注意,所选择程序的扩展名必须为.hex图2-7(选择文件)l 将程序下载器与单片机最小系统板的对应端口连接图2-8(连接下载器)图2-9(连接Vcc和GND)图2-10(连接TXD和RXD)l 连接电脑图2-11(连接电脑)l 下载程序图2-12(点击下载)l 单片机在烧写程序时,需要一个上电操作,所以我们在下载程序的过程中,先把一根电源线断开,然后再插回去,如图2-13、图2-14图2-13(拔下电源线)图2-14(再插回电源线)l 程序下载完成图2-15(程序下载完成)3、硬件连接l 用8根杜邦线依次连接液晶屏的D0D7管脚,然后再将这8根杜邦线的另一端对应连接到单片机的P1口上(D0接P1.0、D1接P1.1,D2接P1.2,D3接P1.3,D4接P1.4,D5接P1.5,D6接P1.6,D7接P1.7)图2-16(杜邦线连液晶)图2-17(杜邦线连P1口)图2-18(D0D7与P1口连接完成)l 把液晶屏的RS、RW、E管脚与单片机相连,(RS接P2.0、RW接P2.1、E接P2.2)图2-19(杜邦线连液晶)图2-20(杜邦线连P2相应口)图2-21(RS、RW、E与P2相应口连接完成)l 液晶屏的VSS、VDD管脚对应连接到单片机最小系统板上图2-21(杜邦线连液晶)图2-22(杜邦线连单片机)l 连接超声波传感器图2-23(杜邦线连接超声波传感器的VCC、GND)图2-24(再用2根杜邦线连接超声波传感器的Trig、Echo)图2-25(电源端相连VCC接VCC、GND接GND)图2-26(Trig接P3.2、Echo接P3.3)图2-27(超声波传感器连接完成)l 连接电位器图2-28(杜邦线连接电位器中间管脚)图2-29(杜邦线连接液晶屏V0口)图2-30l 连接温度传感器图2-31(用自制的杜邦线连接温度传感器)图2-32(右侧电源端接两分口的杜邦线、中间数据端接单独的杜邦线、左侧地端接三分口的杜邦线)图2-33(两分口的杜邦线,其中一个口接单片机的VCC)图2-34(两分口的杜邦线,另外一个口接液晶屏的A端)图2-35(把中间数据端接在单片机的P2.3口)图2-36(三分口的杜邦线,其中一个口接单片机的GND)图2-37(三分口的杜邦线,其中一个口接液晶屏的K端)图2-38(三分口的杜邦线,剩余一个口接电位器)l 硬件电路连接完成图2-39(完成)4、效果展示l 单片机5V供电图2-40(插上电源,打开开关)l 实时测距图2-41(距离43.1厘米,温度21.9)图2-42(距离12.4厘米,温度21.9)图2-43(距离3.9厘米,温度21.7)三、程序分析#include#define uchar unsigned char#define uint unsigned int#define ulong unsigned intuchar table0 = DIS:000.0 cm ; /距离uchar table1 = Tem:000.0 C ; /温度uchar num;uchar flag=0;sbit Trig = P32;/超声波传感器Trig管脚定义为P32口,为超声波信号发送端sbit Echo = P33;/超声波传感器Echo管脚定义为P33口,为超声波信号接收端sfr WDT=0xe1;/看门狗sbit DS=P23;/温度传感器18B20中间的管脚,为信号I/O口sbit rs=P20;/寄存器选择位,将液晶1602的RS管脚定义为P2.0口sbit rw=P21;/读写选择位,将液晶1602的RW管脚定义为P2.1口sbit en=P22;/使能信号位,将液晶1602的E管脚定义为P2.2口sbit BF=P07;/忙碌标志位 ,将BF定义为P0.7引脚void lcd_init(void); /lcd初始化函数void write_com(uchar com); / lcd写命令函数void write_data(uchar date); / lcd写数据函数void display(void); /显示函数void screen(void); /显示table0和table1void frame(void); /显示string1和string2void delay(uint count); /延时子函数void delay_10us(void); /延时子函数void dsreset(void); /温度传感器18b20初始化bit tmpreadbit(void) ; /读一位数据uchar tmpread(void); /读一字节数据 void tmpwritebyte(uchar dat);/写数据void tmpchange(void);/开始数据转换 uint tmp(void);/开始读取寄存器中的温度 void initModule(void); void delay_20us(void);void StartModule(void);ulong averageDistance(void);uint write_distance(void);void StartModule() /超声波传感器发送一次声波信号 Trig = 1; delay_20us(); Trig = 0;void delay_20us() /延时uchar a, b, c;for (a=0; a1; a+);for (b=0; b1; b+);for (c=0; c8; c+);void initModule() /将计数器T1清零TH1 = 0x00;TL1 = 0x00; void lcd_init() TMOD=0x91; /10010001,T1方式字段GATE位为1,即T1的工作受TR1和P33控制,T0只由TR0控制。TH0/1与TL0/1构成十六位计数容器 TH0=(65536-800)/256; /给计数器T0赋初值 TL0=(65536-800)/256; EA=1; /开总中断 ET0=1; /开T0的中断 TR0=1; /T0开始工作 write_com(0x38); /调用void write_com()子函数,并带入对应参数 write_com(0x0c); write_com(0x06); write_com(0x80);void screen(void) /读取要显示的数据 for(num = 0;num 4;num+) write_data(table0num); void display(void)/显示子函数screen(); /读取要显示的数据 write_com(0x80 + 0x04); /写指令,操作液晶显示 for(num = 4;num 0) i-; count-; void delay_10us() /10us延时函数 uchar i; i-; i-; i-; i-; i-; i-;void intT0(void) interrupt 1 /给T0赋初值 TH0=(65536-800)/256; TL0=(65536-800)%256;void dsreset(void) /18B20温度传感器复位,初始化函数 uint i; DS=0; i=103; while(i0)i-; DS=1; i=4; while(i0)i-;bit tmpreadbit(void) /读1位数据函数 uint i; bit dat; DS=0;i+; /i+ for delay DS=1;i+;i+; dat=DS; i=8;while(i0)i-; return (dat);uchar tmpread(void) /读1字节函数 uchar i,j,dat; dat=0; for(i=1;i=8;i+) j=tmpreadbit(); /读1位数据函数赋给j dat=(j1); /读出的数据最低位在最前面,这样刚好一个字节在DAT里 return(dat);void tmpwritebyte(uchar dat) /向液晶18b20写一个字节数据函数 uint i; uchar j; bit testb; for(j=1;j1; if(testb) /write 1 DS=0; i+;i+; DS=1; i=8;while(i0)i-; else DS=0; /write 0 i=8;while(i0)i-; DS=1; i+;i+; void tmpchange(void) /液晶18B20开始获取数据并转换 dsreset(); /温度传感器初始化 delay(1); tmpwritebyte(0xcc); /写跳过读ROM指令 tmpwritebyte(0x44); /写温度转换指令 uint tmp() /读取寄存器中存储的温度数据 float tt; uint temp; uchar a,b,c; dsreset(); /温度传感器初始化 delay(1); tmpwritebyte(0xcc); /向1820写一个字节数据函数 tmpwritebyte(0xbe); a=tmpread(); /读低8位 b=tmpread(); /读高8位 temp=b; temp11; if(c=31) flag=1; /最后在显示子函数中要判断flag的值 temp=temp&2047; tt=temp*0.0625; /温度在寄存器中是12位,分辨率是0.0625 temp=tt*10+0.5; /乘10表示小数点后只取1位,加0.5是四折五入 return temp; void main(void) /主函数(程序从这里开始)uchar A0,A1,A2,A3,A2t,a; /定义变量为无符号字符型,分配内存空间 uint temp1,Dis; /定义变量为无符号整型,分配内存空间a=0; WDT=0x25; /看门狗,防止死循环lcd_init(); /开中断,赋初值,写指令(设置定时器0)write_com(0x01); /给液晶显示模块写指令Trig = 0; /首先拉低超声波传感器Trig管脚EX1 = 1; /启用P33口接收中断信号,即为接收Echo信号while(1)initModule(); /将计数器T1清零StartModule(); /超声波传感器发送一次声波信号delay_20us(); /延时,避免声波由发射端发出后,直接被接收端捕获,得到错误的距离信息TR1 = 1; /T1开始计时while(!Echo); /检测是否收到回波信号while(Echo); /收到回波信号TR1 = 0; /T1停止计时Dis=(TH1 * 256 + TL1)/6; /由T1记下的时间差,计算理想距离tmpchange(); /开始获取温度数据并转换temp1=tmp(); /寄存器中转换后的温度值赋给temp1A0=temp1/1000%10; /温度千位A1=temp1/100%10; /温度百位 A2t=temp1%100; /温度十位和个位 A2=A2t/10%10; /温度十位 A3=A2t%10; /温度个位temp1/=10; /temp1除以10再赋回给temp1Dis=Dis+temp1*Dis/400000; /通过温度校正距离table14=A0+0x30; /table1表示温度table15=A1+0x30;table16=A2+0x30;table18=A3+0x30;A0=Dis/1000%10; /距离千位A1=Dis/100%10; /距离百位 A2t=Dis%100; /距离十位和个位 A2=A2t/10%10; /距离十位 A3=A2t%10; /距离个位table04=A0+0x30;/table0表示距离table05=A1+0x30;table06=A2+0x30;table08=A3+0x30; display(); WDT=0x35; /调用显示子函数,写入距离、温度的值 /WDT看门狗,防止死循环四、思考题1、加入报警功能,使得当超声波传感器超出量程时,蜂鸣器报警。2、液晶1602显示距离信息的同时,也显示温度数据。3、改变液晶屏上距离、温度信息显示的位置,使得它们空2格后再显示。参考答案:第1题:#include#define uchar unsigned char#define uint unsigned int#define ulong unsigned intuchar table0 = DIS:000.0 cm ; /距离uchar table1 = Tem:000.0 C ; /温度uchar num;uchar flag=0;sbit Trig = P32;/超声波传感器Trig管脚定义为P32口,为超声波信号发送端sbit Echo = P33;/超声波传感器Echo管脚定义为P33口,为超声波信号接收端sfr WDT=0xe1;/看门狗sbit DS=P23;/温度传感器18B20中间的管脚,为信号I/O口sbit rs=P20;/寄存器选择位,将液晶1602的RS管脚定义为P2.0口sbit rw=P21;/读写选择位,将液晶1602的RW管脚定义为P2.1口sbit en=P22;/使能信号位,将液晶1602的E管脚定义为P2.2口sbit BF=P07;/忙碌标志位 ,将BF定义为P0.7引脚sbit alarm=P37; /报警引脚void lcd_init(void); /lcd初始化函数void write_com(uchar com); / lcd写命令函数void write_data(uchar date); / lcd写数据函数void display(void); /显示函数void screen(void); /显示table0和table1void frame(void); /显示string1和string2void delay(uint count); /延时子函数void delay_10us(void); /延时子函数void dsreset(void); /温度传感器18b20初始化bit tmpreadbit(void) ; /读一位数据uchar tmpread(void); /读一字节数据 void tmpwritebyte(uchar dat);/写数据void tmpchange(void);/开始数据转换 uint tmp(void);/开始读取寄存器中的温度 void initModule(void); void delay_20us(void);void StartModule(void);ulong averageDistance(void);uint write_distance(void);void StartModule() /超声波传感器发送一次声波信号 Trig = 1; delay_20us(); Trig = 0;void delay_20us() /延时uchar a, b, c;for (a=0; a1; a+);for (b=0; b1; b+);for (c=0; c8; c+);void initModule() /将计数器T1清零TH1 = 0x00;TL1 = 0x00; void lcd_init() TMOD=0x91; /10010001,T1方式字段GATE位为1,即T1的工作受TR1和P33控制,T0只由TR0控制。TH0/1与TL0/1构成十六位计数容器 TH0=(65536-800)/256; /给计数器T0赋初值 TL0=(65536-800)/256; EA=1; /开总中断 ET0=1; /开T0的中断 TR0=1; /T0开始工作 write_com(0x38); /调用void write_com()子函数,并带入对应参数 write_com(0x0c); write_com(0x06); write_com(0x80);void screen(void) /读取要显示的数据 for(num = 0;num 4;num+) write_data(table0num); void display(void)/显示子函数screen(); /读取要显示的数据 write_com(0x80 + 0x04); /写指令,操作液晶显示 for(num = 4;num 0) i-; count-; void delay_10us() /10us延时函数 uchar i; i-; i-; i-; i-; i-; i-;void intT0(void) interrupt 1 /给T0赋初值 TH0=(65536-800)/256; TL0=(65536-800)%256;void dsreset(void) /18B20温度传感器复位,初始化函数 uint i; DS=0; i=103; while(i0)i-; DS=1; i=4; while(i0)i-;bit tmpreadbit(void) /读1位数据函数 uint i; bit dat; DS=0;i+; /i+ for delay DS=1;i+;i+; dat=DS; i=8;while(i0)i-; return (dat);uchar tmpread(void) /读1字节函数 uchar i,j,dat; dat=0; for(i=1;i=8;i+) j=tmpreadbit(); /读1位数据函数赋给j dat=(j1); /读出的数据最低位在最前面,这样刚好一个字节在DAT里 return(dat);void tmpwritebyte(uchar dat) /向液晶18b20写一个字节数据函数 uint i; uchar j; bit testb; for(j=1;j1; if(testb) /write 1 DS=0; i+;i+; DS=1; i=8;while(i0)i-; else DS=0; /write 0 i=8;while(i0)i-; DS=1; i+;i+; void tmpchange(void) /液晶18B20开始获取数据并转换 dsreset(); /温度传感器初始化 delay(1); tmpwritebyte(0xcc); /写跳过读ROM指令 tmpwritebyte(0x44); /写温度转换指令 uint tmp() /读取寄存器中存储的温度数据 float tt; uint temp; uchar a,b,c; dsreset(); /温度传感器初始化 delay(1); tmpwritebyte(0xcc); /向1820写一个字节数据函数 tmpwritebyte(0xbe); a=tmpread(); /读低8位 b=tmpread(); /读高8位 temp=b; temp11; if(c=31) flag=1; /最后在显示子函数中要判断flag的值 temp=temp&2047; tt=temp*0.0625; /温度在寄存器中是12位,分辨率是0.0625 temp=tt*10+0.5; /乘10表示小数点后只取1位,加0.5是四折五入 return temp; void main(void) /主函数(程序从这里开始)uchar A0,A1,A2,A3,A2t,a; /定义变量为无符号字符型,分配内存空间 uint temp1,Dis; /定义变量为无符号整型,分配内存空间a=0; WDT=0x25; /看门狗,防止死循环lcd_init(); /开中断,赋初值,写指令(设置定时器0)write_com(0x01); /给液晶显示模块写指令Trig = 0; /首先拉低超声波传感器Trig管脚EX1 = 1; /启用P33口接收中断信号,即为接收Echo信号while(1)initModule(); /将计数器T1清零StartModule(); /超声波传感器发送一次声波信号delay_20us(); /延时,避免声波由发射端发出后,直接被接收端捕获,得到错误的距离信息TR1 = 1; /T1开始计时while(!Echo); /检测是否收到回波信号while(Echo); /收到回波信号TR1 = 0; /T1停止计时Dis=(TH1 * 256 + TL1)/6; /由T1记下的时间差,计算理想距离 if(Dis2000) alarm=1; /报警引脚(溢出,超过量程) else alarm=0;tmpchange(); /开始获取温度数据并转换temp1=tmp(); /寄存器中转换后的温度值赋给temp1A0=temp1/1000%10; /温度千位A1=temp1/100%10; /温度百位 A2t=temp1%100; /温度十位和个位 A2=A2t/10%10; /温度十位 A3=A2t%10; /温度个位temp1/=10; /temp1除以10再赋回给temp1Dis=Dis+temp1*Dis/400000; /通过温度校正距离table14=A0+0x30; /table1表示温度table15=A1+0x30;table16=A2+0x30;table18=A3+0x30;A0=Dis/1000%10; /距离千位A1=Dis/100%10; /距离百位 A2t=Dis%100; /距离十位和个位 A2=A2t/10%10; /距离十位 A3=A2t%10; /距离个位table04=A0+0x30;/table0表示距离table05=A1+0x30;table06=A2+0x30;table08=A3+0x30; display(); WDT=0x35; /调用显示子函数,写入距离、温度的值 /WDT看门狗,防止死循环 第2题:#include#define uchar unsigned char#define uint unsigned int#define ulong unsigned intuchar table0 = DIS:000.0 cm ; /距离uchar table1 = Tem:000.0 C ; /温度uchar num;uchar flag=0;sbit Trig = P32;/超声波传感器Trig管脚定义为P32口,为超声波信号发送端sbit Echo = P33;/超声波传感器Echo管脚定义为P33口,为超声波信号接收端sfr WDT=0xe1;/看门狗sbit DS=P23;/温度传感器18B20中间的管脚,为信号I/O口sbit rs=P20;/寄存器选择位,将液晶1602的RS管脚定义为P2.0口sbit rw=P21;/读写选择位,将液晶1602的RW管脚定义为P2.1口sbit en=P22;/使能信号位,将液晶1602的E管脚定义为P2.2口sbit BF=P07;/忙碌标志位 ,将BF定义为P0.7引脚sbit alarm=P37;/报警引脚void lcd_init(void); /lcd初始化函数void write_com(uchar com); / lcd写命令函数void write_data(uchar date); / lcd写数据函数void display(void); /显示函数void screen(void); /显示table0和table1void frame(void); /显示string1和string2void delay(uint count); /延时子函数void delay_10us(void); /延时子函数void dsreset(void); /温度传感器18b20初始化bit tmpreadbit(void) ; /读一位数据uchar tmpread(void); /读一字节数据 void tmpwritebyte(uchar dat);/写数据void tmpchange(void);/开始数据转换 uint tmp(void);/开始读取寄存器中的温度 void initModule(void); void delay_20us(v

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论