C51单片机开发--库函数

news2024/11/17 1:20:36
知不足而奋进 望远山而前行

目录

系列文章目录

文章目录

前言

目标

内容

开发过程回顾

使用库函数点灯

什么是库函数?

面向库函数和面向寄存器开发

使用delay模块延时

总结



前言

在嵌入式系统开发中,使用库函数是提高开发效率、简化编程的重要手段之一。通过调用库函数,开发者可以避免重复编写一些常用功能的代码,如IO操作、定时器配置等,从而节省时间、降低出错概率,使得程序更加易读易维护。本文将以点灯为例,介绍了使用库函数和直接操作寄存器两种开发方法的对比,以及使用库函数进行IO操作和延时的具体步骤,希望能够帮助读者更好地理解和应用库函数在嵌入式系统开发中的重要性和作用。


目标

  1. 理解为什么需要学习库函数
  2. 掌握基于库函数开发的流程
  3. 掌握常用的库函数进行IO操作

内容

开发过程回顾

以点灯为例,我们的开发步骤可以简略的分为以下步骤:

  1. 查看原理图,找到控制灯的引脚。
  2. 查看芯片手册,对灯的引脚进行工作模式配置,并且控制引脚的高低电平。

其中,第一点是开发板设计范畴,第二点是代码编写范畴,我们此时讨论第二点。

我们可以详细的认为,我们的开发是面向芯片手册进行的,如果换了一个芯片,需要查看新的芯片手册进行开发。

这里有什么含义呢?

  • 代码中的 #include <STC8H.H>需要切换成对应的芯片头
  • 我们要查阅新的芯片手册进行工作模式配置,可能配置的参数和现在有很大的区别。

其实我们面向芯片手册开发也可以称之为面向寄存器开发,通过配置寄存器来完成功能。一个芯片中的寄存器众多,都写在了手册中,我们需要通过手册一一的查看,并且进行功能开发。

我们不妨回过头来看看,即使是STC8H.H这个文件中,也都是配置的寄存器地址,是芯片厂商提供出来的,如果芯片厂商偷懒,不提供这个头文件,那么我就要通过芯片手册,自己来去定义端口功能等等寄存器对应的功能了。

不妨我们还是来点个灯,在没有头文件的情况下:

sfr		P5M1 	= 0xC9;
sfr		P5M0 	= 0xCA;
sfr		P5 		= 0xC8;
sbit	P53		= P5^3;

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	i = 57;
	j = 27;
	k = 112;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

int main() {
	//P5M1 &= ~0x08,	P5M0 &= ~0x08; //准双向口
	P5M1 &= ~0x08,	P5M0 |=  0x08; //推挽输出
	//P5M1 |=  0x08,	P5M0 &= ~0x08; //高阻输入
	//P5M1 |=  0x08,	P5M0 |=  0x08; //开漏输出
	
	while(1) {
		P53 = 1;//开
		Delay1000ms();
		P53 = 0;//关
		Delay1000ms();
	}
}

sfr和sbit和关键字:

  • 在 C51 中,sfr 和 sbit 是两个关键字,它们可以用来定义特殊功能寄存器 (SFR) 和位 (Bit)。
  • SFR (Special Function Register) 即特殊功能寄存器,是单片机内部特定功能模块所对应的寄存器。例如,端口寄存器、定时器/计数器寄存器、串行口寄存器等。这些寄存器通过 sfr 关键字来定义。
  • Bit 是指特定寄存器中的某一位。在 C51 中,可以用 sbit 关键字来定义一个 Bit。
  • sfr 和 sbit 可以在程序中用来对单片机的特定功能寄存器和位进行访问和控制,使用起来比直接操作寄存器更加方便和直观。

使用库函数点灯

  1. 导入库函数。

下载STC8H的库函数:📎STC8G-STC8H-LIB-DEMO-CODE_2023.07.17_优化版.zip

来到库函数的目录下,拷贝以下文件:

  • Config.h
  • Type_def.h
  • GPIO.h
  • GPIO.c
  1. 新建项目,将拷贝的4个文件放到项目目录中。
  • 新建main.c
  • 将库函数加入到项目中

添加完成后,我们可以看到,GPIO.c在目录中

  1. 在main.c进行LED的开关控制
#include "Config.h"
#include "GPIO.h"

