超声波测距C语言程序实现与1602液晶显示教程

版权申诉
0 下载量 142 浏览量 更新于2024-10-08 收藏 172KB RAR 举报
资源摘要信息:"超声波测距C语言程序1602液晶显示附带说明。" 超声波测距技术是一种应用广泛的技术,主要用于测量物体与传感器之间的距离。其工作原理主要是通过发射超声波脉冲,并接收由物体表面反射回来的回波。根据发射和接收回波之间的时间差,以及超声波在介质中的传播速度,可以计算出物体距离传感器的距离。 在本次分享的资源中,包含了用C语言编写的超声波测距程序,以及1602液晶显示屏的相关驱动代码。1602液晶显示屏是一种常用于显示测量结果的组件,其命名中的“1602”代表该显示屏可以显示16个字符,共2行。在使用该显示屏时,需要通过相应的接口对其进行初始化和字符的写入操作。 使用C语言编写超声波测距程序,一般涉及到以下几个重要知识点: 1. 超声波传感器的使用方法:包括传感器的工作原理、如何连接到微控制器(如Arduino、STM32等)以及如何控制传感器发射超声波。 2. 定时器的使用:为了精确测量时间差,需要使用定时器来记录超声波的发射和接收时间。不同的微控制器平台有不同的定时器配置方法。 3. 超声波传播速度的计算:在空气中的标准声速约为343米/秒(在20°C时),这个速度会随温度变化而变化,因此在精确测量中,需要考虑温度补偿。 4. 数字信号处理:接收到的回波信号通常需要经过信号处理才能准确识别,这可能包括滤波、放大等步骤。 5. 1602液晶显示屏的驱动:编写程序来控制1602液晶显示屏,显示测量得到的距离信息。这需要了解1602显示屏的通信协议,包括如何发送指令以及数据,以及如何控制光标移动等。 6. 程序结构的设计:设计合理的程序结构,使得代码易于理解和维护。这通常包括主函数、测距函数、显示函数等的划分。 7. 用户界面的设计:为了让用户体验更为友好,可能需要设计简单的用户交互界面,例如通过按键来触发测距,或是显示菜单选项。 8. 抗干扰和错误处理:在实际应用中,环境噪声可能会对超声波测距产生干扰,因此需要在程序中设计相应的抗干扰策略。同时,也需要对可能出现的错误进行处理,比如超时未收到回波的情况。 本次分享的资源中,应该包含了这些知识点的详细实现。开发者可以参考这些代码和说明文档,快速搭建起一个基于超声波测距的系统,并通过1602液晶屏显示测量结果。这对于学习和实践微控制器编程、传感器应用开发以及嵌入式系统设计都非常有帮助。
2023-07-15 上传

#include "hcsr04.h" #include "delay.h" #include "usart.h" #include "lcd.h" float Distance; //距离 cm void HCSR04_Init(void) { GPIO_InitTypeDef GPIO_InitSture; EXTI_InitTypeDef EXTI_InitSture; NVIC_InitTypeDef NVIC_InitSture; //如果外部中断的话则一定使能AFIO复用功能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOE,ENABLE); //配置IO端口 GPIO_InitSture.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出模式 GPIO_InitSture.GPIO_Pin = HCSR04_Trig; //将PE4于Trig相连 GPIO_InitSture.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitSture); GPIO_InitSture.GPIO_Mode = GPIO_Mode_IPD; //下拉输入模式 GPIO_InitSture.GPIO_Pin = HCSR04_Echo; //将PE6于Echo相连 GPIO_InitSture.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitSture); //中断和6端口映射一起 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource6); //外部中断配置 EXTI_InitSture.EXTI_Line=EXTI_Line6; EXTI_InitSture.EXTI_LineCmd=ENABLE; EXTI_InitSture.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitSture.EXTI_Trigger=EXTI_Trigger_Rising; EXTI_Init(&EXTI_InitSture); //中断优先级管理 NVIC_InitSture.NVIC_IRQChannel=EXTI9_5_IRQn; NVIC_InitSture.NVIC_IRQChannelCmd=ENABLE; NVIC_InitSture.NVIC_IRQChannelPreemptionPriority=2; NVIC_InitSture.NVIC_IRQChannelSubPriority=2; NVIC_Init(&NVIC_InitSture); } void EXTI9_5_IRQHandler(void) { delay_us(10); if(EXTI_GetITStatus(EXTI_Line6)!=RESET) { TIM_SetCounter(TIM3,0); //开始计数 TIM_Cmd(TIM3,ENABLE); //使能 while(ECHO_DQ_IN); //等待低电平GPIO_ReadInputDataBit(GPIOE, HCSR04_Echo) TIM_Cmd(TIM3,DISABLE); //关闭 Distance=TIM_GetCounter(TIM3)*340/200.0; if(Distance>0) { //printf("Distance:%f cm\r\n",Distance); LCD_ShowNum(30+40,120,Distance,3,16); } EXTI_ClearITPendingBit(EXTI_Line6); } } void HCSR04_Strat(void) { GPIO_SetBits(GPIOE, HCSR04_Trig); //将Trig设置为高电平 delay_us(20); //持续大于10us触发,触发超声波模块工作 GPIO_ResetBits(GPIOE, HCSR04_Trig); }

2023-06-06 上传

import RPi.GPIO as GPIO from LCD1602 import LCD_1602 import time BtnPin = 13 R = 4 G = 12 B = 6 TRIG = 17 ECHO = 18 buzzer = 20 GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(TRIG, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(ECHO, GPIO.IN) GPIO.setup(R, GPIO.OUT) GPIO.setup(B, GPIO.OUT) GPIO.setup(G, GPIO.OUT) GPIO.setup(buzzer, GPIO.OUT) GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.output(buzzer, GPIO.HIGH) m_lcd = LCD_1602(Address=0x27, bus_id=1, bl=1) flag = m_lcd.lcd_init() def get_distance(): GPIO.output(TRIG, GPIO.HIGH) time.sleep(0.000015) GPIO.output(TRIG, GPIO.LOW) while not GPIO.input(ECHO): pass t1 = time.time() while GPIO.input(ECHO): pass t2 = time.time() distance = round((t2-t1) * 340 / 2, 5) return distance def display_distance(distance): a = '%f'%distance m_lcd.lcd_display_string(0, 0, 'The distance is') m_lcd.lcd_display_string(0, 1, a) m_lcd.lcd_display_string(8, 1, 'm') def turn_on_red(): GPIO.output(R, GPIO.HIGH) def turn_on_green(): GPIO.output(G, GPIO.HIGH) def turn_on_blue(): GPIO.output(B, GPIO.HIGH) def turn_off_leds(): GPIO.output(R, GPIO.LOW) GPIO.output(G, GPIO.LOW) GPIO.output(B, GPIO.LOW) def turn_on_buzzer(): GPIO.output(buzzer, GPIO.LOW) def turn_off_buzzer(): GPIO.output(buzzer, GPIO.HIGH) def main(): while True: if GPIO.input(BtnPin) == 0: flag += 1 elif GPIO.input(BtnPin) == 1: pass if flag % 2 == 0: turn_off_leds() turn_on_buzzer() distance = get_distance() if distance < 0.2: turn_on_blue() turn_off_buzzer() display_distance(distance) time.sleep(1) elif flag % 2 == 1: turn_on_green() if __name__ == '__main__': main() GPIO.cleanup(),帮我把每一行代码注释一下

2023-05-24 上传