第一章(1.3系统时钟和延时函数)

您所在的位置:网站首页 ms延时函数是什么 第一章(1.3系统时钟和延时函数)

第一章(1.3系统时钟和延时函数)

#第一章(1.3系统时钟和延时函数)| 来源: 网络整理| 查看: 265

原理图、源代码、元件清单等资料下载:戳我 (本教程第一、二节内容请在简书主页学习) 通过本节学习系统时钟,有助于理解第一、二节的延时函数,也有助于理解在实际的项目中如何选用不同芯片及选择芯片时钟频率。 第二节的跑马灯程序中,都调用了一个300ms的延时函数:

void Delay300ms() //@11.0592MHz { unsigned char i, j, k; _nop_(); _nop_(); i = 13; j = 156; k = 83; do { do { while (--k); } while (--j); } while (--i); }

读者可以将第二节程序中的延时函数调用部分屏蔽,观察显示效果

void main(void) { unsigned char i,m=0xFE; while(1) { for(i=0;i= 1; //数据右移一位 if (IO) dat |= 0x80; //读取数据 SCLK = 1; //时钟线拉高 _nop_(); _nop_(); } return dat; }

此代码功能是单片机读取DS1302芯片1字节数据,此处增加短暂的延时,是因为单片机的IO口被拉低(SCLK = 0)拉高(SCLK = 1)时,STC15系列单片机的执行速度非常快,如果不加延时,会导致DS1302芯片没有监测到外部电平变化,有可能导致数据溢出不正常。 (注:上述结论可能会因为实际电路、测试环境差异得出不同结论)

2 循环延时函数

部分传感器等芯片,往往需要较长延时,如延时10us、200us等,此时需要循环的方式实现较长时间延时。现以STC15系列单片机为例,设计一个简单的延时函数。 程序C1-3-2:

#include"STC15F2K60S2.h" #include"intrins.h" void Delay(unsigned int n) { while (n--) { _nop_(); } } void main() { while(1) { Delay(5); Delay(10); Delay(20); Delay(40); Delay(80); Delay(160); Delay(320); Delay(640); } }

上面的延时函数实际延时时间是多少呢?通过KEIL的Debug功能,设置时钟频率为12MHz。Debug过程如图1-3-5图1-3-6所示,

图1-3-5 图1-3-6

执行DelayXus(5)的延时时间=0.00007500-0.00006467=0.00001033s≈10.33us

用此方法,依次求出后面的延时时间,如表1-3-1所示.

函数名 延时时间 单位:us Delay(5) 10.33 Delay(10) 18.25 Delay(20) 34.08 Delay(40) 65.75 Delay(80) 129.09 Delay(160) 255.75 Delay(320) 509.25 Delay(640) 1016.08

(注:debug方法推导STC15系列单片机延时时,存在误差)

把Delay(5)函数当做一个10us延时的基准,需要50us延时函数时,可以直接调用DelayXus(25)实现,尽管这样会存在一定的误差,但实际项目开发中,大多数传感器或IC芯片允许这种延时上的误差,如DS18B20传感器,官方手册规定,传感器工作之前,需要一个480至960us的低电平脉冲,这个范围很宽,所以延时函数不需要特别精确。

不同芯片或传感器,也会用到较为精准的延时函数,如跑马灯的要求“每隔0.3秒点亮一颗LED”这实际上就是明确的延时要求。这就需要程序设计者有一定的程序设计能力,或通过定时器实现,或通过循环实现。定时器延时会在后面的章节中介绍,这里主要介绍循环延时(又叫软件延时,非定时器延时)。在程序C1-3-2中,延时函数并不精准,但可以通过计算的方式得到精确延时。

这里需要注意,计算代码延时时间,并不是简单的计算C代码执行速度,而是通过编译后的汇编代码,延时函数Delay(unsigned int n)编译后的汇编代码如图所示。

图1-3-7

根据汇编代码,设延时时间为Y,延时函数形参为X,时钟周期为T,可得到下面的公式 Y=18T*X+28T X=(Y-28T)/18T 当系统时钟频率为12MHz,需要延时时间为200us时,形参X=(200-28/12)/(18/12)=131.78≈132。因此DelayXus(132)就是一个200us的延时函数。但实际上,这种方法不仅需要懂得编译后的汇编代码,且仍会存在误差。只能说与粗略的延时相比,这种方法相对精确。 (这里不要求读者掌握汇编代码,读者作为了解即可)

3 延时函数生成软件

以通过第三方软件延时计算机器可以得到更为精准的延时函数,免去了复杂繁琐的计算,STC官方的ISP软件就提供了软件延时计算器,如图1-3-8所示。

图1-3-8

简单的5步,就可以计算出需要的延时代码,第二节中的300ms延时函数,就是通过这种方式得到的。

不同时钟频率对项目的影响

以STC15系列单片机为例,大多数情况下,时钟频率不需要特别考虑。尽管更高的时钟频率可以让CPU更快的执行指令,但有些功能本身并不需要很高时钟频率。把第二节的跑马灯看做是一种项目需求,现改为基于22.1184MHz时钟频率实现,程序代码如下。 程序C1-3-3

#include"STC15F2K60S2.h" #include"intrins.h" void Delay100ms() //@22.1184MHz { unsigned char i, j, k; _nop_(); _nop_(); i = 9; j = 104; k = 139; do { do { while (--k); } while (--j); } while (--i); } void main(void) { unsigned char i,m=0xFE; while(1) { for(i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3