摇头测距小车01_舵机和超声波代码封装

news2024/11/18 11:19:38

目录

一、摇头测距小车图片演示

二、接线方式

三、代码实现


一、摇头测距小车图片演示

就是在小车原有的基础上,在小车前面加一个舵机和一个超声波,把超声波粘在舵机上

二、接线方式

1、超声波接线

VCC-----上官一号5V

GND----上官一号GND

Trig------上官一号P2^3
Echo----上官一号P2^2

2、舵机接线

黄线:PWM信号控制线-------接上官一号P1^1

红线:VCC-----------------------接面包板电源正极(我没有接在上官一号上接太多带不起来)

灰线:GND-----------------------接面包板电源负极(我没有接在上官一号上接太多带不起来)

三、代码实现

main.c

#include "reg52.h"
#include "hc04.h"
#include "delay.h"
#include "sg90.h"

void main()
{
	
	double dis;
	Time0Init();
	Time1Init();
	//舵机的初始位置
	initSG90_0();
	
	while(1){
		//超声波测距
		dis = get_distance();
		if(dis < 10){     //如果小于10cm
			//开盖,灯状态,D5亮
			openStatusLight();
			//舵机开盖
			openDusbin();
			
		}else{
			//关盖,灯状态,D5灭
			closeStatusLight();
			//舵机关盖
			closeDusbin();
		}
	}
}

hc04.c-----超声波相关的代码

//超声波相关的代码
#include "reg52.h"
#include "delay.h"

sbit Trig     = P2^3;
sbit Echo     = P2^2;

void Time1Init(){
	
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x10;		//设置定时器模式
	TL1 = 0;		    //设置定时初值
	TH1 = 0;		    //设置定时初值
	//设置定时器0工作模式1,初始值设定0开始数数
}

void startHC(){
	
	Trig = 0;
	Trig = 1;
	Delay10us();
	Trig = 0;
	
}

double get_distance(){
	
	double time;
	//定时器数据清零,以便下次测距
	TL1 = 0;		    //设置定时初值
	TH1 = 0;		    //设置定时初值
	//1、给Trig端口至少10μs的高电平
	startHC();
	//2、由低电平跳转到高电平,表示开始发送波
	while(Echo == 0);
	//3、波发出去时,开启定时器
	TR1 = 1;
	//4、由高电平跳转到低电平,表示接收波
	while(Echo == 1);
	//5、波回来那一下,我们停止定时器
	TR1 = 0;
	//6、计算出中间经过多长时间
	time = (TH1 * 256 + TL1) * 1.085;  //μs为单位
	//7、距离 = 速度(340m/s)* 时间 /2
	//dis= 340m/s = 34000cm/s = 34cm/ms = 0.034cm/μs
	return (time * (0.034/2));

}

hc04.h

double get_distance();
void Time1Init();

delay.c


void Delay2000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	i = 15;
	j = 2;
	k = 235;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void Delay150ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	i = 2;
	j = 13;
	k = 237;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void Delay10us()		//@11.0592MHz
{
	unsigned char i;
	i = 2;
	while (--i);
}

delay.h

void Delay2000ms();
void Delay150ms();
void Delay10us();

sg90.c-----舵机的代码

//舵机的代码
#include "reg52.h"
#include "delay.h"

//距离小于10cm,D5亮,D6灭,反之相反现象
sbit D5       = P3^7;
sbit D6       = P3^6;
sbit sg90_con = P1^1;

int cnt = 0;
int jd;

void Time0Init(){

	//1、配置定时器0工作模式位16位计时
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	//2、给定时器一个初值,每个周期都等于0.5ms
	TL0 = 0x33;
	TH0 = 0xFE;
	//3、定时器开始计时
	TR0 = 1;
	TF0 = 0;
	
	//4、打开中断定时器
	ET0 = 1;
	//5、设置总中断定时器
	EA = 1;
	
}

void openStatusLight(){
	D5 = 0;
	D6 = 1;
}

void closeStatusLight(){
	D5 = 1;
	D6 = 0;
}

void openDusbin(){  //舵机开盖
	jd = 3;      //90度,1.5ms的高电平
	cnt = 0;     //每切换一次角度,都要重置cnt的值
	Delay2000ms();

}

void closeDusbin(){  //舵机关盖
	jd = 1;      //0度,1.5ms的高电平
	cnt = 0;     //每切换一次角度,都要重置cnt的值
	Delay150ms();
}

