草庐IT

基于51单片机的超声波避障小车(HC-SR04,SG90舵机)

很瞌睡 2023-09-24 原文

+


一、HC-SR04超声波模块

HC-SR04时序图

触发信号输入端(Trig)输入一个10微秒以上的高电平信号,超声发送口收到信号自动发送8个40Hz方波,同时启动 定时器 ,待传感器接收到回波则停止 计时 并输出回响信号,回响信号脉冲宽度与所测距离正比。. 根据时间间隔可以计算距离,公式:距离=(高电平时间*声速)/2。【来自
由于Trig端要输入一个10微秒以上的函数所以要使用 intrins.h中的函数 nop();
引入函数如下

#include <intrins.h> 

整体测量距离函数

void hcsr04_Init()
{
    Trig=1;//Trig端置1                      
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_();
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_();//等待10us以上                      
    Trig=0;//Trig端置0
    while(!Echo);    //当Echo端为0时等待           
    TR0=1;           //定时器0置1 开始计时              
    while(Echo);     //当Echo为1时 计时并等待                
    TR0=0;           //关闭定时器0 结束计时                
}
void distance(void)		//超声波模块计算距离
{
    time=TH0*256+TL0; //将计时器记录的时间存入time中         
    TH0=0;         //计时器清零
    TL0=0;                                 
    Distance=(time*1.8)/100;//计算距离      
}

二、SG90舵机


sg90舵机的三根线买回来是连在一起的可将塑料头拆开方便接入单片机

SG90舵机时序图

该舵机的控制信号为周期是20ms 的脉宽调制(PWM)信号,脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0—180度。
如上图可知
当脉冲宽度为0.5ms舵机旋转0度
当脉冲宽度为1ms舵机旋转45度
当脉冲宽度为1.5ms舵机旋转90度
当脉冲宽度为2ms舵机旋转135度
当脉冲宽度为2.5ms舵机旋转180度
接线说明
红线为vcc端接入单片机5v端
橙线为pwm信号线参考程序定义接入
棕线为gnd端接入单片机GND端

#include <REG51.H>
typedef unsigned char uchar;   //偷懒 只为少敲些键盘
typedef unsigned int uint;     

uchar angle;      
sbit PWM = P3^5;  //pwm信号端也就是舵机的黄色线
uchar count = 0;	//计算周期

void delay_ms(uint c)   //延迟函数 延迟1ms
{
    uint a,b;
    for(;c>0;c--)
        for(b=102;b>0;b--)
            for(a=3;a>0;a--);
}

void Time0_Init()          //定时器初始化
{
        TMOD = 0x01;           //定时器0工作在方式1
        TH0  = 0xfe;           //装入初值 0.5ms中断一次 
        TL0  = 0x33;
        EA = 1;
        ET0 = 1;            
        TR0=1;                 //定时器置1打开
}

void main()
{
    Time0_Init();

    while (1)
    {
        count = 0;
        angle = 1; //归零   1--0 2--45 3--90 4--135 5--180
        delay_ms(1000);
        count = 0;
        angle = 2; //旋转45度
        delay_ms(1000);
		count = 0;
        angle = 3; //旋转90度
        delay_ms(1000);
		count = 0;
        angle = 4; //旋转135度
        delay_ms(1000);
		count = 0;
        angle = 5; //旋转180度
        delay_ms(1000);
    }
}

void timer0() interrupt 1
{
    TR0 = 0;  //关闭计时器0
    TH0  = 0xfe;
    TL0  = 0x33;                   //11.0592MZ晶振,0.5ms

    if(count<=angle)   
    {
        PWM = 1;
    }
    else
    {
        PWM = 0;
    }
    if(count==40)   //一个周期为20ms  
    {
        count = 0; //周期达到20ms 清零重新计时
    }
    count ++;
    TR0 = 1;  //开启计时
}

三.总程序编写

#include <reg51.h> 							
#include <intrins.h>			//用于使用了_nop()_函数

#define uchar unsigned char				
#define uint	unsigned int			

sbit IN1	=P1^0;
sbit IN2	=P1^1;
sbit IN3	=P1^2;
sbit IN4 	=P1^3;			

sbit Echo = P2^5;				//超声波模块 Echo端接单片机P2.5
sbit Trig = P2^6;				//超声波模块 Trig端接单片机P2.6

sbit pwm= P2^4;            //舵机信号端定义

void turnleft();
void turnright();
void straight();
void stop();
void count();
void run();
void hcsr04();
void delayms(uint ms);

uint time = 0;   //测距数据,距离所用时间变量							   
uint Distance = 0;												//距离
uchar flag =0;				//定时器0溢出标志
uchar angle;
uint counter=0;


