单片机的延时设置

来源:百度知道 编辑:UC知道 时间:2024/06/19 07:59:59
void DelayMs(unsigned int n)//延时(n)MS
{
unsigned int i;
for(;n>0;n--)
{
for(i=2211;i>0;i--);
}
}

void SysClkInit(void)//配置系统时钟
{
OSCICN|=0x03;
OSCICL=OSCICL+22;//设置片内振荡器为22.1184MHZ
}

这个程序里面,片内振荡器为22.1184MHZ,为什么延时1MS是从2211减到0呢?这个2211是怎么算出来的?
延时循环里执行Z个周期
这个Z怎么看出来的呢
按照(22118400/12)/1000/Z=2211
Z=0.8
是不是Z都比较接近1的?
谢谢 我追加50分
我用的是C8051F330 是不是一个机器周期就是一个时钟周期呢?

for(i=2211;i>0;i--); //所做的事情是把i减一,并判断其是否为零。。

下面是其反汇编的代码:VC上的,单片机也是类似的(指令等等不同而已)。。。。
123: {
124: for(i=2211;i>0;i--);
004015F9 mov dword ptr [ebp-4],8A3h
00401600 jmp DelayMs+3Bh (0040160b)
00401602 mov ecx,dword ptr [ebp-4]
00401605 sub ecx,1
00401608 mov dword ptr [ebp-4],ecx
0040160B cmp dword ptr [ebp-4],0
0040160F jbe DelayMs+43h (00401613)
00401611 jmp DelayMs+32h (00401602)
125: }
一次循环就会执行以上的汇编,而这些汇编语句的指令周期是固定的,所以可以算出一次循环需要多少个机器周期(不同的MCU or CPU,以及不同的指令所用的机器周期都会不一样,查datasheet可以知道)。。。

而机器周期和时钟周期(系统时钟)有必然的联系。。不同的MCU也不一样。比如51的机器周期=12×时钟周期(但楼主用得应该不是51);也有的是机器周期=时钟周期

所以,如果设机器周期=n个时钟周期,
设而执行一次循环的汇编指令花m个机器周期;
时钟周期 = 1 / 22118400;

for(i=2211;i>0;i--);所用时间则是:2211×m×n×(1/22118400)
如果m=10,n=1,则恰好是1MS。

也即:(22118400/1)/1000/10=2211

先求出每秒能够执行多少条单周期指令,