当前位置:   article > 正文

基于STM32的超声波雷达_基于stm32的超声波雷达检测系统

基于stm32的超声波雷达检测系统

视频地址:1.基于STM32的超声波雷达-演示_哔哩哔哩_bilibili

备注:文档最后有所有文件的网盘地址

1. 项目展示

1.1. 最终效果

1.2. 项目硬件

全部必要硬件(左到右)

  • ST-LINK调试器:调试下载程序
  • stm32f103c8t6核心板
  • 1.8寸TFT显示器
  • sg90舵机
  • 超声波传感器

其他扩展硬件

  • 超声波传感器转接板:方便超声波传感器接到舵机上和接线而已。
  • 自己焊接洞洞板(不是必要硬件,只是方便接线):同一排的引脚连通的,如标黄色的两个引脚是连接在一起的。(下面是正反面图)
  • 另一个洞洞板,与上面一样不是必要硬件,只是方便接线

2. 方案设计

2.1. 需求分析

2.2. 方案设计

2.3. 外设型号

外设

型号

备注

stm32主控芯片

stm32c8t6

超声波传感器

hc-sr04

舵机

sg90

lcd显示屏

ST7735S 1.8寸 128*160tft lcd

3. sg90舵机驱动

3.1. 简介

舵机的控制信号为周期是20ms 的脉宽调制(PWM)信号,其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0—180度,呈线性变化。也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。舵机内部有一个基准电路,产生周期20ms,宽度1.5ms的基准信号,有一个比较器,将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号。

舵机内部控制电路板接受来自信号线相应的PWM控制信号,进而控制电机转动,电机带动一系列齿轮组,减速后传动至输出舵盘。舵机的输出轴和位置反馈电位计是相连的,舵盘转动的同时,带动位置反馈电位计,电位计将输出一个电压信号到控制电路板,进行反馈,然后控制电路板根据所在位置决定电机的转动方向和速度,从而达到目标停止。

GND :地线。

+5V :舵机电源,接5V,(3.3V也可正常工作)。

PWM:舵机控制引脚。

引脚一般可以根据线的颜色区分:棕色GND、红色VCC、黄色PWM

3.2. 原理

  • 舵机是一种根据输入PWM信号占空比来控制输出角度的装置输入,将PWM当作通讯协议来使用
  • PWM信号要求:周期为20ms(50HZ),高电平宽度为0.5ms~2.5ms(占空比范围)

3.3. 代码

引脚连接关系:(PA1:定时器2的通道2)

