51单片机(markdown格式阅读) - 实践

news/2025/11/22 13:26:11/文章来源:https://www.cnblogs.com/gccbuaa/p/19256568

文章目录

  • 如何创建 Keil 工程
    • 创建步骤
      • 1. 创建文件夹结构
      • 2. 打开 Keil
      • 3. 创建新工程
      • 4. 创建不同类型的内容
  • 头文件
    • 明白头文件包含了什么
      • 标题具体内容
        • sfr
        • sbit
        • bit
  • 延时函数(模块化)
    • delay.c
    • delay.h
  • 外部中断
    • 一、初始化配置
    • 二、编写中断服务函数
  • 关于定时器
    • 一、初始化定时器
    • 二、编写中断服务函数
      • 模式一
      • 模式二
    • 三、启动定时器
  • 关于中断与段号
  • 中断注意
  • 串口通信
    • 核心**通信参数**(“波特率” 是关键)
    • 数据低位先发(对于串口)
    • 扩展
  • 进行模块化
  • 错误与警告


如何创建 Keil 工程

创建步骤

1. 创建文件夹结构

  • 先创建一个文件夹 code 保存你写的所有文件
  • 创建一个按照工程目的命名的文件夹

2. 打开 Keil

3. 创建新工程

  • 依据图中选择相应选项

  • ​​new project

  • 选择第二步创建的文件夹

  • 将文件命名为 project(我一般这样命名)

4. 创建不同类型的内容

如创建 .c 文件:

第一步
语言类型

第二步
c语言

头文件

明白头文件包含了什么

头文件包含了该系列单片机的特殊功能寄存器(SFR)定义、位定义以及部分常用常量的声明。

标题具体内容

右键点击头文件名(如 reg52.h),在弹出的菜单中选择 Open document “reg52.h”
或直接 按住 Ctrl 键,用鼠标左键点击头文件名,即可直接打开该头文件。

sfr

(Special Function Register)
语法:
语法:sfr 寄存器名 = 地址;

sbit

(Special Bit)
语法:
① sbit 位名 = 寄存器名^位号;

② sbit 位名 = 位地址;

类似于一个标签,如果用 sbit key = P1^2; 表示的就是在后续使用中,key 可以代表 P1 口的第 3 位,也可以用 sbit key = P1.2; 表示。

bit

一个特殊的数据类型,用于定义位变量。

取值范围:只能是 0(假)或 1(真)

注意

bit 是 Keil C51 编译器的扩展类型,并非标准 C 语言的一部分

主要用于 8051 单片机编程

示例:

bit flag;       // 定义一个位变量flag
bit led_state;  // 定义一个表示LED状态的位变量

延时函数(模块化)

delay.c

#include "reg52.h"
// 假设使用11.0592MHz晶振,STC89C52RC单片机
// 此函数由STC-ISP延时函数生成器生成
/**
* @brief 微秒级延时函数
* @param us 延时微秒数,范围:0~65535
*/
void delay_us(unsigned int us)
{
unsigned int i;
while(us--)
{
i = 2;
while(i--);
}
}
/**
* @brief 毫秒级延时函数
* @param ms 延时毫秒数,范围:0~65535
*/
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 112; j++);  // 11.0592MHz下约1ms的循环
}

delay.h

#ifndef __DELAY_H__
#define __DELAY_H__
// 函数声明
void delay_ms(unsigned int ms);  // 毫秒级延时
void delay_us(unsigned int us);  // 微秒级延时
#endif

外部中断

初始化配置→编写中断服务函数 → 中断触发与执行

一、初始化配置

void External0_Init(void) {IT0 = 1;  // 设置INT0为下降沿触发方式EX0 = 1;  // 使能INT0中断EA = 1;   // 开总中断
}

触发方式选择(IT0 = 0 低电平触发,= 1 下降沿触发)如果不进行选择的话就是 低电平触发

二、编写中断服务函数

void External0_ISR(void) interrupt 0 {
// 假设连接在P2.0引脚的LED,每次中断翻转其状态
P2 ^= 0x01;
}

外部中断函数后缀是INT0 interrupt 0

