基于51单片机的智能小车:按键调速、障碍跟踪、红外循迹与数码管显示(一个合格的单片机课设)

引言

在嵌入式系统领域,51单片机因其简单易用、成本低廉的特点,一直是入门学习的理想平台。今天我将分享一个基于51单片机的多功能智能小车项目,它集成了按键PWM调速障碍物跟踪红外循迹数码管显示四大功能。这个项目不仅涵盖了嵌入式开发的核心技术点,也是理解实时控制系统的绝佳案例。

项目概述

该智能小车系统通过以下硬件和软件模块协同工作:

  • 主控制器:STC89C52RC(经典51内核单片机)

  • 驱动模块:L298N电机驱动板

  • 感知模块:红外循迹传感器×3,超声波测距模块

  • 交互模块:4位共阴数码管,独立按键×3

  • 电源模块:18650锂电池组(7.4V)

关键硬件说明

  1. L298N驱动电路

    • 双H桥设计,可同时控制两个直流电机

    • 支持PWM调速和正反转控制

    • 最大输出电流2A,满足小车动力需求

  2. 红外循迹传感器

    • 基于TCRT5000反射式红外传感器

    • 检测距离2-10mm可调

    • 数字输出(0/1)简化处理逻辑

  3. 超声波测距

    • HC-SR04模块,测量范围2cm-400cm

    • 精度可达3mm

    • 用于障碍物检测和跟踪

软件架构

主程序流程图

核心模块实现

1.  按键检测

  采用状态机思想在定时器中断中利用中断周期跳转时间进行消抖