核心代码:全部代码见文件夹工程

  1. // 产生周期为20ms(50HZ),高电平宽度为0.5ms~2.5ms(占空比范围)
  2. // ARR , PSC 可是多个值,
  3. // ARR = 20000-1 PSC = 72-1;取这个值方便计算而已,其他值也可以
  4. // 舵机电平要求0.5ms~2.5ms 既占空比:0.5ms/20ms = ccr/20000 ~ 2.5ms/20ms = ccr/20000
  5. // ccr 500 ~ 2500
  6. void pwm_init(void)
  7. {
  8. //1、打开时钟(TIM,GPIO)
  9. //2、配置GPIO为复用推挽输出
  10. //3、选择时钟源
  11. //4、配置时基单元
  12. //5、配置输出比较单元
  13. //6、运行控制(启动定时器)
  14. //1、打开时钟
  15. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // TIM2在APB1总线
  16. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIOA在APB2总线
  17. //2、配置GPIO为复用推挽输出
  18. GPIO_InitTypeDef gpioInit;
  19. gpioInit.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出(控制权给片上外设(定时器))
  20. gpioInit.GPIO_Pin = GPIO_Pin_1;
  21. gpioInit.GPIO_Speed = GPIO_Speed_50MHz; //一般设置50MHZ即可
  22. GPIO_Init(GPIOA, &gpioInit);
  23. //3、选择内部时钟
  24. TIM_InternalClockConfig(TIM2);
  25. //4、配置时基单元
  26. TIM_TimeBaseInitTypeDef timeInit;
  27. timeInit.TIM_ClockDivision = TIM_CKD_DIV1; // 外部时钟滤波单元的分频系数,没用,随便配置一个
  28. timeInit.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
  29. timeInit.TIM_Period = 20000 - 1; // 重装值
  30. timeInit.TIM_Prescaler = 72-1; // 分频值
  31. timeInit.TIM_RepetitionCounter = 0; // 重复计数器(高级定时器才有)
  32. TIM_TimeBaseInit(TIM2, &timeInit);
  33. //5、配置输出比较单元
  34. TIM_OCInitTypeDef ocInit;
  35. TIM_OCStructInit(&ocInit); // 结构体初始化(没引用的成员赋默认值)
  36. ocInit.TIM_OCMode = TIM_OCMode_PWM1; // 设置输出模式PWM1模式(先高电平,后低电平)
  37. ocInit.TIM_OCPolarity = TIM_OCPolarity_High; // 设置输出比较的极性不翻转
  38. ocInit.TIM_OutputState = TIM_OutputState_Enable; // 设置输出使能
  39. ocInit.TIM_Pulse = 0; // 设置ccr的值(用于调节占空比)
  40. TIM_OC2Init(TIM2, &ocInit); // 设置通道2输出PWM
  41. //6、运行控制(启动定时器)
  42. TIM_Cmd(TIM2, ENABLE);
  43. }
  44. /**
  45. * @brief 设置pwm的占空比
  46. *
  47. * @param ccr 根据舵机要求计算:取500-2500
  48. */
  49. void pwm_setCCR(uint16_t ccr)
  50. {
  51. TIM_SetCompare2(TIM2, ccr); // 修改通道2ccr的值,实现修改占空比
  52. }
  53. /**
  54. * @brief 根据角度旋转舵机
  55. * ccr取值500~2500 角度0~180
  56. * 500~2500范围是2000; 0~180范围是180
  57. * 等比例缩放 ccr/2000 = angle / 180
  58. * ccr = angle / 180 *2000
  59. * ccr是从500开始,所以还要再偏移500
  60. * ccr = angle / 180 *2000 + 500
  61. * @param angle 旋转角度
  62. *
  63. */
  64. void servo_setAngle(float angle)
  65. {
  66. uint16_t ccr;
  67. ccr = angle / 180 *2000 + 500;
  68. pwm_setCCR(ccr);
  69. }

最终效果图

4. 超声波传感器驱动

4.1. 简介

HC-SR04超声波距离传感器的核心是两个超声波传感器。一个用作发射器,将电信号转换为40 KHz超声波脉冲。接收器监听发射的脉冲。如果接收到它们,它将产生一个输出脉冲,其宽度可用于确定脉冲传播的距离。

该传感器体积小,易于在任何机器人项目中使用,并提供2厘米至400厘米(约1英寸至13英尺)之间出色的非接触范围检测,精度为3mm,工作电压为5伏。

以下是完整的规格

描述

参数

Operating Voltage工作电压

直流3.3V---5V

Operating Current工作电流

15毫安

Operating Frequency运行频率

40K赫兹

Max Range最大范围

4m

Min Range最小范围

2厘米

Ranging Accuracy测距精度

3毫米

Measuring Angle测量角度

15度

Trigger Input Signal触发输入信号

10µS TTL脉冲

Dimension尺寸

45 x 20 x 15毫米

VCC :HC-SR04超声波距离传感器电源引脚,接5V。

Trig :(Trigger) 引脚用于触发超声波脉冲。

Echo :回声当接收到反射信号时,引脚产生一个脉冲。脉冲长度与检测发射信号所需时间成正比。

GND :地线。

4.2. 原理

  • 采用IO口TRIG触发测距,给最少10us的高电平信号。
  • 模块自动发送8个40khz的方波,自动检测是否有信号返回;
  • 有信号返回, 通过IO口ECHO输出一个高电平, 高电平持续的时间就是超声波从发射到返回的时间。
  • 测试距离=(高电平时间*声速(340M/S))/2

只要提供一个 10uS以上脉冲触发信号,该模块内部将发出8个 40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。 由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。

公式: uS/58=厘米或者uS/148=英寸; 或是: 距离=高电平时间*声速( 340M/S) /2;

建议测量周期为 60ms以上, 以防止发射信号对回响信号的影响

4.3. 代码

stm32和超声波传感器引脚连接关系:(PB6为定时器4通道1)

stm32和OLED显示屏引脚连接关系:(OLED调试超声波传感器需要用到)