void initSG90_0(){

	jd = 1;        //初始角度是0度,什么时候0度,刚好是0.5ms的高电平,也是定时器溢出1次
	cnt = 0;
	sg90_con = 1;  //刚开始给PWM信号一个高电平
	
}

void Time0Handler() interrupt 1   //定时器0的中断号为 interrupt 1
{
	
	cnt ++;           //统计爆表的次数
	//给定时器重新定义初值,每个周期都等于0.5ms
	TL0 = 0x33;      
	TH0 = 0xFE;
	//控制PWM波形
	if(cnt < jd){
		sg90_con = 1;
	}else{
		sg90_con = 0;
	}
	
	if(cnt == 40){   //要爆表40次,经过了20ms
			cnt = 0;      //当100次表示1s,重新让cnt从0开始,计算下一次的1s
			sg90_con = 1;
	}
}

sg90.h

void Time0Init();
void openStatusLight();
void closeStatusLight();
void openDusbin();
void closeDusbin();
void initSG90_0();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/163827.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

.net开发安卓入门-Dialog

.net开发安卓入门-DialogAndroid.App.AlertDialog运行效果代码UI源码引入 下面这个类库才可以使用Java.Interop.Export特性绑定事件Android.App.AlertDialog https://learn.microsoft.com/zh-cn/dotnet/api/android.app.alertdialog?viewxamarin-android-sdk-13 SetTitle &…

nodejs+vue摄影跟拍预定管理系统

&#xff0c;本系统分为用户&#xff0c;摄影师&#xff0c;管理员三个角色&#xff0c;用户可以注册登陆系统&#xff0c;查看摄影套餐&#xff0c;预约套餐&#xff0c;购买摄影周边商品&#xff0c;查看跟拍照片等。摄影师可以对用户的摄影预约审核&#xff0c;跟拍流程管理…

【Java集合】ArrayList自动扩容机制分析

目录 先从 ArrayList 的构造函数说起 一步一步分析 ArrayList 扩容机制 先来看 add 方法 再来看看 ensureCapacityInternal() 方法 ensureExplicitCapacity()和calculateCapacity方法 下面我们接着来看grow() 方法 再来看一下grow()中调用的hugeCapacity() 方法 System.arrayco…

3、代码注释与编码规范

目录 一、代码注释 &#xff08;1&#xff09;单行注释 &#xff08;2&#xff09;多行注释 &#xff08;3&#xff09;文档注释 2. 编码规范 一、代码注释 &#xff08;1&#xff09;单行注释 “//”为单行注释标记&#xff0c;从符号“//”开始直到换行为止的所有内容…

3D立体字生成器【免费在线工具】

Text2STL是一个可以在线使用的免费的3D立体字生成工具&#xff0c;输入文字内容即可实时预览生成的3D立体字模型&#xff0c;还可以导出为STL模型用于3D打印&#xff1a; 3D立体字生成器访问地址&#xff1a; http://text2stl.bimant.com/zh-cn/generator 1、3D立体字生成风…

【零基础】学python数据结构与算法笔记11

文章目录前言65.树的概念66.树的实例&#xff1a;模拟文件系统67.二叉树的概念68.二叉树的遍历69.二叉搜索树的概念。70.二叉搜索树&#xff1a;插入71.二叉搜索树&#xff1a;查询72.二叉搜索树&#xff1a;删除73.二叉搜索树&#xff1a;删除实现总结前言 学习python数据结构…

中本聪是个贪婪的矿工吗?

对可能是中本聪的实体所表现出的挖矿行为的技术分析。文 | Jameson Lopp. 原标题&#xff1a;Was Satoshi a Greedy Miner?. 2022/9/16.* * *如果你在加密生态系统中待了足够久的时间&#xff0c;那么你无疑会听到这样的论点&#xff0c;即某些项目的代币分配不公平&#xff0…

Windous注册表+c#操作

下面将会分享注册表的基础知识及C# 读写注册表的方法 了解注册表 注册表&#xff08;英语&#xff1a;Registry&#xff0c;中国大陆译作注册表&#xff0c;台湾、港、澳译作登录档&#xff09;是Microsoft Windows操作系统和其应用程序中的一个重要的层次型数据库&#xff0…

关于计算机网络,你需要知道的一些常识

最近闲着没啥事翻开之前大学时候谢希仁老师第7版的《计算机网络》这本书,结果发现了一些之前没有发现的常识。 首先是互联网与互连网的区别,一般我们常说的互联网是Internet,是指因特网,其起源于阿帕网ARPANT。或许很多读者看到这里就觉得有什么秘密可言,不都是常识了吗?看你大…

