基于单片机的超生波测距系统课程设计(编辑修改稿)内容摘要:

1 S/C R/L * * 6 置功能 0 0 0 0 1 DL N F * * 7 置字符发生存贮器地址 0 0 0 1 字符发生存贮器地址 8 置数据存贮器地址 0 0 1 显示数据存 贮器地址 9 读忙标志或地址 0 1 BF 计数器地址 10 写数到 CGRAM 或 DDRAM) 1 0 要写的数据内容 11 从 CGRAM 或 DDRAM 读数 1 1 读出的数据内容 根据 LCD1602 的引脚定义和资料设计了 测距 系统的显示模块, 电路图如下图53 8 图 53 1602 接口信号说明 1602 接口信 号说明如表 52 所示 表 52 1602 接口说明 编号 符号 引脚说明 编号 符号 引脚说明 1 VSS 电源地 9 D2 数据口 2 VDD 电源正极 10 D3 数 据口 3 VO 液晶显示对比度调节端 11 D4 数据口 4 RS 数据 /命令选择端 12 D5 数据口 5 R/W 读写选择端 13 D6 数据口 6 E 使能端 14 D7 数据口 7 D0 数据口 8 D1 数据口 1602 操作时序 1602 的操作时序图(见图 54) 9 图 54 1602 操作时序 分析时序图可知 1602 液晶的流程如下 ( 1) 通过 RS 确定是写数据还是写命令。 写命令包括液晶的光标显示 /不显示、光标闪烁 /不闪烁、需不需要移动屏幕、在液晶什么位置显示等。 写数据是指要显示什么内容。 ( 2) 读 /写控制端设置为写模式,即低电平。 ( 3) 将数据或命令送至数据线。 ( 4) 给 E 一个高脉冲将数据送入液晶控制器,完成写操作。 DS18B20 温度采集模块的设计 DS18B20 的管脚排列如图 55所示 , DQ 为数字信号输入 /输出端; GND 为电源地; VDD 为外接供电电源输人端。 本温度控制系统采用外接供电方式,电 路图如下图 56所示 图 55 DS18B20 管脚图 10 图 56 DS18B20 电路图 DS18B20 的分辨率 DS18B20 温度传感器可完成对温度的测量, 温度分辨率的设 定 能够 影响到温度传感器的转换时间和转换的精 确 度。 温度的分辨率设置如表 53 所示。 表 53: 温度分辨率设置表 R1 R0 分辨率 温度最大转换时间 0 0 9 位 0 1 10 位 1 0 11 位 375ms 1 1 12 位 750ms 由于本 系统的主要误差是温度影响声速,故对温度采集的精度要求较高 ,所以选择 DS18B20 的分辨率位 12 位,在 12位分辨率的时候的温度采集精度是 度,满足系统精度的要求, 所以 R1 和 R0 的设置分别为 R1=1,R0=1。 DS18B20 工作时序图 ( 1) 初始化(时序图见 57) 11 图 57 初始化时序 ( 2)写数据(时序图见图 58) 图 58 写数据时序 ( 3) 读数据(时序图见图 59) 图 59 读数据时序 超声波测距模块的设计 超声波测距 测距模块 采用 HCSR04 模块,其芯片如图 510 所示: 12 图 510 HRSR04 超声波集成模块工作原理采用的是 I/O 触发测距,给至少 10 us 的高电平信号。 另外,此模块可以自动发送 8 个 40 kHz 的方波脉冲,并能够自动检测是否有信号返回,如果检 测到有信号返回则通过 I/O 口输出低电平,高电平的持续时间就是超声波从发射到返回所用的时间,则所测量的距离 =(高电平时间声速) /2,时序图如图 511。 图 511 此模块不宜带电连接,如果要带电连接,则先让模块的 Gnd 端先连接。 测距时,被测物体的面积不少于 平方米且要尽量平整。 否则会影响测试结果。 6 软件设计 13 程序流程图 主程序流程图 否 是 数据初始化 定时器初始化 显示初始化 进入 while 循环 温度计算 等待中断是否触发 声速计算 超声波测量触发 距离计算 读取定时器值 距离清零 Lcd 显示 14 外部中断 0 流程图 子程序设计 子程序包括了 LCD 显示模块程序, DS18B20 温度采集模块程序。 温度采集模块子程序 根据 DS18B20 的相关资料编写了温度采集程序 void dsreset(void) //DS18B20 初始化 { uint i。 DS=0。 i=103。 while(i0)i。 DS=1。 i=4。 while(i0)i。 } bit tmpreadbit(void) //读一位 { uint i。 bit dat。 DS=0。 i++。 //小延时一下 DS=1。 i++。 i++。 dat=DS。 i=8。 外部中断 0 入口 读取当前定时器值 返回 置测量成功标志 15 while(i0)i。 return (dat)。 } uchar tmpread(void) //读一个字节 { uchar i,j,dat。 dat=0。 for(i=1。 i=8。 i++) { j=tmpreadbit()。 dat=(j7)|(dat1)。 //读出的数据最低位在最前面,这样刚好一个字节在 DAT 里 } return(dat)。 //将一个字节数据返回 } void tmpwritebyte(uchar dat) //写一个字节 { uint i。 uchar j。 bit testb。 for(j=1。 j=8。 j++) { testb=datamp。 0x01。 dat=dat1。 if(testb) // 写 1部分 { DS=0。 i++。 i++。 DS=1。 i=8。 while(i0)i。 } else { DS=0。 //写 0 部分 i=8。 while(i0)i。 DS=1。 i++。 i++。 } } } void tmpchange(void) //发送温度转换命令 { 16 dsreset()。 //初始化 DS18B20 delayb(1)。 //延时 tmpwritebyte(0xcc)。 // 跳过序列号命令 tmpwritebyte(0x44)。 //发送温度转换命令 } int tmp() //获得温度 { int temp。 uchar a,b。 dsreset()。 delayb(1)。 tmpwritebyte(0xcc)。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。