核心代码:全部代码见文件夹工程

  1. //返回超声波毫米值
  2. uint32_t hcsr04_getValueMm(void)
  3. {
  4. uint32_t dist, distMm;
  5. static uint64_t timeEnd;
  6. //触发超声波测量
  7. GPIO_WriteBit(GPIOB,TRIG_PIN,Bit_SET); //Trig输出高电平
  8. delay_us(15); //保持15微秒生效
  9. GPIO_WriteBit(GPIOB,TRIG_PIN,Bit_RESET); //Trig输出低电平
  10. while((GPIO_ReadInputDataBit(GPIOB,ECHO_PIN) == 0)); //等待低电平结束,开始测量
  11. g_time = 0; //计时清零
  12. while(GPIO_ReadInputDataBit(GPIOB,ECHO_PIN) == 1); //等待高电平结束,测量结束
  13. timeEnd = g_time;
  14. if(timeEnd/100 < 38) //判断是否小于38毫秒,大于38毫秒的就是超时,直接跳到下面返回0
  15. {
  16. dist=(timeEnd*346) / 2; //计算距离,25°C空气中的音速为346m/s
  17. distMm=dist/100; //timeEnd单位是10微秒,得出单位为毫米的距离结果,还得除以100
  18. }else
  19. {
  20. distMm=0;
  21. }
  22. return distMm;
  23. }
  24. //中断服务函数,回波计时,每10微秒g_time加1
  25. void TIM4_IRQHandler(void)
  26. {
  27. if (TIM_GetITStatus(TIM4, TIM_IT_Update) == SET) //获取TIM2定时器的更新中断标志位
  28. {
  29. g_time++;
  30. TIM_ClearITPendingBit(TIM4, TIM_IT_Update); //清除更新中断标志位
  31. }
  32. }
  33. //定时器4初始化
  34. //定时10us,提供超声波测量时间
  35. //定时器4中断服务函数再drv_sr04.c
  36. void time4_init(void)
  37. {
  38. //1、RCC开启时钟
  39. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  40. //2、选择时基单元的时钟源
  41. TIM_InternalClockConfig(TIM4); //选择内部时钟(不写也行,默认就是内部时钟)
  42. //3、配置时基单元
  43. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  44. TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //外部时钟滤波单元的分频系数,没用,随便配置一个就行
  45. TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
  46. //频率 = CK_PSC / (PSC + 1) / (ARR + 1) CK_PSC=72MHZ
  47. //时间=1/频率 72MHZ/72/10 ===》 10us
  48. TIM_TimeBaseInitStruct.TIM_Prescaler = 72-1; //分频值
  49. TIM_TimeBaseInitStruct.TIM_Period = 10-1; //周期,ARR自动重装器的值
  50. TIM_TimeBaseInitStruct.TIM_RepetitionCounter =0; //重复计数器的值,高级定时器才有,给0就行
  51. TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStruct);
  52. //TIM_TimeBaseInit设置自动更新会进一次中断,这边清除中断解决刚上电就会进一次中断的问题
  53. TIM_ClearFlag(TIM4,TIM_FLAG_Update);
  54. //4、配置中断输出控制
  55. TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//更新中断到NVIC使能
  56. //5、配置NVIC
  57. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //选择优先级分组2
  58. NVIC_InitTypeDef NVIC_InitStruct;
  59. NVIC_InitStruct.NVIC_IRQChannel = TIM4_IRQn;
  60. NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  61. NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
  62. NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
  63. NVIC_Init(&NVIC_InitStruct);
  64. //6、配置运行控制
  65. TIM_Cmd(TIM4, ENABLE); //启动定时器3
  66. }

最终效果图

5. TFT显示屏驱动

5.1. 简介

该显示屏是一块以ST7735S驱动的1.8英寸采用SPI通信的TFT全彩屏,分辨率是128*128,这里采用RGB565 16bit的色块编译模式(RGB565即高五位为Red,第五位为Blue,中间六位为Green,共16位)。本文仅设计该屏幕的简单应用,不对底层原理进行深究。

引脚

Parameter

GND

接地

VCC

3.3V-5V电源接入

SCL

SPI总线时钟信号

SDA

SPI总线写数据信号

RES

液晶屏复位信号,低电平复位

DC

液晶屏寄存器/数据选择信号,高电平:寄存器,低电平:数据

CS

液晶屏片选信号,低电平使能

