你那种方法实际上延时会比你设置的多1秒(t不等于0的情况下)
准确的可以这样编,不需要Timer控件(下面那个 Timer不是控件名):
Private Sub waittime(delay As Single)
Dim starttime As Single
starttime = Timer
Do Until (Timer - starttime) > delay
DoEvents
Loop
End Sub
补充了一下,这样就没有假死,delay时间可直接设置,精确到001秒。
单片机延时一秒
程序是不固定的
要根据你的晶振 计算出一次循环执行需要的时间
然后 写循环次数
一般是
void delay_one_second(void){
int i;
for(i = 0; i < TIMES; i++);
}
这样就可以了。 TIMES是要计算的。或者 根据示波器 自己尝试。
在Keil里仿真的话,在配置里把晶振调成12MHz,然后在调用delay函数的地方设置一个断点,开始调试程序,运行到断点处,注意程序左边有一个记录当前寄存器和一些状态的窗口,其中,里面有一个是专门记录当前运行了多少时间的变量,记下当前时间T1,然后按F10(不进入子函数)调试,再记录当前时间T2,则延时=T2-T1。多试几个A,差不多调到1s就够了。我一般都这么调。你要想明白其中原理,想自己算的话,你就看看delay的汇编代码段自己算吧。
其实可以用C语言实现的,先要定义好定时器的初值
不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期
机器周期=12/n(n指晶振频率),假设你要定时的时间为M
那么定时的初值为:
M/机器周期=初值;
TH0=(65536-初值)%256;
TL0=(65536-初值)/256;
将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值
例如用12M晶振做1ms定时计算如下:
机器周期=12/1210^6=1us(微秒)
定时初值=(110^-3)/(110^-6)=1000;
所以:TH0=(65536-1000)%256;
TL0=(65536-1000)/256;
将65536-1000=64536化为16进制为:0xFC18
TH0=0xFC;
TL0=0X18;
定好初值后要延迟一秒就定一个延时参数,这里使用1000就行了(定时为1ms)中断程序为:
timer0() interrupt 1 // 1ms延时(120MHz)
{
TR0=0;
ET0=0;
TH0=0xfc;
TL0=0x18;
if(delayTimes1!=0) delayTimes1--;
TR0=1;
ET0=1;
}
调用程序大致为:
if(delay_flag==0)
{
delay_flag=1;
delayTimes1=1000;
}
if(delayTimes1==0)
{
delay_flag=0;
这里写定时到的 *** 作就行了;
}
(在主程序中使用delay_ms()这样的程序会影响程序运行速度的,使用中断就不会)
void Delay1000ms() //@110592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//
void Delay1000ms() //@12000MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 154;
k = 122;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//
建议你下载这个软件 stc89c51和at89c51内核都一样,这个软件可以计算延时还有各种例程
以上就是关于VB 延时函数全部的内容,包括:VB 延时函数、单片机延时一秒的c程序、请问在单片机C语言编程中,用delay延迟的话,1秒程序是什么单片机晶振为12MHZ ...等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)