51单片机从入门到精通:理论与实践指南(一)
单片机在智能控制领域的应用已非常普遍,发展也很迅猛,学习和使用单片机的人员越来越多。虽然新型微控制器在不断推出,但51单片机价格低廉、易学易用、性能成熟,在家电和工业控制中有一定的应用,而且学好了51单片机,也就容易学好其他的新型微控制器(AVR、PIC、STM8、STM32等),另外,51单片机的例程很容易移植到其他单片机系统中。因此,现在的大中专院校学生都将51 单片机作为入门首选。为了帮助零基础(指没有单片机基础和C语言编程经验)的初学者快速入门和提高,我想着写几篇博客,和大家讲解一下单片机。
学习51单片机是一个循序渐进的过程,涉及理论知识的学习和实际项目的实践。
下面我会详细介绍从零开始学习51单片机的全过程,包括学习内容、方法、应用场景以及具体的案例和代码。
1. 学习内容
1.1 基础知识
- 数字电子技术:了解基本的数字电路知识,如逻辑门、触发器等。
- 计算机组成原理:理解计算机的基本工作原理,包括CPU、内存、输入输出等。
- C语言基础:虽然51单片机可以用汇编语言编程,但C语言更为常用且容易上手。
1.2 51单片机的基本结构
- CPU:中央处理器,负责执行指令。
- 内部RAM:128字节,用于存储数据变量。
- 外部RAM:可以通过扩展接口连接外部RAM。
- 程序存储器:通常使用Flash存储器,存储程序代码。
- I/O端口:4个8位双向I/O端口(P0、P1、P2、P3)。
- 定时/计数器:2个16位定时/计数器(Timer0和Timer1)。
- 中断系统:支持多个中断源,如定时器溢出中断、外部中断等。
- 串行通信接口:内置UART,支持串行通信。