如何在Vue3+js项目(脚手架)中使用(下载安装及运行)element-plus以及解决使用过程中遇到的问题

文章目录 &#x1f4cb;前言 &#x1f3af;关于 ElementUI 框架描述 &#x1f9e9;设计原则 1️⃣一致 Consistency 2️⃣反馈 Feedback 3️⃣效率 Efficiency 4️⃣可控 Controllability &#x1f9e9;环境支持 &#x1f3af;安装element-plus &#x1f9e9;遇到的问…

【随笔】博客质量分计算,如何让自己的博客脱颖而出,也许文章能够给你答案

作者&#xff1a;小5聊 简介&#xff1a;一只喜欢全栈方向的程序员&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff0c;尽绵薄之力答疑解惑&#xff01; 公众号&#xff1a;有趣小馆&#xff0c;一个有趣好玩的关键词回复互动式公众号&#xff0c;欢迎前来体验 1、…

TSF微服务治理实战系列(四)——服务安全

一、导语 **道路千万条&#xff0c;安全第一条。治理不规范&#xff0c;老板两行泪”。**当企业从单体架构逐渐转向微服务架构时&#xff0c; 服务安全 的需求也随之分散到了整个微服务体系的各个部分中。这就需要构建一套配置活、成本低的安全防控体系&#xff0c;覆盖请求链…

基于javaweb(springboot)城市地名地址信息管理系统设计和实现

基于javaweb(springboot)城市地名地址信息管理系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文…

日志门面和日志框架(SpringBoot日志实现)

一、Springboot日志实现简介 SpringBoot是现今市场上最火爆用来简化spring开发的框架&#xff0c;springboot日志也是开发常用的日志系统。SpringBoot默认就是使用SLF4J作为日志门面&#xff0c;Logback作为日志实现来记录日志。 二、application.yml修改日志相关的配置 appl…

Spring入门-IOC/DI相关配置与使用(1)

文章目录Spring入门1&#xff0c;Spring介绍1.1 为什么要学?1.2 学什么?1.3 怎么学?2&#xff0c;Spring相关概念2.1 初识Spring2.1.1 Spring家族2.1.2 了解Spring发展史2.2 Spring系统架构2.2.1 系统架构图2.2.2 课程学习路线2.3 Spring核心概念2.3.1 目前项目中的问题2.3.…

修改RT-Thread 的启动流程,实现显式调用rtthread_startup

一、STM32 单片机的启动流程 单片机上电后&#xff0c;会首先执行定义在startup 文件 中的Reset_Handler 函数&#xff0c;Reset_Handler 函数会首先执行SystemInit 函数&#xff0c;执行完之后&#xff0c;再执行我们常见的main 函数。 二、RT-Thread 启动函数是怎么被调用的…

什么是最少知识原则?-外观模式

外观模式将一个或数个类的复杂的一切都隐藏在背后&#xff0c;只显露出一个干净美好的外观。 构建自己的家庭影院 //打开爆米花机&#xff0c;开始爆米花 popper.on(); popper.pop();//调整灯光亮度 lights.dim(10);//把屏幕放下 screen.down();//打开投影仪 projector.on();…

【阶段三】Python机器学习32篇:机器学习项目实战:关联分析的基本概念和Apriori算法的数学演示

本篇的思维导图: 关联分析模型:Apriori算法 关联分析的基本概念和Apriori算法 关联分析是数据挖掘中一种简单而实用的技术,它通过深入分析数据集,寻找事物间的关联性,挖掘频繁出现的组合,并描述组合内对象同时出现的模式和规律。例如,对超市购物的数据进行关联…

缓存Cache-Control

可缓存性指定哪些地方可以缓存publichttp请求返回的过程中&#xff0c;http请求返回的内容所经过的任何路径包括&#xff1a;中间的代理服务器&#xff0c;发出请求的客户端浏览器&#xff0c;都可以对返回的内容进行缓存。private发起请求的浏览器可以缓存。no-cache任何节点都…

【程序员高效率工具】PlantUML —— 使用代码快速绘制时序图、思维导图

本篇思维导图 前言 不管是在工作还是学习&#xff0c;特别是在项目计划初期&#xff0c;我们需要画大量的图将工作内容、项目方案等进行可视化描述&#xff0c;包括但不限于时序图、类图、思维导图等等。 但是对于不经常画图&#xff0c;或者经常使用键盘的孩子&#xff0c;手…