找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2931|回复: 0
打印 上一主题 下一主题
收起左侧

超声测距单片机课程设计报告书

[复制链接]
跳转到指定楼层
楼主
ID:290947 发表于 2018-3-12 19:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机课程设计报告书



课题名称:
超声波测距设计
姓    名:
张周静
学    号:
2014022063
学    院:
电子与信息工程学院
专    业:
电子信息工程
指导教师:
米晓超(尚观科技)

张兴辉(讲  师)
时    间:
2018年12月



课程设计项目成绩评定表
一、设计任务及要求:
1设计任务:
设计一个倒车距离显示及报警提醒系统。


2要   求:
1> 用超声波测距传感器实现采集距离并在 LCD 屏上显示。

2> 当小于阈值距离时报警,大于阈值距离时消警。




指导教师签名:

年   月    日  

二、指导教师评语:

项目成绩:


指导教师签名:

年   月    日


课程设计报告书目录
设计报告书目录

一、设计目的
二、设计思路
三、设计过程
3.1、系统总体方案
3.2、模块电路设计
四、系统调试与结果
五、主要元器件与设备
六、课程设计体会与建议
6.1、设计体会
6.2、设计建议
七、参考文献
八、附件


单片机开发课程设计
一、设计目的

1、熟悉单片机开发试验仪的工作原理.

2、掌握C51语言编程方法。

3、熟悉超声波测距模块工作原理。

4、熟悉LCD显示屏使用方法。

5、熟悉超声波传感器、蜂鸣器的原理及使用方法。

2、设计思路1、整体设计思路


图1 整体设计思路图(见51hei附件)
2、模块设计思路
1、编写LCD1602驱动模块相关程序思路;

在LCD1602程序中,要写入写、读、显示数据函数模块。

1、写数据模块:

图2 数据传输图
2、读数据模块:
图3 数据传输图
3、显示模块:
图4 显示原理图

3、编写蜂鸣器驱动模块相关程序思路;

用P1^5口接入蜂鸣器,设计两个不同频率的延时模块。

当距离不同时,分别调用不同频率的蜂鸣器驱动函数。

4、编写超声波传感器测距模块相关程序思路。

高电平持续时间为超声波发出到返回接收到一个往返的时间。

图5 超声波时序图

三、设计过程1、总体设计方案

1、超声波测距传感器的使用:

控制口发一个 10US 以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了。

  • 超声波模块工作原理:

图6超声波传感器实物图

如上实物图示,超声波传感器有4个引脚,VCC电源端、GND接地端、TRIG发送端、ECHO接收端。

超声波传感器采用IO触发测距,trig端发出超声波,模块自动发送8个40Khz的方波,自动检测是否有信号返回,到echo端接收到超声波,在此过程中一直持续高电平信号,高点平的持续时间就是超声波从发出到接收到这一过程的时间。

测试距离=(高电平时间*声速(340m/s))/2

2、模块电路

1、超声波测距模块工作原理(程序见附件):

(1)采用 IO 触发测距,给至少 10us 的高电平信号;

