【Keil C51单片机延时程序】

【单片机延时简单说明及程序案例】

  • 基本说明
  • 常用的延时程序
  • _nop_()(um级)
  • 循环函数(延时一般大于10us)
  • 定时器方式(常用单位为秒)
  • 通用比较精确的ms级延时程序
  • 基本说明

    单片机中的delay()的单位时间不是系统提供的,而是用户自己编制的;
    晶振为12MHz的单片机,机器周期等于晶振周期*分频=(1/12)*12=1ms;
    晶振12MHz和16位的单片机一次最大的延时时间为2^16=65536us=65ms;

    标准的C语言没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生延迟的效果,所以总会看起来复杂无序。验证程序延时是否正确可将程序编译成汇编程序在进行计算,至于为什么,目前也没找到合适的资料。

    常用的延时程序

    nop()(um级)

    #include<instrins.h>
    _nop_();
    

    下面4us延时声明(直接定义法无需编译执行,故无空指令参与延时):

    #define Delay4us(){_nop_();_nop_();_nop_();_nop_();}
    

    循环函数(延时一般大于10us)

    500ms延时:

    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--);
    }
    

    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--);
    }
    

    1ms延时:

    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 delay1ms()
    {
    	unsigned char i,j;	
    	for(i=0;i<10;i++)
    	for(j=0;j<33;j++);		 
    }
    

    定时器方式(常用单位为秒)

    1 可以按定时时间的计算公式, 计算出定时器的时间常数X:
    定时时间T=(2的N次方-X)12/单片机晶振频率
    2 N为定时器的工作方式:
    方式0时,N=13
    方式1时,N=16
    方式2时,N=8
    3 根据定时时间和工作方式,计算出时间常数X
    把X转换成二进制数,高8位送给TH1,低8位送给TL1,就可以启动定时器开始定时了。
    例如: 工作在方式1,定时时间为1000微秒 晶振频率=12MHZ
    则 定时时间T=(2的16次方-X)12/12MHZ=1000 解出 X=64536=FC18H

    例:
    16位定时器,th0是高八位,tl0是低八位,算好你要定的时间,如你要定1000毫秒,
    th0=(65535-64535)/256
    tl0=(65535-64535)%256

    定时65ms,则th0=0;tl0=0;
    直接写入程序即可

    初始设置好th0和tl0;需要的时候,启动定时器TR0=1;执行程序并延时;关闭定时器TR0=0;

    通用比较精确的ms级延时程序

    void Delayms(unsigned int n)
    {
        unsigned int i,j;
        for(j=n;j>0;j--)
        for(i=112;i>0;i--);
    
    
    }
    

    参考链接: 循环延时1,循环延时2,定时器延时

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Keil C51单片机延时程序】

    发表评论