【36】单片机编程核心技巧:函数分类与应用实践

【36】单片机编程核心技巧:函数分类与应用实践

七律 · 函数四象

函数四象各不同,输入输出定乾坤。
无入无出全局传,有参无返隐桥连。
无参有返归一数,双全其美显神通。
单片机中藏万象,函数之道见真功。


摘要

本文基于STC8H单片机,系统阐述函数的四种常见类型(无输入无输出、无输入有输出、有输入无输出、有输入有输出),通过加法函数示例对比其语法与应用场景。结合代码实现与测试验证,解析函数接口设计、变量作用域及内存管理,帮助开发者掌握函数分类与封装技巧,提升代码复用性与可维护性。


关键字

函数分类, 输入输出, 全局变量, 局部变量, 返回值


函数命名规则与作用

1. 命名规范

  • 组成:字母、数字、下划线(_),首字符不可为数字。
  • 区分大小写Functionfunction视为不同名称。
  • 禁用关键字:如voidunsigned等C语言保留字。

2. 函数作用

  • 模块化封装:将重复逻辑封装为函数,减少代码冗余。
  • 数据流控制:通过输入输出参数实现模块间数据交互。

函数的四种类型

1. 类型分类标准

类型返回值(Output)输入参数(Input)
第1类无(void无(void
第2类无(void
第3类无(void
第4类

函数类型详解与示例

1. 第1类:无输入无输出函数

实现逻辑

通过全局变量传递数据,隐蔽性较强。

/* 全局变量定义 */  
unsigned char a = 0; // 存储结果  
unsigned char g = 2, h = 3; // 输入参数  /* 函数定义 */  
void add_nothing(void) {  a = g + h; // 通过全局变量计算  
}  void main() {  add_nothing(); // 调用函数  View(a); // 输出结果5  
}  
特点
  • 依赖全局变量:数据传递不直观,易引发命名冲突。
  • 适用场景:简单交互或调试场景。

2. 第2类:无输出有输入函数

实现逻辑

通过形参传递数据,结果存入全局变量。

/* 全局变量定义 */  
unsigned char b = 0; // 存储结果  /* 函数定义 */  
void add_with_input(unsigned char i, unsigned char k) {  b = i + k; // 通过形参计算  
}  void main() {  add_with_input(2, 3); // 调用函数  View(b); // 输出结果5  
}  
特点
  • 显式输入接口:参数直接传递,可读性高。
  • 结果依赖全局变量:需配合全局变量使用。

3. 第3类:有输出无输入函数

实现逻辑

通过return语句返回结果。

/* 全局变量定义 */  
unsigned char m = 2, n = 3; // 输入参数  /* 函数定义 */  
unsigned char add_return(void) {  return m + n; // 直接返回结果  
}  void main() {  unsigned char c = add_return(); // 接收返回值  View(c); // 输出结果5  
}  
特点
  • 显式输出接口:通过返回值传递结果。
  • 无需全局变量:减少内存占用与命名冲突风险。

4. 第4类:有输入有输出函数

实现逻辑

参数传递与返回值结合,功能最完整。

/* 函数定义 */  
unsigned char add_full(unsigned char r, unsigned char s) {  return r + s; // 参数计算并返回  
}  void main() {  unsigned char d = add_full(2, 3); // 调用并接收结果  View(d); // 输出结果5  
}  
特点
  • 独立性高:无需依赖全局变量。
  • 适用场景:复杂算法或模块化设计。

函数调用注意事项

1. 语法规范

  • 无输入函数调用:括号内void需省略,如add_nothing()
  • 参数传递:实参类型需与形参匹配,如add_with_input(2, 3)

2. 内存管理

  • 局部变量:存储于栈区,函数调用结束即释放。
  • 全局变量:占用固定RAM地址,需注意内存分配。

综合例程与验证

1. 示例代码

#include <stc8.h>  /* 全局变量 */  
unsigned char a = 0, b = 0, c = 0, d = 0;  
unsigned char g = 2, h = 3, m = 2, n = 3;  /* 函数声明 */  
void add_nothing(void);  
void add_with_input(unsigned char, unsigned char);  
unsigned char add_return(void);  
unsigned char add_full(unsigned char, unsigned char);  /* 函数实现 */  
void add_nothing(void) {  a = g + h;  
}  void add_with_input(unsigned char i, unsigned char k) {  b = i + k;  
}  unsigned char add_return(void) {  return m + n;  
}  unsigned char add_full(unsigned char r, unsigned char s) {  return r + s;  
}  void main() {  /* 端口初始化 */  P1M0 = 0xFF; // P1口推挽输出  P1 = 0x00;  /* 调用四种函数 */  add_nothing();  add_with_input(2, 3);  c = add_return();  d = add_full(2, 3);  /* 输出结果 */  View(a); // 输出5  View(b); // 输出5  View(c); // 输出5  View(d); // 输出5  while(1);  
}  

2. 测试验证

  • 硬件连接:通过串口输出观察变量值。
  • 预期结果:所有变量abcd均显示5
  • 调试方法
    • 使用Keil的Watch窗口跟踪变量值。
    • 检查函数调用语法是否遗漏void或参数类型错误。

函数设计建议

1. 选择函数类型的原则

场景推荐类型
简单操作,无需返回值第1类或第2类
需返回结果但参数固定第3类
参数动态且需返回结果第4类

2. 优化建议

  • 减少全局变量:优先使用第3、4类函数,避免内存冲突。
  • 参数类型匹配:确保实参与形参类型一致,避免隐式转换错误。

总结

函数的四种类型覆盖了从简单到复杂的封装需求,开发者需根据场景选择合适类型。通过全局变量、形参及返回值的灵活组合,可实现模块化设计与代码复用。掌握函数接口设计与内存管理,是提升单片机程序健壮性与可维护性的关键。

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

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

相关文章

简单几步完成dify的本地搭建

简单几步完成dify的本地搭建

网络爬虫【爬虫库request】

我叫不三不四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲爬虫 Requests是Python的一个很实用的HTTP客户端库&#xff0c;完全满足如今网络爬虫的需求。与Urllib对比&#xff0c;Requests不仅具备Urllib的全部功能&#xff1b;在开发使用上&…

深度学习:从零开始的DeepSeek-R1-Distill有监督微调训练实战(SFT)

原文链接&#xff1a;从零开始的DeepSeek微调训练实战&#xff08;SFT&#xff09; 微调参考示例&#xff1a;由unsloth官方提供https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen2.5_(7B)-Alpaca.ipynbhttps://colab.research.google.com/git…

MySQL 调优

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

Clion远程开发配置

代码开发环境&#xff1a;windows下&#xff0c;基于Clion 2024.3开发&#xff0c;标准为C20 代码运行环境&#xff1a;远程服务器&#xff0c;ubuntu&#xff0c;cmake版本3.12&#xff0c;gcc11.4&#xff0c;g11.4&#xff0c;gdb12.1 实现功能&#xff1a;在本地windows开…

男女搭配(数学思维)

#include <bits/stdc.h> using namespace std; int main() {// 请在此输入您的代码int t;cin>>t;while(t--){int n,m,k;cin>>n>>m>>k;int smin(n,2*m)/2;if(nm-k > 3*s) cout<<s<<endl;else cout<<(nm-k)/3<<endl;}r…

SakuraCat(1)整体架构概述 (完善中)

项目功能概述 支持Servlet组件可部署一个标准的Web App 项目架构总览 HTTP服务器&#xff1a;负责建立链接&#xff0c;处理请求的数据&#xff0c;并转发给Servlet容器。Servlet容器&#xff1a;将HttpServletRequest和HttpServletResponse对象传给对应的业务类进行相应的逻…

一种基于大规模语言模型LLM的数据分析洞察生成方法

从复杂数据库中提取洞察对数据驱动决策至关重要,但传统手动生成洞察的方式耗时耗力,现有自动化数据分析方法生成的洞察不如人工生成的有洞察力,且存在适用场景受限等问题。下文将介绍一种新的方法,通过生成高层次问题和子问题,并使用SQL查询和LLM总结生成多表数据库中的见…

单片机学完开发板,如何继续提升自己的技能?

很多人学完开发板后都会卡在一个尴尬的阶段&#xff1a;觉得自己会的东西不少&#xff0c;但又不知道下一步该干啥。会点C语言&#xff0c;能烧录程序&#xff0c;能点亮LED&#xff0c;玩转按键&#xff0c;搞定串口等等&#xff0c;能用开发板做点小玩意儿&#xff0c;但面对…

计算机网络——总结

01. 网络的发展及体系结构 网络演进历程 从1969年ARPANET的4个节点发展到如今覆盖全球的互联网&#xff0c;网络技术经历了电路交换到分组交换、有线连接到无线覆盖的革命性变革。5G时代的到来使得网络传输速度突破10Gbps&#xff0c;物联网设备数量突破百亿级别。 网络体系…

实验10决策树

实验10决策树 一、实验目的 &#xff08;1&#xff09;理解并熟悉决策树算法思想和原理&#xff1b; &#xff08;2&#xff09;熟悉决策树算法的数学推导过程&#xff1b; &#xff08;3&#xff09;能运用决策树算法解决实际问题并体会算法的效果&#xff1b; &#xff08;4…

【css酷炫效果】纯CSS实现悬浮弹性按钮

【css酷炫效果】纯CSS实现悬浮弹性按钮 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492020 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚看到csdn出活动了&…

【模块化编程】制作、可视化不平衡数据(长尾数据)(以Cifar-10为例)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;《PyTorch科研加速指南&#xff1a;即插即用式模块开发》-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎…

Linux操作系统7- 线程同步与互斥1(POSIX互斥锁的使用详解)

上篇文章&#xff1a;Linux操作系统6- 线程4&#xff08;POSIX线程的简单封装&#xff09;-CSDN博客 本篇代码仓库:myLerningCode/l30 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 目录 一. 线程不互斥造成的结果 二. pthread_mutex_t 互斥…

深入 Linux 声卡驱动开发:核心问题与实战解析

1. 字符设备驱动如何为声卡提供操作接口&#xff1f; 问题背景 在 Linux 系统中&#xff0c;声卡被抽象为字符设备。如何通过代码让应用程序能够访问声卡的录音和播放功能&#xff1f; 核心答案 1.1 字符设备驱动的核心结构 Linux 字符设备驱动通过 file_operations 结构体定…

洛谷 [语言月赛 202503] 题解(C++)

本文为洛谷3月的语言月赛题目全部题解&#xff0c;难度为入门到普及-&#xff0c; 觉的有帮助或者写的不错的可以点个赞 题目链接为 题目列表 - 洛谷 | 计算机科学教育新生态 目录 题目A:长方形 解题思路: 代码(C): 题目B:水流 题目大意: 解题思路: 代码(C): 题目C:格…

算法每日一练 (15)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 算法每日一练 (15)第 N 个泰波那契数题目描述解题思路…

实验11 机器学习-贝叶斯分类器

实验11 机器学习-贝叶斯分类器 一、实验目的 &#xff08;1&#xff09;理解并熟悉贝叶斯分类器的思想和原理&#xff1b; &#xff08;2&#xff09;熟悉贝叶斯分类器的数学推导过程&#xff1b; &#xff08;3&#xff09;能运用贝叶斯分类器解决实际问题并体会算法的效果&a…

Matrix-breakout-2-morpheus靶机实战攻略

1.安装并开启靶机 2.获取靶机IP 3.浏览器访问靶机 4.扫描敏感目录文件和端口 gobuster dir -u http://192.168.52.135 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,txt,html 5.访问文件和端口 发现在graffiti.php输入框输入内容后页面会返回内容…

【知识】Graph Sparsification、Graph Coarsening、Graph Condensation的详细介绍和对比

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 1. 理论基础&#xff08;Definitions & Theoretical Background&#xff09; 2. 算法方法&#xff08;Techniques & Algorithms&#x…