void Delay500ms()		//@11.0592MHz
{
	unsigned char data i, j, k;

	i = 29;
	j = 14;
	k = 54;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void GPIO_config(){
	GPIO_InitTypeDef gpioInit;
	gpioInit.Mode = GPIO_OUT_PP;// 推挽
	gpioInit.Pin  = GPIO_Pin_3; // P53
	GPIO_Inilize(GPIO_P5, &gpioInit);
}

void main(){
	// 配置IO模式
	
	// P53 配置准双向 (使用宏函数)
//	P5_MODE_IO_PU(GPIO_Pin_3);
	
	// P53 配置推挽输出模式(使用初始化函数)
	GPIO_config();
	

	while(1){
		P53 = 1;
		Delay500ms();
		
		P53 = 0;
		Delay500ms();
	}
}

什么是库函数?

库函数是一组已经封装好的程序,提供给开发者调用使用。这些函数通常是由语言的开发者或第三方库编写的,实现了一些通用的功能,如IO、PWM、串口、Timer等,可以让开发者无需重复编写这些功能,而是直接调用库函数即可。这样可以提高开发效率、减少重复代码的编写、降低程序出错的可能性,并且可以让代码更加易于维护和扩展。许多编程语言都有自带的库函数,同时也可以通过引入第三方库来扩展其功能。

面向库函数和面向寄存器开发

  1. 简化编程难度:使用库函数可以使编程更加简单,减少编程错误的可能性。
  2. 提高可读性:库函数名字通常比寄存器名称更加直观,更容易理解。
  3. 节省时间:使用库函数可以节省编程时间,因为库函数已经被编写和测试过,可以直接调用使用,而无需重新编写和测试代码。
  4. 更加可移植:使用库函数可以增加代码的可移植性,因为库函数已经被开发和测试过,可以在不同的硬件平台上使用,而无需进行大量的修改。
  5. 更加安全:使用库函数可以减少编程错误,例如溢出、死循环等问题,从而使程序更加安全可靠。

当然,在某些情况下,使用寄存器操作可能更加高效,例如在对时间要求比较高的嵌入式系统中,需要最大程度地减少代码运行时间。因此,要根据实际情况来选择使用库函数还是直接寄存器操作。

使用delay模块延时

  1. 拷贝库函数中Delay.cDelay.h到工程
  2. 引用头文件Delay.h
#include "Delay.h"
  1. 进行延时操作
delay_ms(250); // 延时250毫秒, 这里只支持1~255ms

总结

本文首先介绍了嵌入式系统开发中使用库函数的重要性,通过对比库函数和直接操作寄存器两种开发方法的优缺点,阐明了使用库函数可以简化编程、提高可读性、节省时间、增加可移植性和提高安全性等优势。然后,通过具体的点灯示例,演示了如何使用库函数进行IO操作和延时操作,包括导入库函数、配置GPIO模式、控制IO口输出等步骤。最后,简要总结了本文的内容,强调了库函数在嵌入式系统开发中的重要性和实用性。

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

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

相关文章

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《基于优先指数的配电网分布式储能序次规划》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

我国赤泥年产量庞大 政策引导下赤泥绿色利用率将不断提升

我国赤泥年产量庞大 政策引导下赤泥绿色利用率将不断提升 赤泥是指从铝土矿中提炼氧化铝后产生的强碱性工业固体废渣&#xff0c;由于含大量氧化铁&#xff0c;表面呈现红色&#xff0c;而得名赤泥。   赤泥通常包含氧化铝、氧化铁、二氧化硅、氧化钙、碱金属及其他微量元素&…

【深度 Q 学习-01】 Q学习概念和python实现

文章目录 一、说明二、深度 Q 学习概念三、python实现四、结论 关键词&#xff1a;Deep Q-Networks 一、说明 在强化学习 &#xff08;RL&#xff09; 中&#xff0c;Q 学习是一种基础算法&#xff0c;它通过学习策略来最大化累积奖励&#xff0c;从而帮助智能体导航其环境。它…

SAP实施方法论

SAP新实施方法论 RDS Activate

分布式拒绝服务解决方式

在网络安全领域中&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击始终占据着举足轻重的地位&#xff0c;其影响力不容忽视。随着网络技术的日新月异和网络环境的日益复杂化&#xff0c;DDoS攻击不仅变得愈发频繁&#xff0c;而且其破坏性和影响力也呈现出惊人的增…

二区5分纯生信|单细胞+非负矩阵+AlphaFold+机器学习组合

说在前面 学文不看刊 这篇分析总体来说工作量不算大&#xff0c;scRNA联合bulkRNA分析&#xff0c;多种机器学习组合预测模型&#xff0c;最后用了AlphaFold2预测蛋白及AutoDock分子对接 非常适合小白学习和模仿&#xff0c;其次在筛选出核心基因后可以再加几个外部数据集观…

【最优化方法】实验四 约束最优化方法的MATLAB实现

实验的目的和要求&#xff1a;通过本次实验使学生较为熟练使用MATLAB软件&#xff0c;并能利用该软件进行约束最优化方法的计算。 实验内容&#xff1a; &#xff11;、罚函数法的MATLAB实现 &#xff12;、可行方向法的MATLAB实现 学习建议&#xff1a; 本次实验就是要通…

抠像标签合并到原图,jpg 和 png合并,查看标签是否准确

抠像 原图 和 标签合并&#xff0c;查看抠像是否准确 合并后的图&#xff0c;是带有 羽化 效果的 import osimport cv2 import numpy as npdef apply_mask_with_feathering(original_image_path, mask_image_path):# 读取原图和mask图original_image cv2.imread(original_im…

一分钟教你学浪app视频怎么缓存

你是否在学浪app上苦苦寻找如何缓存视频的方法&#xff1f;你是否想快速、轻松地观看自己喜欢的视频内容&#xff1f;那么&#xff0c;让我们一起探索一分钟教你如何缓存学浪app视频的技巧吧&#xff01; 学浪下载工具我已经打包好了&#xff0c;有需要的自己下载一下 学浪下…

豆瓣内容抓取:使用R、httr和XML库的完整教程

概述 在数据分析和统计领域&#xff0c;R语言以其强大的数据处理能力和丰富的包库资源而闻名。它不仅提供了一个灵活的编程环境&#xff0c;还拥有专门用于数据抓取和处理的工具&#xff0c;如httr和XML库。这些工具使得从各种网站上抓取数据变得简单而高效。 豆瓣网站作为一个…

Excel 单元格式 “万” 和 “亿” 展示

先看结果 实现方法&#xff1a; 将单元格式 格式设置为 [>999999]0!.00,,"亿";[>999]0!.0,"万";0 我这里设置的是大于 999 和 99万 生效对应的万和 亿 如果想要达到1万 和达到 1亿 才生效可以设置为如下 [>1000000000]0!.00,,"亿"…

RUST 和 GO 如何管理它们的内存

100编程书屋_孔夫子旧书网 Go 中的内存管理 Go 中的内存不会在缓存键被驱逐时立即释放。 相反&#xff0c;垃圾收集器会经常运行以发现任何没有引用的内存并释放它。 换句话说&#xff0c;内存会一直挂起&#xff0c;直到垃圾收集器可以评估它是否真正不再使用&#xff0c;而…

AI架构设计6:vLLM

训练大型语言模型以及微调的教程比比皆是&#xff0c;但关于在生产环境中部署它们并监控其活动的资料相对稀缺。上个章节提到了未来云原生的AI是趋势&#xff0c;然而涉及到云原生会比较偏技术。而在此之前为了解决大模型部署量产的问题&#xff0c;社区也一直在探索&#xff0…

OLED曲面屏手机跌下神坛,曲面边缘老化迅速,泛黄严重

在过去国产手机都喜欢将曲面屏用到旗舰手机上&#xff0c;借此凸显旗舰手机的优越性和独特性&#xff0c;然而在实际使用中&#xff0c;曲面屏的弊端日益明显&#xff0c;如今笔者就遭遇了这个问题。 因手上刚购买的天玑6080、骁龙4G2新机存在卡顿问题&#xff0c;使用很不爽&a…

面向链接预测的知识图谱表示学习方法综述

源自&#xff1a;软件学报 作者&#xff1a;杜雪盈, 刘名威, 沈立炜, 彭鑫 注&#xff1a;若出现无法显示完全的情况&#xff0c;可搜索“人工智能技术与咨询”查看完整文章 摘 要 作为人工智能的重要基石, 知识图谱能够从互联网海量数据中抽取并表达先验知识, 极大程度解决…

【数据结构】冒泡排序、直接插入排序、希尔排序详解!

文章目录 1. 冒泡排序&#x1f34e;2. 直接插入排序&#x1f34e;3. 希尔排序&#xff08;缩小增量排序&#xff09;&#x1f34e; 1. 冒泡排序&#x1f34e; &#x1f427; 基本思想&#xff1a; 比较相邻的元素。如果第一个比第二个大&#xff0c;就交换他们两个。 大的数据…

【Python-基础】函数合集

def嵌套def 调用外部函数aa时&#xff0c;如果aa中没有调用内部函数bb&#xff0c;则bb函数不执行。 def aa():print("1")def bb():print("2")print("3")if __name__ "__main__":aa()未待完续…

LeetCode---链表

203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 代码示例1&#xff1a;(直接使用原来的链表来进行移除节点操作) //时间复杂度: O(n) //空间复杂度: O(1) class Solu…

海博思创储能系统产品再获认可,获得杰出项目类别入围资格

近日&#xff0c;2024年欧洲智慧能源展览会大奖&#xff08;The smarter E AWARD 2024&#xff09;公布了入围名单&#xff0c;该奖项设有五个类别&#xff1a;光伏、储能、电动出行、智能综合能源和杰出项目奖&#xff0c;旨在表彰能源领域中的卓越创新成果。 在入围项目中&a…

基于STM32实现智能楼宇对讲系统

目录 引言环境准备智能楼宇对讲系统基础代码示例&#xff1a;实现智能楼宇对讲系统 音频输入和输出按键控制显示屏和用户界面网络通信应用场景&#xff1a;楼宇安防与智能家居问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在STM32嵌入式系统中使用C语言实现智能…