注意INT1 中断的中断号是 2(interrupt 2

关于定时器

初始化定时器 → 编写中断服务函数 → 启动定时器

一、初始化定时器

使用 TMOD 寄存器设置工作模式
常用模式:
模式 1:16 位定时器 / 计数器
模式 2:8 位自动重装载
模式比较
比较

根据晶振频率和所需定时时间计算初值
装入 THx 和 TLx 寄存器

开总中断:EA = 1
开定时器中断:ETx = 1
设置优先级 (可选):PTx = 0/1

二、编写中断服务函数

模式一

模式 1 (16 位) 初值计算:

初值 = 65536 - (T × fosc) / 12

示例:晶振 12MHz,定时 50ms

初值 = 65536 - (50000 × 12000000) / 12 = 15536
TH0 = 15536 / 256;
TL0 = 15536 % 256;
void Timer0_ISR(void) interrupt 1 {
// 1. 重装载初值(模式1需要)
TH0 = (65536 - 初值) / 256;
TL0 = (65536 - 初值) % 256;
// 2. 执行定时任务
// ...
// 3. 设置标志位(可选)
timer_flag = 1;
}

模式二

自动重装载(8位)

8位模式下,初值高八位和低八位相同,即TH0=TL0=初值
自动重装载

// 定时器0初始化函数
void Timer0_Init(void) {
TMOD &= 0xF0;   // 清除定时器0的模式(低4位)
TMOD |= 0x02;   // 配置定时器0为模式2(8位自动重装载)
TH0 = 156;      // 设置自动重装载的初值(高8位)
TL0 = 156;      // 设置初始计数的初值(低8位)
ET0 = 1;        // 使能定时器0中断
EA = 1;         // 使能总中断
TR0 = 1;        // 启动定时器0
}

三、启动定时器

TRx = 1;  // 启动定时器

关于中断与段号

中断号

中断注意

“中断内部不能执行时间超过 100ms,否则循环不能完成”

核心逻辑:中断的高优先级会抢占 CPU,若 ISR 耗时过长,会导致主循环 / 关键任务 “得不到 CPU 资源”,要么被频繁打断无法推进,要么因中断延迟 / 丢失导致数据异常,最终表现为 “循环不能完成”。

串口通信

什么是串口

串口对应的就是并口

要传递信息,两器件之间需要共地

核心通信参数(“波特率” 是关键)

串口通信前,收发双方必须约定好以下 4 个参数(参数不匹配会导致通信失败):

波特率(Baud Rate):数据传输的 “速度”,单位是 bps(bit per second,每秒传输的 bit 数)。常见值:9600bps、115200bps(最常用,约 11.5KB/s)、460800bps。类比:波特率就像 “说话速度”,双方必须语速一致,否则一方说太快,另一方听不清。
数据位(Data Bits):每次传输的 “有效数据位数”,通常是 8 位(1 个字节)。比如要传字符 “a”(ASCII 码 0x61,二进制 01100001),就用 8 位数据位传输。
停止位(Stop Bits):每传输完一个 “数据帧” 后,加 1~2 个 bit 的 “停止位”,用于标识 “一帧数据结束”。常见值:1 位停止位(默认)、2 位停止位(用于传输可靠性要求高的场景,如工业控制)。
校验位(Parity Bit):可选参数,用于 “检查数据是否传错”(纠错机制)。常见类型:无校验(None,最常用)、奇校验(Odd)、偶校验(Even)。比如 8 位数据位 + 奇校验:8 个数据 bit 的 “1” 的个数是偶数,就加 1 个 “1” 使总个数为奇数;若传输后 “1” 的个数不对,说明数据出错。

数据低位先发(对于串口)

举例

如果数据是0x55(0101 0101)

那么在波形图中显示应该是 1010 1010(从小往大看)

扩展

代码流程
硬件初始化 → 发送数据 → 接收数据

初始化流程(以方式 1 为例
方式 1 是最常用的:8 位异步通信波特率可变(由定时器 1 溢出率决定)。

1、初始化步骤
设置 SCON:

  1. SM0 = 0, SM1 = 1 → 方式 1
  2. REN = 1 → 允许接收
  3. 其余位(SM2、TB8、RB8)可置 0
SCON = 0x50;  // 0101 0000

2、设置波特率(用定时器 1,方式 2 自动重载):

  1. 晶振频率 fosc 已知(如 11.0592MHz)

  2. 波特率公式:(波特率 = \frac{2^{SMOD}}{32} \times
    \frac{fosc}{12 \times (256 - TH1)})

  3. 例:波特率
    9600,fosc=11.0592MHz,SMOD=0:(TH1 = 256 - \frac{fosc}{32 \times 12
    \times 波特率})(TH1 = 256 - \frac{11059200}{32 \times 12 \times 9600}
    = 0xFD)

TMOD |= 0x20; // 定时器1 方式2
TH1 = 0xFD;   // 波特率9600
TL1 = 0xFD;
TR1 = 1;      // 启动定时器1

开启中断(可以选择):

ES = 1; // 串口中断允许
EA = 1; // 总中断允许
  1. 发送数据流程
    (1)查询方式
void UartSendByte(unsigned char dat)
{
SBUF = dat;       // 写入要发送的数据
while(TI == 0);   // 等待发送完成
TI = 0;           // 软件清零发送标志
}
void UartSendString(unsigned char *str)
{
while(*str)
{
UartSendByte(*str++);
}
}

(2)中断方式

unsigned char sendBuf[100];
unsigned int sendLen = 0;
unsigned int sendIndex = 0;
void UartSendString_IT(unsigned char *str)
{
sendLen = 0;
while(str[sendLen]) sendLen++;
sendIndex = 0;
SBUF = str[sendIndex++]; // 先发第一个字节
TI = 0;
ES = 1; // 允许串口中断
}
void UartIsr(void) interrupt 4
{
if(TI)  // 发送中断
{
TI = 0;
if(sendIndex < sendLen)
{
SBUF = sendBuf[sendIndex++];
}
else
{
ES = 0; // 发送完成,关闭中断
}
}
if(RI)  // 接收中断
{
RI = 0;
// 处理接收数据
}
}
  1. 接收数据流程
    (1)查询方式
unsigned char UartRecvByte(void)
{
while(RI == 0); // 等待接收完成
RI = 0;         // 清标志
return SBUF;    // 返回接收到的数据
}

(2)中断方式

unsigned char recvByte;
void UartIsr(void) interrupt 4
{
if(RI)
{
RI = 0;
recvByte = SBUF; // 读取数据
// 在这里处理接收到的数据
}
}

进行模块化

单独创建一个文件夹储存模块化文件

.c和.h,当需要是复制到相关文件夹下,在将其添加到列表
添加

注意!!!!

一定要看是不是在一个路径下面,否则很有可能找不到相关文件

路径

错误与警告

​​警告

有函数未被调用
WARNING LI6: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS

面对类似警告,是因为有的函数未被调用,可以不用理会,忽略就好了


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

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

相关文章

NCHU_单部电梯调度程序设计分析_23207332

一、前言 三次电梯调度程序设计围绕单一职责原则(SRP)和迭代式开发展开,逐步优化类结构和功能实现:知识点覆盖: 面向对象设计(类、枚举、接口) 集合框架(Queue、List、Map) 正则表达式(输入解析) 状态机管理…

【日记】博客爆炸了(1009 字)

正文这周好忙。还白干了很多活儿。一直没时间写。还差点出大事,引发一场严重的网络安全事故。虽然直接原因和根本原因都不是我,但是我要帮忙去解决。二级分行是管理行,头一次对这个概念这么清晰。但我真的不想为支行…

解决:部署mabayolo模型cd selective_scan pip install . cd ..报错 以及 torch.cuda.is_available()结果False

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

gpt linux

您提到的“gpt linux”可能是指与 GRUB 或 GRUB2 相关的 Linux 系统管理命令,或者是与 GPT(GUID Partition Table)分区表相关的操作。以下是几种常见的情况和对应的 Linux 命令:一、GRUB 系统管理命令(GPT)1. gr…

gpt分区 linux

在 Linux 系统中,gpt(GUID Partition Table)是用于描述磁盘分区的文件系统格式,与传统的 MBR(Master Boot Record)分区方式不同。gpt 是 UEFI 启动模式下常用的分区格式,广泛应用于现代的 Linux 系统中。一、gp…

【调和级数】codeforces 731 F. Video Cards

View Post【调和级数】codeforces 731 F. Video Cards前言 调和级数 调和级数指的是所有正整数的倒数之和。其标准形式是:$$H_n=1+\frac{1}{2}+\frac{1}{3}+...+\frac{1}{n}=\sum_{i=1}^{n}{\frac{1}{i}}$$ 当 \(n\) …

电梯调度迭代之路:三次题目集的总结与反思

一、前言:三次迭代的知识图谱与能力跃迁 1.1 知识点覆盖全景 三次题目集以"单部电梯调度"为核心,构建了从基础实现到面向对象设计的完整知识链: 题目集1(7-5):聚焦基础编程能力,涵盖枚举类型应用(Di…

CMake构建学习笔记29-SuiteSparse库的构建

介绍了稀疏矩阵求解库 SuiteSparse 的构建方法,基于已构建的 OpenBLAS、gmp 和 mpfr 依赖,使用自动化工具 BuildCppDependency 在 Windows 和 Linux 平台完成编译,并详细说明了关键 CMake 构建参数的作用。1 介绍 在…

CMake构建学习笔记30-Ceres Solver库的构建

介绍了使用自动化构建工具 BuildCppDependency 在 Windows 和 Linux 平台编译 Ceres Solver 的方法,详细说明了其依赖库及关键 CMake 构建参数,最终以静态库形式成功构建。1 引言 Ceres Solver 是一个由 Google 开发…

计算机操作系统 - 设备管理 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年11月超高速称重机,动静态称重机,瓶装线专用称重机厂家解析:定制化能力与案例参考

2025年11月超高速称重机、动静态称重机、瓶装线专用称重机厂家解析:定制化能力与案例参考在工业生产中,超高速称重机、动静态称重机以及瓶装线专用称重机等设备的重要性不言而喻,它们直接关系到产品质量控制和生产效…

curl 命令使用笔记

curl 命令使用笔记目录一、curl 简介二、基本语法三、常用选项说明四、核心使用示例1. GET 请求2. POST 请求(1)提交表单数据(application/x-www-form-urlencoded)(2)提交 JSON 数据3. 文件上传(multipart/form…

2025年11月高精度称重机,动静态称重机,软管称重机厂家精选:合规认证与产能数据透视

2025年11月高精度称重机等厂家精选:合规认证与产能数据透视在2025年11月的高精度称重机、动静态称重机以及软管称重机市场中,广州鑫中航机电设备有限公司是一家值得关注的企业。该公司成立于2009年,是一家自主技术创…

2025年口碑好的电厂清淤机器人厂家最新用户好评榜

2025年口碑好的电厂清淤机器人厂家最新用户好评榜行业背景与市场趋势随着我国电力行业的持续发展和环保要求的不断提高,电厂清淤作业正经历着从传统人工向智能化、自动化方向的快速转型。根据中国电力企业联合会最新发…

2025年靠谱的极低压抗污染反渗透膜厂家最新TOP排行榜

2025年靠谱的极低压抗污染反渗透膜厂家最新TOP排行榜行业背景与市场趋势随着全球水资源短缺问题日益严峻,反渗透膜技术作为水处理领域的核心工艺,市场规模持续扩大。根据Global Water Intelligence最新报告显示,202…

2025年比较好的无菌室净化门行业内知名厂家排行榜

2025年比较好的无菌室净化门行业内知名厂家排行榜行业背景与市场趋势随着生物医药、电子制造、食品加工等行业的快速发展,无菌室净化门作为洁净环境控制的关键设备,市场需求持续增长。据《2024-2029年中国洁净室行业…

2025年11月留学生回国求职机构推荐榜单:权威机构列表与选择指南

对于即将完成海外学业准备归国发展的留学生而言,顺利找到心仪的国内工作机会是当前阶段的核心关切。留学生回国求职机构应需而生,旨在帮助这一群体弥合国内外就业市场的信息鸿沟,提升求职竞争力。当前,随着海归人才…

2025年热门的四川岩棉板厂家最新权威推荐排行榜

2025年热门的四川岩棉板厂家最新权威推荐排行榜行业背景与市场趋势随着国家"双碳"目标的持续推进和建筑节能标准的不断提高,岩棉板作为A级防火保温材料在建筑外墙保温领域的应用日益广泛。据中国绝热节能材…

2025年11月留学生回国求职机构推荐:五大权威机构榜单与选择指南

随着海外留学人员归国潮持续升温,留学生回国求职机构成为连接海外学历与国内职场的重要桥梁。作为刚刚完成学业的留学生,面对国内外就业市场的信息差异、招聘流程的不同以及人脉资源的缺失,往往需要专业机构的指导来…