基于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
英文地址,請注明出處:http://en.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…