实验1.3通过for循环精确定时呼吸灯
(1)时钟周期。定义为时钟频率的倒数,本例使用12MHz的时钟频率,它的时钟周期大约就是1/12μs。
(2)机器周期。单片机的基本操作周期,STC89C51系列的单片机来说,一个机器周期由12个时钟周期组成,也就是1μs。
(3)指令周期。指的是单片机执行一条指令需要的时间,一个指令周期需要1~4个机器周期。一。一条for循环需要8个机器周期。
参考:希望之晨blog
以上为摘录资料原文档
我们实验用51开发板晶振为11.0592MHZ
晶振一会文档结尾代码讲解视频的实验结果部分会给大家指出,晶振元器件上的数字就是该开发板使用的晶振HZ数,一般以M为单位,就是10^6次方
为了详细讲解代码延时,我还是用文字讲解的更为清楚:
查了CSDN智能AI
for循环计算周期如下:
3. 总周期计算公式
总机器周期=1初始化+3×n循环迭代+1退出
-
N: 循环次数(
i
的初始值)
4. 实例计算(12MHz晶振)
for(i = 100; i > 0; i--) {} // 空循环
-
总周期 = 1+8×100+1=808个机器周期
-
时间消耗:808×1μs=808μs(因机器周期=1μs)
对于11.0592MHZ的晶振来说
一个机器周期是12个时钟周期
也就是12*(1/11059200)s
大概是:1.085us
1ms
1000/1.085
1ms需要921.66个机器周期
而对于单片机来说机器周期是整数
那我们就四舍五入
1ms需要922个机器周期
那初始化1个
退出1个
920/一个for循环需要的机器周期数
那就是中间循环8*115=920个机器周期
1ms的for循环次数就是115
void delay_ms(int k)
{int i,j;for(i=0;i<k;i++)for(j=0;j<115;j++);
}
第二层for循环循环结束就是1ms,前面已经计算过了
第一层for循环就是多少个1ms的累加
比如1000次第一层循环,就是1ms的1000倍,就是大概1s
同时第一层for循环,初始化1个机器周期,结束1个机器周期
循环一次2个机器周期,循环1000次就是要额外多加8008个机器周期,大概是8ms左右
也就是每增加1s的误差在8ms左右。
第一层循环越多误差越大
void delay_s(int q)
{delay_ms(1000*q);
}
这个子函数就是延时1s的函数
放在一起解释
void delay_ms(int k)
{int i,j;for(i=0;i<k;i++)for(j=0;j<115;j++);
}void delay_s(int q)
{delay_ms(1000*q);
}
1000*q就是delay_ms里面的第一层循环
那q就是多少秒了
总代码如下:
#include "reg51.h"sbit led1=P2^0;int main()
{void delay_s(int q);while(1){led1=1;delay_s(10);led1=0;delay_s(10);}return 0;
}void delay_ms(int k)
{int i,j;for(i=0;i<k;i++)for(j=0;j<115;j++);
}void delay_s(int q)
{delay_ms(1000*q);
}
这里是定时10s
大家可以多延时一会用手表计时
比如分别5s,10s,20s的实验结果是否和手表计时大概一致
代码讲解以及实验结果如下:
for循环精确定时呼吸灯