【例4-22】把例4-20的延时代码改为用函数表达,要求当主频是1MHz时,其延时间隔约为1s。
程序分析
●例4-20中使用“for(i=0;i<10000;i++);”这样的代码段来进行延时,要想把其改为函数表达,就得编写一个延时函数,然后把“for(i=0;i<10000;i++);”代码段放在延时函数体中即可,那么接下来的问题是如何能保证函数的执行时间约是1s?
●要想了解函数的执行时间,可以用MPLAB的计时器功能来解决。当把MPLAB的调试工具选择为“MPLABSIM”时,在“Debugger”菜单下能找到“StopWatch”选项,单击即可显示出如图4-16所示的窗口。
●当单片机运行时,此计时器会记录已经执行了多少条指令以及消耗的时间。用户只需要指定好单片机的主频(通过“Debugger”→“Settings”→“Osc/Trace”下的“Processor Frequency”来修改),在函数执行前清空计时器(单击图4-16中的按钮),然后运行到函数结束,此时显示的时间就是此函数的执行时间了。
●使用函数表达延时后的代码如下所示。
图4-16 MPLABSIM下的计时器工具
“__CONFIG()”代码说明此条语句是PICC专门用来决定PIC单片机的配置字内容的。“WDTDIS”用来关闭“看门狗”定时器(WDT disabled),因为默认情况下WDT是上电后与CPU并行运行的。当WDT计数溢出后会自动复位CPU,导致程序会从头运行。因为本程序延时时间很长,很容易导致WDT溢出,所以为了避免WDT意外复位CPU,使用“__CONFIG(WDTDIS)”语句来关闭WDT。读者用ICD2调试器来调试实物电路板程序,常用的配置字如下。(www.daowen.com)
以上编写的延时函数调用一次只能延时1s,那么要想延时20s、100s该怎么办呢?也不能重复输入20次或100次延时函数啊!有没有什么方法能使此延时函数具有通用性呢?可以通过传递给函数一个参数来确定要延时的时间长度。这样此延时函数就有通用性了。要想实现这个功能,需要给延时函数加上形式参数,下面看一个带形式参数的函数例子。
【例4-23】把例4-22的延时函数改写为带一个形式参数的函数,此形式参数用来控制此函数延时多少秒。
程序分析
形参是控制此函数延时多少秒的,由于此延时函数的主要延时工作就是由其中的语句“for(i=0;i<18000;i++);”实现的,所以要想控制此函数延时多少秒,也就是要控制此函数内部的for循环执行次数。想控制for语句的执行次数,只需要在for语句外部再加一层for循环即可。
设计过程
修改后的main.c代码如下所示。
对于延时函数的说明:本例中采用的延时方法称为软件延时。由于软件延时会受到中断程序(在以后的章节中会介绍)的影响,所以软件延时的时间长度不是很精确。想要精确的延时,请采用定时器或者专用的实时时钟芯片(如DS1302芯片)实现。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。