【Keil C51单片机延时程序】
【单片机延时简单说明及程序案例】
基本说明
单片机中的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--);
}