void  main()
{  
	TMOD|=0x11;		   			//定时器0定时器1,工作方式1
	TH0=0;                   //定时器0用于超声波测距
	TL0=0;          
	TH1=0xFE;		   				//定时器1用于控制舵机  0.5ms定时
	TL1=0x33;
	ET0=1;            		//定时器0中断使能
	ET1=1;			   				//定时器1中断使能
	TR1=1;			   				//定时器1开始计时
	EA=1;			   					//开启总中断
	angle = 3;
	while(1)
	{
		hcsr04();						
		count();					 //计算距离
		run();
	}
}

void delay_ms(uint c)   //延迟函数 延迟1ms
{
    uint a,b;
    for(;c>0;c--)
        for(b=102;b>0;b--)
            for(a=3;a>0;a--);
}

void run()  //测定距离为15cm  当大于小于15cm是舵机的转向和小车的前进方向
{
	if(angle ==3 && Distance >= 15)
	{
		straight();
		hcsr04();
		count();
	}
	else if(angle ==3 && Distance < 15)
	{
		stop();
		angle = 2;
		delay_ms(20);
		hcsr04();
		count();
	}
	if(angle == 2 && Distance >=15)
	{
		turnright();
		delay_ms(50);
		angle=3;
		delay_ms(20);
		hcsr04();
		count();
	}
	else if(angle == 2 && Distance < 15)
	{
		angle = 4;
		delay_ms(20);
		hcsr04();
		count();
	}
	if(angle == 4 && Distance >=15)
	{
		turnleft();
		delay_ms(50);
		angle =3;
		delay_ms(200);
		hcsr04();
		count();
	}
	else if(angle == 4 && Distance <15)
	{
		angle =3;
		delay_ms(20);
		hcsr04();
		count();
	}
}
void straight()	
{
	IN1 = 1;
	IN2 = 0;
	IN3 = 0;
	IN4 = 1;
}
void turnleft() 
{
	IN1 = 1;
	IN2 = 0;
	IN3 = 1;
	IN4 = 0;
}
void turnright()	
{
	IN1 = 0;
	IN2 = 1;
	IN3 = 0;
	IN4 = 1;
}
void hcsr04()
{
	Trig=1;			              
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_();
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 						//等待大于10us
	Trig=0;
	while(!Echo);				//当Echo为零时等待
	TR0=1;			    			//开启计数
	while(Echo);					//当Echo为1时,计时并等待
	TR0=0;								//关闭计时
}
void count(void)
{
	time=TH0*256+TL0;		//定时器的值放在time中
	TH0=0;
	TL0=0;					//清零定时器0
	Distance=(time*1.8)/100;      //计算距离
}
void Tmr0_isr() interrupt 1  //T0中断用来计数器溢出,超过测距范围
{
	flag=1;							 			 //中断溢出标志
}

void Tmr1_isr() interrupt 3 //T1中断用来控制舵机
{
    TR1 = 0;  //关闭计时器0
    TH1  = 0xfe;
    TL1  = 0x33;                   //11.0592MZ晶振,0.5ms

    if(counter<=angle)   
    {
        pwm = 1;
    }
    else
    {
        pwm = 0;
    }
    if(counter==40)   //一个周期为20ms  
    {
        counter = 0; //周期达到20ms 清零重新计时
    }
    counter ++;
    TR1 = 1;  //开启计时
}  

对于小车方向程序及烧录问题可转【基于51单片机的遥控小车

--------------------------  END!!!----------------------------
  • [√ ] 点赞+收藏