2. 学习方法
2.1 学习资源
- 书籍:推荐一些经典的51单片机书籍,如《51单片机完全学习手册》、《单片机原理及应用》等。
- 在线课程:许多在线平台(如慕课网、B站、YouTube)提供免费或付费的51单片机教程。
- 官方文档:阅读单片机的数据手册和用户手册,了解具体的寄存器配置和功能。
2.2 开发环境搭建
- 编程软件:安装Keil uVision或IAR Embedded Workbench等开发工具。
- 仿真器:使用Proteus或其他仿真软件进行虚拟仿真,验证程序逻辑。
- 开发板:购买一块51单片机开发板,如STC89C52RC、AT89S52等,进行实际操作。
3. 实践项目
3.1 基础实验
3.1.1 LED闪烁实验
硬件连接
- 将一个LED连接到P1.0引脚,通过一个限流电阻接地。
软件代码
#include <reg52.h> // 包含51单片机的寄存器定义// 延时函数 void delay(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++) {for (j = 0; j < 1275; j++);} }void main() {while (1) {P1 = 0x01; // P1.0 输出高电平,LED亮delay(500); // 延时500毫秒P1 = 0x00; // P1.0 输出低电平,LED灭delay(500); // 延时500毫秒} }
Proteus仿真
- 在Proteus中创建一个新的电路图。
- 添加51单片机(例如STC89C52RC)。
- 添加一个LED和一个限流电阻,将LED的阳极连接到P1.0,阴极通过电阻接地。
- 将编译好的HEX文件加载到单片机中,运行仿真。
Proteus简介
Proteus软件是英国Lab Center Electronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是比较好的仿真单片机及外围器件的工具。虽然国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。
Proteus是英国著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DSPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MATLAB等多种编译器。可自行百度了解
https://baike.baidu.com/item/proteus/752902
3.1.2 按键检测实验
硬件连接
- 将一个按键连接到P3.0引脚,通过一个上拉电阻连接到VCC。
软件代码
#include <reg52.h>// 延时函数 void delay(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++) {for (j = 0; j < 1275; j++);} }// 按键去抖动函数 bit key_scan(bit key) {if (key == 0) { // 检测到按键按下delay(10); // 延时消抖if (key == 0) {while (!key); // 等待按键释放return 1; // 返回按键有效}}return 0; // 返回按键无效 }void main() {while (1) {if (key_scan(P3_0)) { // 检测P3.0上的按键P1 = 0x01; // 按键按下时,P1.0 输出高电平,LED亮delay(500);P1 = 0x00; // 按键松开时,P1.0 输出低电平,LED灭}} }
Proteus仿真
- 在Proteus中创建一个新的电路图。
- 添加51单片机(例如STC89C52RC)。
- 添加一个按键和一个上拉电阻,将按键的一端连接到P3.0,另一端接地。
- 将编译好的HEX文件加载到单片机中,运行仿真。
3.2 进阶实验
3.2.1 数码管显示实验
硬件连接
- 将一个共阴极数码管连接到P0端口。
- 将段选线连接到P0.0-P0.6,位选线连接到P0.7。
软件代码
#include <reg52.h>// 显示字符的字形码表 const unsigned char code seg_code[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};// 显示数字0-9 void display_digit(unsigned char digit) {P0 = seg_code[digit] | 0x80; // 设置段选线和位选线 }void main() {while (1) {for (unsigned char i = 0; i < 10; i++) {display_digit(i);delay(500);}} }
Proteus仿真
- 在Proteus中创建一个新的电路图。
- 添加51单片机(例如STC89C52RC)。
- 添加一个共阴极数码管,将段选线连接到P0.0-P0.6,位选线连接到P0.7。
- 将编译好的HEX文件加载到单片机中,运行仿真。
3.3 综合项目
3.3.1 温度传感器读取实验
硬件连接
- 将DS18B20温度传感器连接到P1.4引脚。
- 将一个4.7kΩ的上拉电阻连接到DS18B20的DQ引脚和VCC之间。
软件代码
#include <reg52.h> #include <stdio.h>sbit DS18B20_PIN = P1^4;// 初始化DS18B20 void DS18B20_Init() {DS18B20_PIN = 1; // 上拉DS18B20_PIN = 0; // 发送复位脉冲delay(1);DS18B20_PIN = 1; // 释放总线while(DS18B20_PIN); // 等待DS18B20响应 }// 写入一个字节到DS18B20 void DS18B20_WriteByte(unsigned char dat) {unsigned char i;DS18B20_PIN = 0; // 拉低总线for (i = 0; i < 8; i++) {DS18B20_PIN = 0; // 拉低总线DS18B20_PIN = dat & 0x01; // 发送数据位dat >>= 1;DS18B20_PIN = 1; // 释放总线delay(1);} }// 从DS18B20读取一个字节 unsigned char DS18B20_ReadByte() {unsigned char i, dat = 0;for (i = 0; i < 8; i++) {DS18B20_PIN = 0; // 拉低总线DS18B20_PIN = 1; // 释放总线delay(1);dat |= (DS18B20_PIN << i); // 读取数据位delay(1);}return dat; }// 读取温度值 float DS18B20_ReadTemp() {unsigned char TL, TH;float temp;DS18B20_Init();DS18B20_WriteByte(0xCC); // 跳过ROM命令DS18B20_WriteByte(0x44); // 启动温度转换DS18B20_Init();DS18B20_WriteByte(0xCC); // 跳过ROM命令DS18B20_WriteByte(0xBE); // 读取温度寄存器TL = DS18B20_ReadByte(); // 读取低字节TH = DS18B20_ReadByte(); // 读取高字节temp = ((TH << 8) + TL) * 0.0625;return temp; }void main() {float temperature;while (1) {temperature = DS18B20_ReadTemp();// 可以在这里添加代码将温度显示在数码管或其他设备上delay(1000); // 每秒读取一次温度} }
Proteus仿真
- 在Proteus中创建一个新的电路图。
- 添加51单片机(例如STC89C52RC)。
- 添加DS18B20温度传感器,将DQ引脚连接到P1.4,VCC连接到电源,GND接地。
- 将编译好的HEX文件加载到单片机中,运行仿真。
4. 应用场景
4.1 家用电器
- 智能灯光控制:通过单片机控制LED灯的开关和亮度,可以实现远程控制和定时开关。
- 温度控制:使用温度传感器监测室内温度,通过单片机控制空调或加热器的工作状态。
4.2 工业控制
- 电机控制:通过单片机控制电机的速度和方向,实现精确的运动控制。
- 传感器数据采集:使用单片机采集各种传感器的数据,如温度、湿度、压力等,用于实时监控和数据分析。
4.3 医疗设备
- 心率监测:通过单片机采集心率传感器的数据,实现心率监测和报警功能。
- 血压监测:使用单片机控制血压计的工作,采集血压数据并显示结果。
4.4 智能家居
- 智能门锁:通过单片机控制门锁的开闭,支持密码、指纹等多种认证方式。
- 环境监测:使用单片机采集室内的温度、湿度、光照等数据,通过无线通信模块发送到云端,实现远程监控。
5. 总结
学习51单片机是一个从基础到高级的过程,需要不断实践和积累经验。
通过上述的基础实验和进阶实验,你可以逐步掌握51单片机的各种功能和应用。
相关文章:
51单片机从入门到精通:理论与实践指南(一)
单片机在智能控制领域的应用已非常普遍,发展也很迅猛,学习和使用单片机的人员越来越多。虽然新型微控制器在不断推出,但51单片机价格低廉、易学易用、性能成熟,在家电和工业控制中有一定的应用,而且学好了51单片机&…...
零基础3分钟快速掌握 ——Linux【终端操作】及【常用指令】Ubuntu
1.为啥使用Linux做嵌入式开发 能广泛支持硬件 内核比较高效稳定 原码开放、软件丰富 能够完善网络通信与文件管理机制 优秀的开发工具 2.什么是Ubuntu 是一个以桌面应用为主的Linux的操作系统, 内核是Linux操作系统, 具有Ubuntu特色的可视…...
C#中面试的常见问题007
1.在EF中实现一个实体对应多个表 1. 表拆分(Table Splitting) 表拆分是指将一个实体映射到两个或多个表中的行。这通常发生在实体的属性分布在不同的表中,但这些表通过外键关联到同一个主表。在EF Core中,可以通过Fluent API来配…...
人工智能——大语言模型
5. 大语言模型 5.1. 语言模型历史 20世纪90年代以前的语言模型都是基于语法分析这种方法,效果一直不佳。到了20世纪90年代,采用统计学方法分析语言,取得了重大进展。但是在庞大而复杂的语言信息上,基于传统统计的因为计算量巨大…...
nodejs第三方库sharp对图片的操作生成新图片、压缩、添加文字水印及图片水印等
Sharp是一个基于libvips的高性能Node.js图像处理库,它提供了广泛的功能,包括调整大小、裁剪、旋转、格式转换等。Sharp可以处理多种图像格式,并且能够高效地转换图像格式。 相关说明及用法看:https://sharp.nodejs.cn/ 安装&#…...
力扣第 67 题 “二进制求和”
题目描述 给你两个二进制字符串 a 和 b,以二进制字符串的形式返回它们的和。 示例 1: 输入: a "11", b "1" 输出: "100"示例 2: 输入: a "1010", b "1011" 输出: "10101"提示: 每个字符串仅由…...
Spring Boot优雅读取配置信息 @EnableConfigurationProperties
很多时候我们需要将一些常用的配置信息比如oss等相关配置信息放到配置文件中。常用的有以下几种,相信大家比较熟悉: 1、Value(“${property}”) 读取比较简单的配置信息: 2、ConfigurationProperties(prefix “property”)读取配置信息并与 …...
鸿蒙多线程开发——Sendable对象的序列化与冻结操作
1、Sendable对象的序列化与反序列化 Sendable对象的简单介绍参考文章:鸿蒙多线程开发——线程间数据通信对象03(sendable) 与JSON对象的序列化和反序列化类似,Sendable对象的序列化和反序列化是通过ArkTs提供的ASON工具来完成。 与JSON类似࿰…...
nodepad配置c/c++ cmd快速打开创建项目文件
前提:下载MinGw,并且配置环境变量 点击阅读次篇文章配置MinGw 无论是哪个编译器,执行c文件都是经历以下步骤: 编译文件生成exe文件执行该exe文件 我们先手动完成这两部 手动编译文件使用指令 gcc {你的c文件} -o {生成文件名}生成exe文件 第二步运行exe直接点击该文…...
【C++】读取数量不定的输入数据
读取数量不定的输入数据 似乎是一个很实用的东西? 问题: 我们如何对用户输入的一组数(事先不知道具体有多少个数)求和? 这需要不断读取数据直至没有新的输入为止。(所以我们的代码就是这样设计的&#x…...
ESC字符背后的故事(27 <> 033 | x1B ?)
ANSI不可见字符转义,正确的理解让记忆和书写变得丝滑惬意。 (笔记模板由python脚本于2024年11月26日 15:05:33创建,本篇笔记适合python 基础扎实的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free…...
基于NXP LS1043 OpenWRT智能交通边缘网关设计
0 引言 城市公共交通是与人们生产生活息息相关的重 要基础设施,是关系国计民生的社会公益事业。“城 市公共交通发展的十三五规划”明确指出:建设与移 动互联网深度融合的智能公交系统;推进“互联网 城市公交”发展;推进多元…...
绪论相关题目
1.在数据结构中,从逻辑上可以把数据结构分成( C)。 A. 动态结构和静态结构 B. 紧凑结构和非紧凑结构 C. 线性结构和非线性结构 D. 内部结构和外部结构 2.在数据结构中,从存储结构上可以将之分为( B)。 A. 动态结构和静态结构 B. 顺序存储和非顺序存储 C. 紧凑结构和非紧…...
中国科学院大学研究生学术英语读写教程 Unit7 Materials Science TextA 原文和翻译
中国科学院大学研究生学术英语读写教程 Unit7 Materials Science TextA 原文和翻译 Why Is the Story of Materials Really the Story of Civilisation? 为什么材料的故事实际上就是文明的故事? Mark Miodownik 1 Everything is made of something. Take away co…...
centos系列安装服务器时分区
服务器安装手动分区,标准分区(注意顺序): 自定义标准分区 /boot/efi 200M;/boot 1G 放引导程序和内核文件及根文件; /var 磁盘1/10内存尽量大存放日志文件; /usr 磁盘1/10内存尽量大存在程序软件包; swap 虚…...
vue的理解
什么是vue vue是一套用于构建用户界面的渐进式框架,与其他框架不同的是,vue被设计为可以自底向上逐层应用,它也是创建单页面应用的web应用框架。vue的核心库只关注视图层,不仅易上手,还便于与第三方库或既有项目整合。…...
111. UE5 GAS RPG 实现角色技能和场景状态保存到存档
实现角色的技能存档保存和加载 首先,我们在LoadScreenSaveGame.h文件里,增加一个结构体,用于存储技能相关的所有信息 //存储技能的相关信息结构体 USTRUCT(BlueprintType) struct FSavedAbility {GENERATED_BODY()//需要存储的技能UPROPERT…...
抖音短视频矩阵源代码部署搭建流程
抖音短视频矩阵源代码部署搭建流程 1. 硬件准备 需确保具备一台性能足够的服务器或云主机。这些硬件设施应当拥有充足的计算和存储能力,以便支持抖音短视频矩阵系统的稳定运行。 2. 操作系统安装 在选定的服务器或云主机上安装适合的操作系统是关键步骤之一。推…...
leetcode - LRU缓存
什么是 LRU LRU (最近最少使用算法), 最早是在操作系统中接触到的, 它是一种内存数据淘汰策略, 常用于缓存系统的淘汰策略. LRU算法基于局部性原理, 即最近被访问的数据在未来被访问的概率更高, 因此应该保留最近被访问的数据. 最近最少使用的解释 LRU (最近最少使用算法), 中…...
计算机网络八股整理(一)
计算机网络八股文整理 一:网络模型 1:网络osi模型和tcp/ip模型分别介绍一下 osi模型是国际标准的网络模型,它由七层组成,从上到下分别是:应用层,表示层,会话层,传输层,…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
