编写延时函数的简单方法在本站51hei-5板子上做315兆无线解码和红外
编写延时函数的简单方法
在本站51hei-5板子上做315兆无线解码和红外解码试验的时候,延时函数的精度很重要,要做到相当精确才可以成功,所以大家一定要掌握.
这也是大家最常在QQ里问我的一个问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
,如果从keil里看了c语言的反汇编代码然后根据晶振和指令计算延时的时间这样虽然非常的准确但是相当的麻烦而且容易搞错,我这里介绍一个最简单的方法.可以验证你的延时函数
这里用一个例程详细介绍一下。
过程参考如下:
在编译器下建立一个新项目,也可以利用已有项目。此过程中需要注意,单片机晶振的选择,因为for循环里指令的执行时间和晶振有直接关系,本例中晶振使用11.0592M。
此主题相关图片如下:20090oc1.jpg
编写一段关于延时的函数,主要利用for循环,代码如下:
void delay_ms(unsigned int ms)
{
unsigned int i;
unsigned char j;
for(i=0;i
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
可知 MOV一个机器周期,DJNZ 指令需用两个机器周期,而一个机器周期时间长度为12,11.0592MHz,所以该段程序执行时间为:
((0B3×2,1,2)×256,1)×12?11059200,100.2789mS
第一层:DJNZ R1,$:执行了B3H次,一次两个周期,所以为0B3×2;
第二层:MOV R1,#0B3H为一个周期,DJNZ R0,DELAY1为两个周期,这样循环一次就是0B3×2,1,2个周期;第二层的执行次数本来是255次,但因为赋首值为0,而DJNZ是先减1,再比较的,所以就应该是256次。
这样的话,整个循环执行完应该是(0B3×2,1,2)×256,1次。再加上开始赋值这一句,就是((0B3×2,1,2)×256,1)了
还说明一下:
nop指令或者_nop_(); 函数占一个机器周期,
在stc单片机的12T模式下一个机器周期是一个振荡周期的12分频,如果你的晶振是12MHZ,那你的一个机器周期就是1微秒(一个nop指令的执行时间也就是1US
当在6T模式(下载的时候可选择模式)下12M晶振的时候,一个nop就是0.5US了.