2024-09-01
售卖作品
00

目录

ATmega16超声波倒车雷达设计课程报告
1. 项目背景
2. 系统概述
2.1 系统组成
2.2 系统原理
3. 硬件设计
3.1 硬件连接
3.2 硬件配置
4. 软件设计
4.1 功能模块
4.2 主要函数
4.3 系统流程
5. 详细实现
5.1 延时函数
5.2 显示函数
5.3 定时器中断服务函数
5.4 主函数
6. 总结
资源

在这里插入图片描述

ATmega16超声波倒车雷达设计课程报告

1. 项目背景

随着汽车数量的增加,停车场景变得更加复杂,尤其是在狭窄的空间内停车时,司机往往难以判断车尾与障碍物之间的距离。超声波倒车雷达通过超声波传感器检测障碍物距离,并通过蜂鸣器和显示屏提示司机,有效地提高了倒车的安全性。本项目使用ATmega16单片机实现一个简单的超声波倒车雷达系统,通过超声波测距传感器获取距离数据,并在LCD显示屏上显示距离,同时通过蜂鸣器提示距离的远近。

2. 系统概述

2.1 系统组成

  1. ATmega16单片机:核心控制器,负责超声波测距、数据处理和显示控制。

  2. 超声波传感器:用于发射和接收超声波信号,测量障碍物距离。

  3. LCD1602显示屏:显示障碍物距离信息。

  4. 蜂鸣器:根据距离的远近发出不同频率的报警声,提示司机。

2.2 系统原理

  1. 超声波测距:超声波传感器通过发射超声波并接收反射波,计算超声波往返时间,从而得到障碍物的距离。

  2. 数据处理:ATmega16单片机通过计时器记录超声波信号的往返时间,并根据公式计算距离。

  3. 显示与报警:距离数据通过LCD1602显示屏实时显示,同时根据距离的远近通过蜂鸣器发出不同频率的报警声。

3. 硬件设计

3.1 硬件连接

  1. 超声波传感器

    • TRIG(触发端)连接到ATmega16的PB1,用于发射超声波。

    • ECHO(回波端)连接到ATmega16的PB0,用于接收反射回来的超声波信号。

  2. LCD1602显示屏

    • 数据端口和控制端口连接到单片机的PORTD,用于显示距离信息。
  3. 蜂鸣器

    • 连接到ATmega16的PD0,用于发出报警声。

3.2 硬件配置

  1. I/O口配置

    • 将PB1配置为输出模式,用于触发超声波发射。

    • 将PB0配置为输入模式,用于接收超声波反射信号。

    • 将PORTD配置为输出模式,用于驱动LCD显示屏和蜂鸣器。

  2. 定时器配置

    • 使用定时器0进行计时,记录超声波信号的往返时间。

4. 软件设计

4.1 功能模块

  1. 初始化模块:初始化LCD显示屏、超声波传感器及定时器。

  2. 测距模块:通过超声波传感器测量障碍物距离。

  3. 显示模块:在LCD1602显示屏上实时显示障碍物距离。

  4. 报警模块:根据距离的远近,通过蜂鸣器发出不同频率的报警声。

4.2 主要函数

  1. delay_ms():毫秒级延时函数,用于实现延时操作。

  2. delay_10us():微秒级延时函数,用于超声波触发信号。

  3. dispaly():显示距离信息到LCD1602显示屏上。

  4. timer0_ovf():定时器0溢出中断服务函数,用于记录计时器溢出次数。

  5. main():主函数,初始化系统并实现主控制流程。

4.3 系统流程

  1. 系统初始化:初始化LCD显示屏、超声波传感器及定时器,并显示初始信息。

  2. 距离测量:通过触发超声波传感器,测量障碍物距离,并计算距离值。

  3. 显示距离:将计算的距离值显示在LCD1602显示屏上。

  4. 报警控制:根据距离的远近,通过蜂鸣器发出不同频率的报警声。

5. 详细实现

5.1 延时函数

实现毫秒级和微秒级延时,用于控制超声波触发信号和系统延时:

c
void delay_ms(int time) { int i; for (; time > 0; time--) for (i = 0; i < 1000; i++) ; } void delay_10us(void) { int i; for (i = 0; i < 500; i++) ; }

5.2 显示函数

将距离值显示在LCD1602显示屏上:

c
void dispaly(void) { unsigned char cnt; LCD_write_str(0, 0, "Distance:"); cnt = 0; xianshi[cnt++] = distance % 100000 / 10000 + '0'; xianshi[cnt++] = distance % 10000 / 1000 + '0'; xianshi[cnt++] = distance % 1000 / 100 + '0'; xianshi[cnt++] = distance % 100 / 10 + '0'; xianshi[cnt++] = distance % 10 + '0'; xianshi[cnt++] = 'c'; xianshi[cnt++] = 'm'; xianshi[cnt++] = 0; LCD_write_str(4, 1, xianshi); }

5.3 定时器中断服务函数

记录定时器溢出次数,用于计算超声波信号的往返时间:

c
#pragma interrupt_handler timer0_ovf:10 void timer0_ovf(void) { sr4_time_cnt++; if (sr4_time_cnt == 1000) sr4_time_cnt = 0; }

5.4 主函数

初始化系统,测量距离并控制显示和报警:

c
void main(void) { while (1) { delay_ms(10); sys_t++; if (sys_t == 20) { sys_t = 0; sr4_time_cnt = 0; // 中断溢出次数 sr4_time = 0; // 时间 TCNT0 = 0; // 给定时器赋初值 PORTB |= 0x02; // PB1输出高电平 trig delay_10us(); // 延时10us PORTB &= (~0x02); // PB1输出低电平 trig while ((PINB & 0x01) == 0); // PB0 echo==0的时候一直停在这里等 TCCR0 = 0x01; // 配置定时器工作普通模式 while (PINB & 0x01); // PB0 echo==1的时候一直停在这里等 TCCR0 = 0x00; // 配置定时器 不工作 sr4_time = 255 * sr4_time_cnt + TCNT0; // 往返时间 单位us distance = sr4_time * 0.0173 + 1; // 计算距离 单位cm dispaly(); if (distance < 200) { prio = distance / 20; // prio就是档次 每20cm是一个档次 } } if (distance < 200) { sys_tt++; if (sys_tt > prio) { // prio越小 声音就越急促 sys_tt = 0; PORTD &= ~0X01; // 打开蜂鸣器 delay_ms(10); PORTD |= 0X01; // 关闭蜂鸣器 } } else { PORTD |= 0X01; // 打开蜂鸣器 } } }

6. 总结

通过本项目的设计与实现,学习者可以深入理解超声波测距的原理和应用,掌握ATmega16单片机的硬件配置及编

资源

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?u=bdf8eeb84961492ba2b62f7bfee641ea&tab=BB08J2
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!