#include <reg52.h>
#include "key.h"sbit key_s1 = P3^0 ;sbit key_s2 = P3^1 ;sbit key_s3 = P3^2 ;sbit key_s4 = P3^3 ;struct keys key[4]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},
};
void getkey(void)
{unsigned char i;key[0].key_sta = key_s1;key[1].key_sta = key_s2;key[2].key_sta = key_s3;key[3].key_sta = key_s4;for( i=0;i<4;i++) {switch (key[i].judge_sta) {case 0:{if(key[i].key_sta==0)  key[i].judge_sta=1;}   // 第一次判断按键是否按下break;case 1:{if(key[i].key_sta==0) {key[i].judge_sta=2;key[i].single_flag=1;}else key[i].judge_sta=0;}   // 10ms(因为定时器终端周期设置为10ms)后判断按键是否真的按下break;case 2:{if(key[i].key_sta==1){key[i].judge_sta=0;}}  // 回到初始化break;}}}        
2.  PWM调速系统
unsigned char cunt,com=80;
// 定时器0初始化(10ms中断)
void  carrun(unsigned char );
void Timer0_Init(void) {		   //初始化小车TMOD &= 0xF0;   // 清除T0控制位						  TMOD |= 0x01;   // 设置T0为模式1(16位定时器)TH0 = 0xDC;     // 10ms定时初值(11.0592MHz晶振)TL0 = 0x00;ET0 = 1;        // 使能T0中断TR0 = 1;        // 启动T0
}
// 定时器0中断服务函数
void Timer0_ISR(void) interrupt 1 {TH0 = 0xDC;        // 重装初值TL0 = 0x00;	getkey();if(key[0].single_flag==1)  //检测按键按下增加占空比{if(com<100){com+=10;}else com=10;key[0].single_flag=0;key[1].single_flag=0;}if(key[1].single_flag==1)  //  按键2按下改变 车辆行驶状态{log++;log %=4;}
}// 100us中断
void Timer1_Init(void) {	   TMOD &= 0xF0;   // 清除T1控制位						  TMOD |= 0x10;   // 设置T1为模式1(16位定时器)TH1 = 0xFF;     // 10ms定时初值(11.0592MHz晶振)TL1 = 0x9C;ET1 = 1;        // 使能T1中断TR1 = 1;        // 启动T1
}
// 定时器0中断服务函数
void Timer1_ISR(void) interrupt 3 {	  //模拟pwm波TH1 = 0xFF;        // 重装初值TL1 = 0x9C;		   cunt++;cunt%=100;	   //占空比调速s2=led2;s3=led3;		//循迹s4=led4;s5=led5;	 // 跟随红外感应状态if(cunt<com)	        // 调整占空比 {carrun(0);}else{carrun(1);}
}
void  carrun(unsigned char en)
{EN1 = en;  //为1 左电机使能EN2 = en;  //为1 右电机使能
}
3.  障碍物跟踪算法

// 超声波测距函数
float Get_Distance() {unsigned int time = 0;float distance = 0;TRIG = 0;delay_us(2);TRIG = 1;delay_us(10);TRIG = 0;while(!ECHO); // 等待回波高电平TR1 = 1;      // 启动定时器1while(ECHO);  // 等待回波结束TR1 = 0;      // 停止定时器1time = TH1 * 256 + TL1;TH1 = 0;TL1 = 0;distance = time * 0.017; // 计算距离 (cm)return distance;
}// 障碍物跟踪控制
void Obstacle_Tracking() {float dist = Get_Distance();if(dist < 10) { // 前方障碍物太近 - 后退Motor_Backward();} else if(dist < 30) {// 理想跟踪距离 - 前进Motor_Forward();}else {// 寻找障碍物 - 旋转Motor_Turn_Right();}
}
4.   红外循迹算法
void Line_Tracking() {u8 track_status = (TRACK_L << 2) | (TRACK_M << 1) | TRACK_R;switch(track_status) {case 0b000: // 000 - 无线Motor_Forward();break;case 0b001: // 001 - 右偏Motor_Turn_Left();break;case 0b010: // 010 - 居中Motor_Forward();break;case 0b011: // 011 - 右偏Motor_Turn_Left();break;case 0b100: // 100 - 左偏Motor_Turn_Right();break;case 0b101: // 101 - T字路口Motor_Forward();break;case 0b110: // 110 - 左偏Motor_Turn_Right();break;case 0b111: // 111 - 十字路口Motor_Forward();break;}
}

 注:   传感器数据都在定时器中断里实时更新

实现效果 

51小车按键调速效果

51按键调速效果

51小车红外循迹效果

51小车红外循迹效果

51下车障碍物跟随效果

红外循迹

结语

通过这个51单片机智能小车项目,我们实践了:

  • 定时器中断配置

  • PWM波形生成

  • 多传感器数据融合

  • 实时控制系统设计

  • 人机交互实现

虽然51单片机资源有限,但通过精心设计仍然可以实现复杂的嵌入式系统。该项目不仅锻炼了硬件设计能力,也提升了软件优化技巧,是嵌入式开发入门的绝佳实践。

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

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

相关文章

Java异常处理(try-catch-finally):像医生一样处理程序的“感冒”

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、从一个真实问题开始&#xff1a;为什么需要异常处理&#xff1f; 假设你正在开发一个文件读取工具&#xff0c;用户输入文件名后&#xff0c;程序会读…

PostgreSQL 数据库故障与性能高效实时监测技术深度解析

关键词&#xff1a; postgresql 故障与性能监控 &#x1f4d1; 文章目录 1. 引言与监控重要性 2. PostgreSQL监控体系架构 3. 故障监控核心技术 4. 性能监控关键指标 5. 实时监测技术实现 6. 监控工具选型与部署 7. 故障预警与自动化响应 8. 性能调优监控策略 9. 最佳…

logrotate 踩坑

我的logrotate配置&#xff0c;原本运行正常&#xff0c;最近几天发现轮转失败&#xff0c;两个目录下的日志全部无法轮转&#xff0c;于是开始排查问题 /data01/logs/test1/*.log /data01/logs/test2/*.log {missingokrotate 1notifemptycreate 0644 www-data admsharedscrip…

FastGPT、百度智能体、Coze与MaxKB四大智能体平台在政务场景下的深度对比

在生成式AI技术快速迭代的浪潮中&#xff0c;百度智能体平台、Coze、FastGPT和MaxKB作为四大智能体开发平台&#xff0c;凭借差异化的技术路径和功能特性&#xff0c;正在重塑政务AI应用的开发范式。本文从功能实现、政务场景适应性等维度展开深度解析&#xff0c;为开发者提供…

基于SpringBoot的美食分享平台-038

一、项目技术栈 Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;采用HTML和Vue相结合开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 …

【C++第三方包安装】Windows与Linux安装配置redis-plus-plus指南

前言 下面主要是对于两种环境安装、配置、使用C的第三方包&#xff08;redis&#xff09;&#xff0c;对于其他的第三方库&#xff0c;也可以使用类似的方法进行类比安装。 且大多数的第三方库都可以利用工具一键安装或手动编译安装。 Windows 要在Windows系统上快速安装和使…

springboot入门之路(二)

系列文章目录 springboot入门之路&#xff08;一&#xff09;连续的学习渐进之路。阅读点击&#xff1a;springboot入门之路(一) 文章目录 系列文章目录3.springboot配置及注意事项3.1继承starter parent3.2使用没有父POM的Spring Boot3.3配置java的编译的版本3.4使用"de…

【开源解析】基于Python+Qt打造智能应用时长统计工具 - 你的数字生活分析师

&#x1f4ca; 【开源解析】基于PythonQt打造智能应用时长统计工具 - 你的数字生活分析师 &#x1f308; 个人主页&#xff1a;创客白泽 - CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f40d;《Python开源项目实战》 &#x1f4a1; 热爱不止于代码&#xff0c;热情源自…

PHP语法基础篇(三):类型转换与常量

"在完成PHP输出函数和字符串操作的学习后&#xff0c;本篇笔记将记录 类型转换和 常量应用的学习过程。作为语法基础篇的第三部分&#xff0c;将重点关注&#xff1a; 类型转换数学函数常量定义&#xff1a;define() 与const 的使用差异魔术常量应用&#xff1a;__LINE__ …

Linux lsof 命令详解+实例

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

【Cobalt Strike手册】客户端界面功能

工具栏 顶部的工具栏提供了快速访问的功能&#xff0c;这些图片的功能从左到右功能以此如下表 创建新的连接断开当前的TeamServerListeners监听器列表以图形化展示表格形式展示表格展示目标管理Web服务查看获取到的认证信息查看下载的文件查看键盘记录查看截屏记录 图形化会话…

FastAPI本地文档的定制技巧

磨刀不误砍柴工&#xff0c;一份清晰的API文档能让前后端协作效率翻倍——源滚滚如是说 在前后端分离开发的今天&#xff0c;接口文档的质量直接决定了团队协作的效率。作为Python领域最受瞩目的现代Web框架&#xff0c;FastAPI最大的亮点之一是其自动化交互式文档功能。但很多…

Python 标准库概览

Python 标准库非常庞大,所提供的组件涉及范围十分广泛,使用标准库我们可以让您轻松地完成各种任务。 以下是一些 Python3 标准库中的模块: os 模块:os 模块提供了许多与操作系统交互的函数,例如创建、移动和删除文件和目录,以及访问环境变量等。 sys 模块:sys 模块提供…

AI大模型:(二)4.1 文生图(Text-to-Image)模型发展史

目录 1.介绍 2.发展历史 2.1.早期探索阶段(1980-2014 年) 2.1.1.卷积神经网络(CNN) 2.1.2.生成对抗网络(GAN)的提出 2.2.GAN主导时代(2015-2018 年) 2.2.1.高分辨率GAN的突破 2.2.2.文本-图像对齐的改进 2.3. Diffusion革命(2021–2022) 2.3.1.扩散模型(D…

vue3实现轮播渲染多张图每张进行放大缩小拖拽功能互不影响

vue3实现轮播渲染多张图每张进行放大缩小拖拽功能互不影响 1.以vue3中el-carousel轮播插件为例 <div class"pic_view"><el-carousel height"100vh" :autoplay"false" ref"carouselRef" change"handleCarouselChange&qu…

traceroute 使用说明

1、概述 Traceroute&#xff08;Windows 系统中为 tracert&#xff09;是一种网络诊断工具&#xff0c;用于跟踪数据包从本地设备到目标主机的传输路径&#xff0c;并显示沿途经过的每一跳&#xff08;路由器&#xff09;的延迟和 IP 地址。它通过发送不同 TTL&#xff08;生存…

用idea操作git缓存区回退、本地库回退、远程库回退

前言 使用idea软件操作git非常人性化和方便。 但是如果我的代码使用git提交之后,我想回到以前的版本,此时需要进行git的版本回退。 提交代码分为提交到缓存区、本地库、远程库这3个过程。 下面我将介绍每个阶段的提交对应的回退方法。 本篇文章是掌握git和使用idea操作git…

webpack+vite前端构建工具 - 3webpack处理js

3 webpack处理js webpack的核心——处理js文件&#xff0c;将模块化的代码打包。具体操作如下 es6转化&#xff08;为兼容老浏览器&#xff0c;将es6转化为es5&#xff09; babel-loader 代码规范&#xff08;例如空格&#xff0c;缩进等代码风格规范&#xff09; eslint 代码…

Nginx转发中相对路径资源302问题的分析与解决

Nginx转发中相对路径资源302问题的分析与解决 典型案例&#xff1a;后端页面引入./test.css的302问题 问题场景 假设我们有一个后端服务&#xff0c;其页面中通过相对路径引入了CSS文件&#xff1a; <!-- 后端页面代码 --> <link rel"stylesheet" href&…

Vue3 + TypeScript合并两个列表到目标列表,并且进行排序,数组合并、集合合并、列表合并、list合并

在Vue 3 TypeScript中合并并排序两个列表&#xff0c;可以通过以下步骤实现&#xff1a; 解决方案代码 vue 复制 下载 <script setup lang"ts"> import { ref, computed } from vue;// 定义列表项类型 interface ListItem {id: number;name: string;valu…