BL

背光控制,高电平点亮,如无需控制则接3.3V常亮

5.2. 原理

屏幕的参数配置的大体流程如下:

  1. 执行0X11命令,退出睡眠模式,执行命令后延时120ms

  2. 配置0XB1,0XB2,0XB3,0XB4寄存器,配置在不同颜色模式下屏幕的刷新率,0XB4寄存器配置屏幕是否反色

  3. 配置0XC0,0XC1,0XC2,0XC3,0XC4寄存器,配置显示屏在不同颜色不同模式下的电压
  4. 配置0X36寄存器,设置显存数据访问方式。如果颜色不正,注意查看颜色是顺序是的BGR的颜色顺序,有一位可以控制顺序的,36H的RGB位从1变到0颜色就正常了。

  5. 配置0XE0,0XE1寄存器,配置伽马极性
  6. 执行0X3A,设置像素格式

  7. 执行0X29命令,进行显示

5.3. 取模

显示屏的显示原理就是在屏幕上打点,显示中文,英文,图片本质都是在对应的位置,将这些点事先找出来就是取模;中文,英文,图片都要先取模才能显示。

英文取模

附:ASCII码完整表:注第一个字符为空格,不要遗漏

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

  1. 打开取模软件

  2. 左上角模式选择为字符模式

  3. 点击选项

4.设置如下,然后点击确定。
> 点阵要选择的数要大于字符所占字节数,例如8x16的字符所占字节为 8x16/2=16,所以这里点阵选大于16就行

  1. 以8x16ASCII取模为例:
    字宽字高都改为16,那么对应的ASCII码为8x16,字宽会变为原来的一半

  2. 然后在输入栏输入ASCII码表

  3. 点击生成字模生成的字模

  4. 得到字模

8x16字模在例程font.h中已经取好 如下所示

中文取模

  1. 开取模软件

  2. 左上角模式选择为字符模式

  3. 点击选项

  4. 设置如下,然后点击确定。

  5. 以16x16汉字取模为例:字宽字高都改为16

  6. 然后在输入栏输入汉字

  7. 点击生成字模

  8. 生成的字模如下

8x16字模在例程font.h中已经取好 如下所示

注:每个字的字模前需要添加这个汉字,并用双引号括起来然后加上逗号!

图片取模

  1. 打开下面文件夹的软件

  2. 打开要取模的图片:以例程的40x40企鹅图片为例

  3. 观察左下角的输入图像,如果显示如下这样,请看5

  4. 如果显示无效的输入图像,那么请使用电脑自带的画图软件将图片转化为16色位的bmp格式图片。

  5. 打开图片后设置如下


    最大宽度和高度:设置好后点击右边三角形设置按钮(注意:此软件只能缩小图片不能放大图片!缩小是等比例缩小!)
  6. 然后点击保存,输入文件名,得到数据数组

5.4. 代码

引脚连接关系