有关基于51单片机的超声波避障小车(HC-SR04,SG90舵机)的更多相关文章

  1. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  2. micropython复现经典单片机项目(二)可视化音频 频谱解析(基本搞定) - 2

    本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S

  3. 51单片机——74HC595的应用(SPI实践) - 2

    目录SPI总线SPI总线概述 SPI总线分类SPI优点及缺点SPI接口硬件原理SPI四种工作模式 74HC595应用74HC595芯片概述74HC595封装及管脚功能74HC595工作原理 ​编辑 74HC595串行转并行点亮LED灯 程序实现  Proteus运行结构示意图SPI总线SPI总线概述 SPI(SerialPeripheralinterface):串行外围设备接口 用途:用来在微控制器与外围设备芯片之间实现数据交换 特点:高速、全双工、同步 SPI总线分类四线制全双工SPI(同时收发)MISO    主机输入/从机输出MOSI    主机输出/从机输入SCLK   串行时钟CS或

  4. 【毕业设计】基于单片机的智能温控农业大棚系统 - 物联网 stm32 - 2

    文章目录1简介2绪论2.1课题背景与目的3系统设计详细设计描述3.2硬件部分温度测量电路其他电路部分3.3软件部分主程序子系统程序温湿度程序流程键盘显示子程序3.4实现效果3.5部分相关代码4最后1简介Hi,大家好,这里是丹成学长,今天向大家介绍一个单片机项目基于单片机的智能温控农业大棚系统大家可用于课程设计或毕业设计单片机-嵌入式毕设选题大全及项目分享:https://blog.csdn.net/m0_71572576/article/details/1254090522绪论2.1课题背景与目的近年来我国的温室控制取得了长足的进步,首先在温室群控制方面,进行了初步的探索和理论研究,其次在温室

  5. AT24C04、AT24C08、AT24C16系列EEPROM芯片单片机读写驱动程序 - 2

    一、概述在之前的一篇博文中,记录了AT24C01、AT24C02芯片的读写驱动,先将之前的相关文章include一下:1.IIC驱动:4位数码管显示模块TM1637芯片C语言驱动程序2.AT24C01/AT24C02读写:AT24C01/AT24C02系列EEPROM芯片单片机读写驱动程序本文记录分享AT24C04、AT24C08、AT24C16芯片的单片机C语言读写驱动程序。二、芯片对比介绍型号容量bit容量byte页数字节/页器件寻址位可寻址器件数WordAddress位数/字节数备注AT24C044k5123216A2A149/1WordAddress使用P0位AT24C088k1024

  6. 基于51单片机、DS1302时钟模块的电子闹钟设计 - 2

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、设计原理1.DS1302介绍2.闹钟音乐播放原理二、程序设计1.DS1302.h2.ds1302.c3.music.h4.main.c三、电路图四、运行结果1.proteus仿真2.开发板实验五、总结六、附件提示:以下是本篇文章正文内容,下面案例可供参考一、设计原理1.DS1302介绍DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V。该芯片采用普通32.768kHz晶振,DS1302工作时功耗很

  7. [蓝桥杯单片机]学习笔记——串口通信的基本原理与应用 - 2

    目录一、原理部分1、什么是串行通信(1)并行通信与串行通信(2)串行通信的制式(3)串行通信的主要方式  2、配置串口(1)SCON和PCON:串行口1的控制寄存器(2)SBUF:串行口数据缓冲寄存器 (3)AUXR:辅助寄存器​编辑(4)ES、PS:与串行口1中断相关的寄存器(5)波特率设置  3、串口框架编写二、程序案例一、原理部分1、什么是串行通信(1)并行通信与串行通信微控制器与外部设备的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。并行通信:数据的各位同时发送与接收,每个数据位使用一条导线,这种方式传输快,但是需要多条导线进行信号传输。串行通信:数据一位一

  8. 一、51单片机 使用Proteus掌握LCD1602显示屏的使用(仿真及代码) - 2

    1、单片机控制液晶显示模块1602LCD的显示。液晶显示器(LiquidCrystalDisplay,LCD)具有省电、体积小、抗干扰能力强等优点,LCD显示器分为字段型、字符型和点阵图形型。(1)字段型。以长条状组成字符显示,主要用于数字显示,也可用于显示西文字母或某些字符,广泛用于电子表、计算器、数字仪表中。(2)字符型。专门用于显示字母、数字、符号等。一个字符由5、7或5、10的点阵组成,在单片机系统中已广泛使用(3)点阵图形型。广泛用于图形显示,如笔记本电脑、彩色电视和游戏机等。它是在平板上排列的多行列的矩阵式的晶格点,点大小与多少决定了显示的清晰度。引脚包括8条数据线、3条控制线和3

  9. 微机课设 | 基于STC15单片机的简易数字密码锁设计 - 2

    在日常的生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替了传统的机械式密码锁,电子密码锁具有安全性高、成本低、功耗低、易操作等优点。本文主要介绍运用51单片机设计数字密码锁的方法。本设计采用自上而下的数字系统设计方法,将数字密码锁系统分解为若干子系统,并且进一步细划为若干模块,然后用C语言来设计这些模块,通过KEIL软件编译,并且进行实机调试。调试结果表明:该数字密码锁能够效验4位十进制

  10. 51单片机(郭天祥版)——键盘检测原理及应用实现 - 2

    实验中我们使用的是52单片机目录前言一、单片机是什么?二、实验步骤1.独立键盘检测1.2代码如下(示例):1.3图片1.4视频2.矩阵键盘检测2.2代码如下(示例):2.3图片2.4视频总结:以上就是今天要讲的内容,本文仅仅简单介绍了单片机键盘检测的应用实现,而单片机键盘检测相关理论可以参考教材进行学习前言文章内主要概念引自郭天祥老师《新概念51单片机C语言版》一书主要展示郭天祥老师书中第四章键盘检测原理及应用实现。分为仿真、实体两部分。一、单片机是什么?单片机就是在一块硅片上集成了微处理器、存储器及各种输入/输出接口的芯片,这样一块芯片就具有了计算机的属性,因而被成为单片微型计算机,简称单片

随机推荐