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模型是国际标准的网络模型,它由七层组成,从上到下分别是:应用层,表示层,会话层,传输层,…...
了解 CSS position 属性
CSS position 属性 在前端开发中,布局是一个至关重要的部分,而 CSS 的 position 属性是控制元素在页面中位置的核心工具。 本文将解释 CSS 中的 position 属性,包括其不同的值、效果及典型使用场景,以帮助你更好地理解和应用这一…...
数据结构 【二叉树(上)】
谈到二叉树,先来谈谈树的概念。 1、树的概念及结构 树是一种非线性的数据结构,它的逻辑关系看起来像是一棵倒着的树,也就是说它是根在上,而叶子在下的, 在树这种数据结构中,最顶端的结点称为根结点。在树的…...
C++11(中)
C11(中) 1.可变参数模板1.1.使用场景 2.lambda表达式(重要)2.1.使用说明2.2.函数对象与lambda表达式 3.线程库3.1.thread3.2.atomic原子库操作3.3.mutex3.3.1.mutex的种类3.3.2.lock_guard3.3.3.unique_lock 🌟&#x…...
下拉选择器,选择框,支持单选、多选、筛选和清空功能,支持vue2和vue3
下拉选择器,选择框,支持单选、多选、筛选和清空功能,支持vue2和vue3https://ext.dcloud.net.cn/plugin?id8159 点击即可。 注意数据来源: 选择的:valueName:选择下拉选择显示的显示屏...
HTTP中GET和POST的区别是什么?
HTTP定义: GET:用于获取资源,通常用于请求数据而不改变服务器的状态 POST:用于提交数据到服务器,通常会改变服务器的状态或产生副作用(如创建或更新资源) 参数传递方式: GET&…...
day04 企业级Linux安装及远程连接知识实践
1. 使用传统的网卡命名方式 在启动虚拟机时,按tab键进入编辑模式 添加命令: net.ifnames0 biosdevname0 这样linux系统会使用传统的网卡命名,例如eth0、eth1…… 2. 快照 做系统关键操作时,一定要使用快照(先将系统关机) 3.…...
jvm核心组件介绍
1. 类加载器(ClassLoader): • 想象它是一个快递员,负责把Java类(.class文件)这个“包裹”从磁盘这个“发货地”送到JVM内部这个“目的地”。类加载器确保每个类只被加载一次,并维护一个类的层级…...
uname -m(machine) 命令用于显示当前系统的机器硬件架构(Unix Name)
文章目录 关于 arm64 架构检查是否安装了 Rosetta 2其他相关信息解释:命令功能:示例: dgqdgqdeMac-mini / % uname -m arm64您运行的 uname -m 命令显示您的系统架构是 arm64。这意味着您的 Mac Mini 使用的是 Apple 的 M1 或更新的芯片&…...
Pgsql:json字段查询与更新
1.查询json字段的值 SELECT attribute_data->>设施类别 mycol, * FROM gis_coord_data WHERE attribute_data->>设施类别阀门井 查询结果如下: 2.更新json字段中的某个属性值 UPDATE gis_coord_data SET attribute_data(attribute_data::jsonb ||{&quo…...
类的加载机制
类加载的概念 类加载是 Java 虚拟机(JVM)把字节码文件(.class 文件)转变为 Java 类型的复杂且关键的过程。这就如同把一份详细的设计图纸(字节码文件)加工成一个可以实际运行和使用的软件模块(J…...
网站页面静态化方案/网络事件营销
计算机网络:自顶向下方法第一章:计算机和因特网1、什么是因特网1、因特网具体构成不管是桌面PC、手机、Linux工作站等等,这些所有设备都称为主机或端系统。端系统通过通信链路(communication link)和分组交换机(packet switch)连接到一起&…...
wordpress视频解析主题/培训机构不退钱最怕什么举报
前言关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类的介绍,还有就是在线例子:esri 官网在线例子,这个也是学习…...
钦北区网站建设/客户管理软件哪个好用
也许这个话题并不新鲜,因为LD_PRELOAD所产生的问题由来已久。不过,在这里,我还是想讨论一下这个环境变量。因为这个环境变量所带来的安全问题非常严重,值得所有的Unix下的程序员的注意。 在开始讲述为什么要当心LD_PRELOAD环 境…...
中山低价网站建设/重庆百度
环境 Elasticsearch版本:7.13.2 实例 判断索引是否存在: 发送一个head请求即可,返回200则索引存在,404则不存在。 curl -i -XHEAD http://localhost:9200/usersElasticsearch.NetNEST写法: bool isExists _client.Indices.E…...
wordpress的php.ini/重庆百度推广电话
电脑时间不准怎么调呢?每次开机时间总是不对,调整过来又变回去,真是让人抓狂。其实是设置方法不太对哦,这时候就需要使用文中第二种自动获取时间的方法,使电脑时间与网络时间同步就可以啦。大家都知道电脑时间是指网络…...
赌博类网站开发/今日疫情最新消息全国31个省
split函数中的分隔符默认为空格,可以用" "或者 代替,但是不能用""或者,否则会报语法错 编程题目:字符串最后一个单词的长度 自己的代码: str_origin str(input()) if len(str_origin) < in…...