LCD初始化代码:全部代码见文件夹工程

  1. // lcd1.8寸 128*160 初始化函数
  2. void lcd_init(void)
  3. {
  4. lcd_gpio_init();
  5. spi_init();
  6. lcd_set_rest(); // lcd复位
  7. lcd_wr_bl(1); // 打开背光
  8. delay_ms(100);
  9. //************* Start Initial Sequence **********//
  10. lcd_wr_regist(0x11); //Sleep out
  11. delay_ms(120); //Delay 120ms
  12. //------------------------------------ST7735S Frame Rate-----------------------------------------//
  13. lcd_wr_regist(0xB1);
  14. lcd_wr_data(0x05); lcd_wr_data(0x3C); lcd_wr_data(0x3C);
  15. lcd_wr_regist(0xB2);
  16. lcd_wr_data(0x05); lcd_wr_data(0x3C); lcd_wr_data(0x3C);
  17. lcd_wr_regist(0xB3);
  18. lcd_wr_data(0x05); lcd_wr_data(0x3C); lcd_wr_data(0x3C);
  19. lcd_wr_data(0x05); lcd_wr_data(0x3C); lcd_wr_data(0x3C);
  20. //------------------------------------End ST7735S Frame Rate---------------------------------//
  21. lcd_wr_regist(0xB4); //Dot inversion
  22. lcd_wr_data(0x03);
  23. //------------------------------------ST7735S Power Sequence---------------------------------//
  24. lcd_wr_regist(0xC0);
  25. lcd_wr_data(0x28); lcd_wr_data(0x08); lcd_wr_data(0x04);
  26. lcd_wr_regist(0xC1);
  27. lcd_wr_data(0XC0);
  28. lcd_wr_regist(0xC2);
  29. lcd_wr_data(0x0D); lcd_wr_data(0x00);
  30. lcd_wr_regist(0xC3);
  31. lcd_wr_data(0x8D); lcd_wr_data(0x2A);
  32. lcd_wr_regist(0xC4);
  33. lcd_wr_data(0x8D); lcd_wr_data(0xEE);
  34. //---------------------------------End ST7735S Power Sequence-------------------------------------//
  35. lcd_wr_regist(0xC5); //VCOM
  36. lcd_wr_data(0x1A);
  37. lcd_wr_regist(0x36); //MX, MY, RGB mode
  38. if(USE_HORIZONTAL==0)lcd_wr_data(0x00);
  39. else if(USE_HORIZONTAL==1)lcd_wr_data(0xC0);
  40. else if(USE_HORIZONTAL==2)lcd_wr_data(0x70);
  41. else lcd_wr_data(0xA0);
  42. //------------------------------------ST7735S Gamma Sequence---------------------------------//
  43. lcd_wr_regist(0xE0);
  44. lcd_wr_data(0x04); lcd_wr_data(0x22); lcd_wr_data(0x07);
  45. lcd_wr_data(0x0A); lcd_wr_data(0x2E); lcd_wr_data(0x30);
  46. lcd_wr_data(0x25); lcd_wr_data(0x2A); lcd_wr_data(0x28);
  47. lcd_wr_data(0x26); lcd_wr_data(0x2E); lcd_wr_data(0x3A);
  48. lcd_wr_data(0x00); lcd_wr_data(0x01); lcd_wr_data(0x03);
  49. lcd_wr_data(0x13);
  50. lcd_wr_regist(0xE1);
  51. lcd_wr_data(0x04); lcd_wr_data(0x16); lcd_wr_data(0x06);
  52. lcd_wr_data(0x0D); lcd_wr_data(0x2D); lcd_wr_data(0x26);
  53. lcd_wr_data(0x23); lcd_wr_data(0x27); lcd_wr_data(0x27);
  54. lcd_wr_data(0x25); lcd_wr_data(0x2D); lcd_wr_data(0x3B);
  55. lcd_wr_data(0x00); lcd_wr_data(0x01); lcd_wr_data(0x04);
  56. lcd_wr_data(0x13);
  57. //------------------------------------End ST7735S Gamma Sequence-----------------------------//
  58. lcd_wr_regist(0x3A); //65k mode
  59. lcd_wr_data(0x05);
  60. lcd_wr_regist(0x29); //Display on
  61. }

测试代码效果

6. 雷达功能实现

6.1. 雷达GUI设计

使用TFT显示屏的驱动,在屏幕上画出雷达GUI图像

  1. 确定圆心(80,108),绘制多个圆

  2. 绘图填充图像,去掉圆的下半部分

  3. 绘制不同角度的斜线

  4. 绘制角度,距离等提示信息

