当前位置:
文档之家› 单片机C语言(FOR)延时计算
单片机C语言(FOR)延时计算
如想延时 60US 则 i=[(60-1.75)*12/6-15]/4=25.375≈26; 修改 i 的值=26,再调用上面的 【10US 级延时函数】Delay10us(6); 则就精确延时 60US;
如果想延时 64US 可以用这二种函数组合来用: Delay10us(6); for(i=9;i>X;i--) 共延时 64US
//================大于 10US<小于 21.9955Ms 的可用【10US 级延时函数】=========== void Delay10us(uchar Ms) {
uchar data i; for(;Ms>0;Ms--) for(i=26;i>0;i--); } i=[(延时值-1.75)*12/Ms-15]/4
共有三条延时函数说明如下: 函数调用分两级:一级是小于 10US 的延时,二级是大于 10US 的延时 //====================小于 10US 的【用 1US 级延时】==================== //----------微秒级延时--------for(i=X;i>X;i--) 延时时间=(3+5*X)/12 提示(单位 us, X 不能大于 255)
计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5
二. 200ms 延时子程序 程序: void delay200ms(void) {
unsigned char i,j,k;
for(i=5;i>0;i--) for(j=132;j>0;j--) for(k=150;k>0;k--); } 三. 10ms 延时子程序 程序: void delay10ms(void) { unsigned char i,j,k; for(i=5;i>0;i--) for(j=4;j>0;j--) for(k=248;k>0;k--); } 四. 1s 延时子程序 程序: void delay1s(void) { unsigned char h,i,j,k; for(h=5;h>0;h--) for(i=4;i>0;i--) for(j=116;j>0;j--) for(k=214;k>0;k--); }
程序:
void delay500ms(void)
{
unsigned char i,j,k;
for(i=15;i>0;i--)
for(j=202;j>0;j--)
for(k=81;k>0;k--);
}
计算分析:
程序共有三层循环
一层循环 n:R5*2 = 81*2 = 162us
DJNZ 2us
二层循环 m:R6*(n+3) = 202*165 = 33330us
关于单片机 C 语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没 有达到精确高的要求,而本函数克服了以上缺点,能够精确计数出要延时值且精确达到 1us, 本举例所用 CPU 为 STC12C5412 系列 12 倍速的单片机,只要修改一下参数值其它系例单片机 也通用,适用范围宽。
DJNZ 2us + R5 赋值 1us = 3us
三层循环: R7*(m+3) = 15*33333 = 499995us
DJNZ 2us + R6 子程序调用 2us + 子程序返回 2us + R7 赋值 1us = 5us
延时总时间 = 三层循环 + 循环外 = 499995+5 = 500000us =500ms
C 程序中可使用不同类型的变量来进行延时设计。经实验测试,使用 unsigned char 类型具有比 unsigned int 更优化的代码,在使用时应该使用 unsigned char 作为延时变量。 以某晶振为 12MHz 的单 片机为例,晶振为 12MHz 即一个机器周期为 1us。
一. 500ms 延时子程序