(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;

(3)有信号返回,通过 IO 输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;

  • 最远探测距离调节



图7 超声波模块图

上图标志电阻即 R3,可以调节最大探测距离。R3 电阻为 392,探测距离最大 4.5M 左右,探测角度小15度R3电阻为472探测距离最大7M 左右,盲区在2CM左右,探测角度小于30度;出厂默认392,即最大探测距离4.5M左右。R3电阻大,接收部分增益高,检测距离大,但检测角度会相应变大,容易检测到前方旁边的物体。当然,客户在不要求很高的测试距离的条件下,可以改小R3来减小探测角度,这时最大测距会减小。超声波模块测距接口:

          图8 超声波模块测距接口图

  • LCD1602模块工作原理(程序见附件):

字符的显示 :
    用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。

图9 LCD1602模块接口电路图

  • 蜂鸣器模块工作原理(程序见附件):

            

图10 蜂鸣器模块接口电路图

蜂鸣器的BZ接到单片机的P1^5口上,当接收到低电平是低电平是,蜂鸣器报警,当是高电平蜂鸣器不响应。

四、系统调试与结果

程序调试:

在Keil-uVision4软件中对程序进行编译,如下图所示,在调试的过程中,蜂鸣器在不同的测试距离下应该发出不同频率的报警声。期初,我未能透彻理解蜂鸣器发声原理,所以在写蜂鸣器报警程序时,遇到了很多问题,很长时间都不能发出不同频率的声音。最后经过查看资料、研究它的发声原理,

图11 程序调试显示图

功能调试:

(1)当超声波测距传感器此时与物体距离为0.13m,当超声波测距传感器与物体距离小于10时,蜂鸣器报警会发出滴---滴---滴---的声音。

图12 功能调试图

(2)当超声波测距传感器与物体距离为0.13,当超声波测距传感器与物体距离在10~30cm之间时,蜂鸣器报警会发出滴滴滴滴滴滴的声音。

图13 功能调试图

(3)当物体与超声波传感器的距离超过30cm时,不发生报警。

图14 功能调试图

五、主要元器件与设备开发平台:X86-PC              windows

开发工具:Keil uVersion4

目标平台:STC89C52RC 单片机

主要元器件:

单片机开发试验仪:

板载硬件:STC89C52RC、DS1302、LED 数码管、蜂鸣器、LCD1602、8*8 LED 矩阵、矩阵键盘、独立按键、74LS138 等;

超声波测距传感器

六、课程设计体会与建议6.1、设计体会

   通过这四天的课程设计学习,不仅加强了我的学习理论的能力,而且也增强了我的动手写程序,也让我更深一步的认识了单片机,当然,遇到问题是在所难免的,有了问题才有进步的空间,也只有发现问题,才知道自己的水平是怎样的,才会让自己沉下心去认真分析与反思,细心总结,在学习中进步。

在项目中,我们要编写代码,进行功能的测试。在写程序时,老师带着我们写了主要的部分,让我们做扩展功能,在写的时后我犯了不少错误。C语言语法运用的不够熟练,会犯很基础的低级错误。

总之,在经历了这次课程设计工作之后,让我明白,不管遇到什么问题都要认证分析,坚持尝试,不断的努力去此外,对于问题要认真分析,仔细考虑有关的方方面面,才能解决问题。更要多去练习,相信孰能生巧。

6.2、设计建议

我还是比较喜欢课程设计这一教学模式,因为这不仅是一个课程设计,在做一个实际的项目中所面临的问题远超于课本。

在这次单片机课程设计让我学到了很多东西,认识到了动手写程序的重要性,希望学校可以安排多次这样的课程设计,多让我们做一些有意义的设计,希望老师也能多发一些这样的课题让我们一起讨论、学习和设计。

七、参考文献

[1] 康华光. 电子技术基础. 北京:高等教育出版社,1999年;

[2] 彭华林等编. 数字电子技术. 长沙:湖南大学出版社,2004年;

[3] 金唯香等编. 电子测试技术. 长沙:湖南大学出版社,2004年;

[4] 侯建军. 数字电路实验一体化教程. 北京:清华大学出版社,北京交通大学出版社,2005年;

[5] 阎石. 数字电子技术基础. 北京:高等教育出版社,2001年;

[6] 赵春华、张学军.电子技术基础仿真实验. 北京:机械工业出版社出版社,2007年;

设计程序代码:

main.c程序:

  1. <font style="font-size: 12pt">#include "sr04.h"
  2. #include "timer.h"
  3. #include "delay.h"
  4. #include "buzz.h"
  5. int main(void)
  6. {
  7.               lcd1602_init();
  8.               timer0_init();
  9.               while (1) {
  10.                             display_test_length();
  11.                             delay_ms(300);
  12.               //              sung_time();
  13.               //              delay_ms(300);
  14.               }
  15.               return 0;
  16. }
  17. Lcd1602.c程序:
  18. #include "lcd1602.h"
  19. #include "delay.h"
  20. static void write_cmd(u8 cmd)
  21. {
  22.               RS = 0; /*写指令设置*/
  23.               RW = 0; /*设置写*/
  24.               E  = 0;
  25.               delay_ms(1);
  26.               DB7_DB0 = cmd;
  27.               E  = 1;
  28.               delay_ms(1);
  29.               E = 0;
  30.               delay_ms(1);
  31. }
  32. static void write_data(u8 dat)
  33. {
  34.               RS = 1; /*写数据设置*/
  35.               RW = 0; /*设置写*/
  36.               E  = 0;
  37.               delay_ms(1);
  38.               DB7_DB0 = dat;
  39.               E  = 1;
  40.               delay_ms(1);
  41.               E = 0;
  42.               delay_ms(1);
  43. }
  44. void lcd1602_init(void)
  45. {
  46.                 delay_ms(15);
  47.               write_cmd(0x30);
  48.               delay_ms(5);
  49.               write_cmd(0x30);
  50.               delay_ms(1);
  51.               write_cmd(0x30);
  52.               write_cmd(0x38); /*显示2行,每个字符是5*8, 数据线8位*/
  53.               write_cmd(0x0c); /*显示开, 无光标,不闪烁*/
  54.               write_cmd(0x01); /*清屏*/
  55.               write_cmd(0x06); /*写入数据后光标右移*/
  56. }
  57. void display_char(u8 x, u8 y, u8 ch)
  58. {
  59.               u8 addr;
  60.               if(y == 0) {
  61.                                addr = 0x80 |  x;
  62.               } else if (y == 1) {
  63.                             addr = 0x80 | x | 0x40;
  64.               } else {
  65.                             return;
  66.               }
  67.               write_cmd(addr);
  68.               write_data(ch);
  69. }
  70. void display_linechar(u8 raw, u8 *buf, u8 num)
  71. {
  72.               u8 i;
  73.               if ((raw != 0) && (raw != 1)) {
  74.                             return;
  75.               }              
  76.               for (i = 0; i < num; i++) {
  77.                             display_char(i, raw, buf[i]);
  78.               }
  79. }
  80. Sr04.c程序:
  81. #include "sr04.h"
  82. #include "delay.h"
  83. #include "buzz.h"
  84. static u8 length_flag = 0;
  85. u8 overflow = 0;
  86. static u8 logo[]   = "uplooking made"; //14
  87. static u8 result[] = "length: -.--m"; //8
  88. static void start_signal(void)
  89. {
  90.               TRIG = 1;
  91.               _nop_();
  92.               _nop_();
  93.               _nop_();
  94.               _nop_();
  95.               _nop_();
  96.               _nop_();
  97.               _nop_();
  98.               _nop_();
  99.               _nop_();
  100.               _nop_();
  101.               _nop_();
  102.               _nop_();
  103.               _nop_();
  104.               _nop_();
  105.               _nop_();
  106.               _nop_();
  107.               _nop_();
  108.               _nop_();
  109.               _nop_();
  110.               _nop_();
  111.               _nop_();
  112.               _nop_();
  113.               _nop_();
  114.               _nop_();
  115.               TRIG = 0;
  116. }

  117. static u16 start_test_length(void)
  118. {
  119.               u16 total_us;
  120.               u16 total_len;
  121.               start_signal();
  122.               /*等待ECHO变为高电平*/
  123.               while (ECHO == 0){
  124.                             ;
  125.               }            
  126.               /*启动定时器0,开启定时*/
  127.               start_timer0();
  128.               /*等待ECHO变为低电平*/
  129.               while (ECHO == 1) {
  130.               ;
  131.               }
  132.               /*停止定时器0*/
  133.               stop_timer0();
  134.               total_us = TH0*256 + TL0; //us
  135.               TH0 = TL0 = 0;
  136.               total_len = total_us*1.7/100;   //cm
  137.               /*判断测量长度数据是否无效*/
  138.               if ((total_len > 700) || (overflow == 1)) {
  139.                             length_flag = 0;
  140.                             overflow = 0;
  141.                             return 0;
  142.               } else {
  143.                             length_flag = 1;
  144.               }
  145.               return total_len;
  146. }                                                                       
  147. void display_test_length(void)
  148. {
  149.               u16 len;
  150.               len = start_test_length();
  151.               if (length_flag == 1) {
  152.               /*if(len<50)
  153.                             {            
  154.                                           BU=0;
  155.                                           delay_10us(100000);            
  156.                             }else if(50<len<80)
  157.                             {                           
  158.                             BU = 0;
  159.                             delay_ms(100);            
  160.                             } */
  161.                             result[8]  = (len/100) + '0';              //m
  162.                             result[10] = ((len%100)/10) + '0'; //.m
  163.                             result[11] = (len%10) + '0';
  164. ……………………

  165. …………限于本文篇幅 余下代码请从51黑下载附件…………
  166. </font>
复制代码



完整的Word格式文档51黑下载地址(含源码):

超声测距.doc (2.41 MB, 下载次数: 27)




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表