历史上的今天
今天是:2025年08月16日(星期六)
2021年08月16日 | 51单片机-函数封装
2021-08-16 来源:eefocus
1.简洁代码
单片机程序阅读一般都是先从主函数开始,上一讲的程序写法在主函数中显得不简洁,影响人阅读代码的效率。有时我们只需要知道一条语句代表什么意思即可,所以我们把延时部分封装为一个函数,在主函数里调用函数名表示此处语句延时1秒,这样可读性就强的多,也简洁地多,读者也可以先了解一下《手把手教你学51单片机》文档中的4.6节先。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include sbit LED2 = P0^0; sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3;
void delay()//延时功能封装为一个函数 { unsigned int i,j;//定义两个用来完成延时功能的变量 for(i=0;i<19601;i++)//延时1s { for(j=5;j>0;j--); } }
void main() { ADDR3 = 1;//使能三八译码器 ENLED = 0;//
ADDR2 = 1;//************************** ADDR1 = 1;//让三八译码器的IO6输出低电平 ADDR0 = 0;//**************************
while (1) { LED2=0;//点亮最右端的灯 delay();//延时1s LED2=1;//熄灭最右端的灯 delay();//延时1s } } |
这个原理很简单,我们用一张图表示就知道什么叫函数封装调用了

这里只不过是把变量i和变量j放在了“void delay()”中定义,实现的功能和上一讲的代码都是一样的。不过笔者用软件仿真发现这样写会花掉CPU调用函数的4微秒时间,为了方便阅读牺牲这4微秒是必须的,但我们不需在后面加例如“LED2=0;”或“i=0;”等这些语句也可以离奇的解决上一讲所说的灯跳变与秒表计时数字跳变不同步的诡异现象。
我们比较推荐用函数封装来模块化编程,因为这样比较符合编程思想也是我们必须要使用的编程技巧。
2.建议
本节的代码虽然不多,但是我们也要养成从主函数开始阅读代码的习惯,而不是一开始就从头往下看代码。比如映入我们第一眼帘的是“void delay()”函数,这时我们不应该进入函数体去阅读里面的内容,而是马上找到“void main()”进入阅读研究里面的代码,当看到“delay();”时有了注释我们就有了对这个函数的第一印象,这时再去查看这个函数的内容。
常见步骤如下:


一定要在编译之后才能按F12。虽然在代码量少的时候看不出这种方法的优势,但当我们阅读别人的代码时,代码量一般比较多,用此方法则能快速了解别人所写程序的层层意思,关于这个习惯,大家学到后面的程序就能领悟了。
上一篇:51单片机-延时1秒
下一篇:51单片机-函数传参调用
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 04:17 编辑 有喜欢的就顶吧,继续哦!~! 电子设计大赛之“一起学模电”(每天更新) 电子设计大赛之“一起学数电”(每天更新) 今天学了VERILOG,好累啊,虽然没有学习完,还是分享一点吧 [ 本帖最后由 歹 ...… 查看全部问答> |
|
今天在网上看到这样一个帖子:本人在天成电子监控有限公司购买一部监听手机,说好先付一半的价钱,750元,全额1500元。我给他们公司汇完了钱不给发货,威胁我再把另一半给他再给我发货,如果不给汇款剩下的750元之前预交的750元就不给退了!!说话 ...… 查看全部问答> |
|
最近做的JZ4730的一个项目,想要修改自己做的PS2驱动的注册表值,参照了本身程序里的串口的程序,有一个地方不清楚 IF BSP_JZ47_UART0 [HKEY_LOCAL_MACHINE\\Drivers\\BuiltIn\\Serial] \"Order\"=dword:0 \"InterfaceT ...… 查看全部问答> |
|
谁有win ce平台上基于SIP的voip客户端程序+源码?! 我的win ce是5.0的,EVC是4.0的,谁有能在evc4.0上的基于SIP的VOIP程序阿!! 很急很急! 有的人请尽快联系我。谢谢大家了! 邮箱yaoty@bit.edu.cn yaoty001@sohu.com … 查看全部问答> |
|
一个是外部中断,一个是时钟中断。 设置如下, //PC7 nvic_init.NVIC_IRQChannel = EXTI9_5_IRQChannel; nvic ...… 查看全部问答> |
|
关于STM32上移植uclinux看到网上有移植成功的,我也按照官方的文档直接下载了他们提供的烧写文件,我的开发板是ARMFLY(安富莱)的STM32F103ZE-EK 2.0,1M的SRAM,16M NOR Flash,资源上没问题,下载成功后,启动后只一条打印信息:platform Initialis ...… 查看全部问答> |
|
睡了一觉之后发现已经邮寄了,见下图 因为之前他说的预计运货时间是8月1号,所以一直很期待,没想到真是按时邮了。看来把那个430的launchpad退了是很对的,那个430下单后没货了,显示预计运货时间是8月20号。。所以发了份申请,就退了。。(但是 ...… 查看全部问答> |
|
Powerpcb自带特性阻抗计算的方法Powerpcb中本身自带有特性阻抗计算的功能。 方法如下: 1、在Setup/Layer definition中把需要定义为地或电源层相应层定义为Cam Plane。 2、并在Layer Thinkness中设置你的层叠的结构(即各层的厚度、板材的介电常 ...… 查看全部问答> |
|
TI实习生招聘计划在全国展开。上周,我有幸参加了TI在武汉举行的实习生及应届生的招聘会。虽结果不得而知,但却让我感触颇深,愿慢慢道来,与大家一同分享TI面试二三事。 3月8号晚,我早早的赶到华科,参加了TI的宣讲会。 ...… 查看全部问答> |




