如果想精确延时,一般需要用到定时器,延时时间与晶振有关系,单片机系统一般常选用11.059
2
mhz、12
mhz或6
mhz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1
μs和2
μs,便于精确延时。本程序中假设使用频率为12
mhz的晶振。最长的延时时间可达216=65
536
μs。若定时器工作在方式2,则可实现极短时间的精确延时如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。
C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。 以某晶振为12MHz的单片机 为例,晶振为12MHz即一个机器周期为1us。一. 500ms延时子程序程序: void delay500ms(void){unsigned char i,j,kfor(i=15i>0i--)for(j=202j>0j--)for(k=81k>0k--)}计算分析:程序共有三层循环一层循环n:R5*2 = 81*2 = 162us DJNZ 2us二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值 1us = 3us三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值 1us = 3us循环外: 5us 子程序调用 2us + 子程序返回 2us + R7赋值 1us = 5us延时总时间 = 三层循环 + 循环外 = 499995+5 = 500000us =500ms计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5二. 200ms延时子程序程序:void delay200ms(void){unsigned char i,j,kfor(i=5i>0i--)for(j=132j>0j--)for(k=150k>0k--)}三. 10ms延时子程序程序:void delay10ms(void){unsigned char i,j,kfor(i=5i>0i--)for(j=4j>0j--)for(k=248k>0k--)}四. 1s延时子程序程序:void delay1s(void){unsigned char h,i,j,kfor(h=5h>0h--)(网文)
单片机延时计算方法用延时函数就可以实现;
首先,设置定时器工作方式,也就是TMOD,在设置TH0/1,TL0/1的初值,也就是定时时间的设置,然后设置中断允许,并开中断就可以;
参考例子如下:
#include<reg51.h>
void main()
{
TMOD=0X01
TH0=0X3C
TL0=0XB0
EA=1
ET0=1
TR0=1
while(1)
}
void timer0() interrupt 1
{
TH0=0X3F
TL0=0XB0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)