智能小车与超声波模块编程实践教程

版权申诉
0 下载量 149 浏览量 更新于2024-10-09 收藏 30KB RAR 举报
资源摘要信息:"本资源为超声波小车相关资料的压缩文件,包含有关智能小车以及超声波模块的程序代码,为学习和实验目的而整理。" 关键词:超声波小车、超声波模块、51程序 知识点: 1. 超声波小车简介: 超声波小车是指利用超声波传感器作为其感知环境的重要部件的小型机器人。它通常由机械结构、驱动电路、控制器、超声波传感器和电源等部分构成。超声波传感器能够发射超声波脉冲,并接收从物体反射回来的回波,通过计算发射和接收的时间差,可以测量出小车与前方障碍物之间的距离。这种特性使得超声波小车在避障、测距等方面具有广泛的应用。 2. 超声波模块: 超声波模块是超声波小车的核心组成部分之一。常见的超声波模块有HC-SR04等型号,它们主要通过4个引脚与微控制器(如Arduino、51单片机)连接。模块上的触发引脚(Trig)用于发送超声波信号,回声引脚(Echo)用于接收返回的信号。通过编程控制Trig引脚发出至少10微秒的高电平信号,模块随即发出超声波脉冲;Echo引脚在检测到回波后输出高电平信号,其持续时间与超声波发射到返回的时间成正比。通过测量这个时间差,可以计算出距离。 3. 51单片机程序开发: 51单片机是一种经典的单片机,广泛应用于教学和简单的嵌入式系统开发中。编程语言通常是C语言或汇编语言。为了使超声波小车能够运行,需要编写相应的程序来控制超声波模块进行测距,并根据测得的数据来控制小车的移动和转向。程序中可能包含初始化单片机的各个端口、设置定时器、编写超声波测距函数以及主控制循环等功能模块。 4. 超声波测距原理: 超声波测距基于声波在介质中的传播特性。其工作原理是通过计算超声波发射后遇到障碍物反射回来的回波时间,根据声波在介质中传播的速度,换算出距离。具体计算公式为:距离 = (时间 × 声速) / 2,因为声波需要走一次去程和一次回程,所以总时间需要除以2。 5. 智能小车的实际应用: 智能小车在实际中可以应用于各种领域,例如工业自动化、服务机器人、教育实验平台等。通过超声波模块,小车可以实现自动避障、路径规划、自动巡线、距离测量等功能。在教学中,智能小车常用于帮助学生理解传感器、控制理论、机器人编程等知识。 6. 压缩文件与资源提取: 提到的“zhinengxiaoche.rar”是超声波小车相关资源的压缩文件包,可能包含了软件程序、电路图、设计文档等。解压缩该文件后,可以获取到完整的超声波小车项目资源。51程序可能指的是使用51单片机编写的控制超声波小车的相关程序代码,这些代码是实现小车功能的核心部分。 通过这些详细的知识点介绍,学习者可以获得关于超声波小车和超声波模块开发的全面了解,为自己的项目设计和实施打下坚实的基础。

#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 上传