绘制雷达图像代码

  1. // 根据角度和长度,绘制从圆心开始的斜线
  2. void radar_line(double k,int r)
  3. {
  4. int16_t x,y;
  5. x=80+r*(double)cos(k/180*3.1415926);
  6. y=108-r*(double)sin(k/180*3.1415926);
  7. lcd_simple_line(80,108,x,y,GREEN);
  8. }
  9. //雷达图像
  10. void radar_picture(void)
  11. {
  12. lcd_draw_chinese(80,0,GREEN,BLACK,16, 0,"超声波雷达");
  13. //画圆:(圆心坐标,半径,颜色)
  14. lcd_simple_circle(80,108,76,GREEN);
  15. lcd_simple_circle(80,108,57,GREEN);
  16. lcd_simple_circle(80,108,38,GREEN);
  17. lcd_simple_circle(80,108,19,GREEN);
  18. lcd_simple_fill(0, 108, 160, 20, BLACK); //去掉园的下半部分
  19. //画斜线:(角度,长度)
  20. radar_line(30,85);
  21. radar_line(60,85);
  22. radar_line(90,85);
  23. radar_line(120,85);
  24. radar_line(150,85);
  25. lcd_simple_line(0,108,160,108,GREEN);
  26. //数据信息
  27. lcd_draw_integer(0, 46, GREEN, BLACK, 16, 0, 3, 150); // 150°数值
  28. lcd_draw_integer(38, 22, GREEN, BLACK, 16, 0, 3, 120); // 120°数值
  29. lcd_draw_integer(83, 20, GREEN, BLACK, 16, 0, 2, 90); // 90°数值
  30. lcd_draw_integer(124, 32, GREEN, BLACK, 16, 0, 2, 60); // 60°数值
  31. lcd_draw_integer(140, 49, GREEN, BLACK, 16, 0, 2, 30); // 30°数值
  32. lcd_draw_chinese(21, 44, GREEN, BLACK, 16, 0, "°"); // 150°符号
  33. lcd_draw_chinese(59, 19, GREEN, BLACK, 16, 0, "°"); // 120°符号
  34. lcd_draw_chinese(97, 18, GREEN, BLACK, 16, 0, "°"); // 90°符号
  35. lcd_draw_chinese(137, 30, GREEN, BLACK, 16, 0, "°"); // 60°符号
  36. lcd_draw_chinese(152, 45, GREEN, BLACK, 16, 0, "°"); // 30°符号
  37. lcd_simple_hz(0, 0, GREEN, "角度");
  38. lcd_simple_char(4,0,GREEN, ':');
  39. lcd_simple_hz(4,0,GREEN ,"°"); //显示°
  40. lcd_simple_hz(0, 7, GREEN, "距离");
  41. lcd_simple_char(4, 7, GREEN, ':');
  42. lcd_simple_str(9,7,GREEN,"mm");
  43. }

6.2. 雷达功能实现

根据超声波传感器返回的距离值,根据屏幕尺寸等比例缩放,在屏幕上打印对应的点,下面是关键逻辑代码

  1. while (1)
  2. {
  3. for (uint8_t i = 30; i <= 150; i++) // 舵机旋转
  4. {
  5. distMm = hcsr04_getValueMm(); // 获取超声波数据
  6. uint16_t lcdMm = distMm/6; // 等比例缩小,便于显示在屏幕上
  7. if(distMm <= 500)
  8. {
  9. lcd_simple_int(5,7, BLACK, 4, oldMn); // 覆盖上次距离信息
  10. lcd_simple_int(5,7, GREEN, 4, distMm); // 显示新的距离信息
  11. oldMn = distMm;
  12. radar_redPoint(i, lcdMm); // 屏幕上打点
  13. }
  14. // lcd_draw_integer(3,114,3,GREEN,BLACK,16,0,distanceMm);
  15. servo_setAngle(i);
  16. lcd_simple_int(5,0, BLACK, 3, i-1); // 覆盖上次距离信息
  17. lcd_simple_int(5,0, GREEN, 3, i); // 显示新的距离信息
  18. delay_ms(20);
  19. }
  20. lcd_simple_int(5,0, BLACK, 3, 150); // 覆盖上次内容
  21. for (uint8_t i = 30; i <= 150; i++) // 舵机往回旋转
  22. {
  23. distMm = hcsr04_getValueMm(); // 获取超声波数据
  24. uint16_t lcdMm = distMm/6; // 等比例缩小,便于显示在屏幕上
  25. if(distMm <= 500)
  26. {
  27. radar_redPoint(180-i, lcdMm);
  28. lcd_simple_int(5,7, BLACK, 4, oldMn); // 覆盖上次内容
  29. lcd_simple_int(5,7, GREEN, 4, distMm); // 显示新的内容
  30. oldMn = distMm;
  31. }
  32. servo_setAngle(180 - i);
  33. lcd_simple_int(5,0, BLACK, 3, 180-i+1); // 覆盖上次内容
  34. lcd_simple_int(5,0, GREEN, 3, 180-i); // 显示新的内容
  35. delay_ms(20);
  36. }
  37. lcd_simple_int(5,0, GREEN, 3, 30); // 显示新的内容
  38. }

 7.资料下载地址

链接:https://pan.baidu.com/s/11KXIBepREsnWUQEn3BvVLg 
提取码:8oai

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/755432
推荐阅读
相关标签
  

闽ICP备14008679号