正文
c语言微妙延时函数 c语言延时函数怎么用
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
51单片机求10微秒的延时函数 C语言(晶振11.0592MHz)
1、下面几个是单片机的延时程序(包括asm和C程序,都是我在学单片机的过程中用到的),在单片机延时程序中应考虑所使用的晶振的频率,在51系列的单片机中我们常用的是11.0592MHz和12.0000MHz的晶振,而在AVR单片机上常用的有8.000MHz和4.000MH的晶振所以在网上查找程序时如果涉及到精确延时则应该注意晶振的频率是多大。
2、软件延时:(asm)
晶振12MHZ,延时1秒
程序如下:
DELAY:MOV
72H,#100
LOOP3:MOV
71H,#100
LOOP1:MOV
70H,#47
LOOP0:DJNZ
70H,LOOP0
NOP
DJNZ
71H,LOOP1
MOV
70H,#46
LOOP2:DJNZ
70H,LOOP2
NOP
DJNZ
72H,LOOP3
MOV
70H,#48
LOOP4:DJNZ
70H,LOOP4
定时器延时:
晶振12MHZ,延时1s,定时器0工作方式为方式1
DELAY1:MOV
R7,#0AH
;;晶振12MHZ,延时0.5秒
AJMP
DELAY
DELAY2:MOV
R7,#14H
;;晶振12MHZ,延时1秒
DELAY:CLR
EX0
MOV
TMOD,#01H
;设置定时器的工作方式为方式1
MOV
TL0,#0B0H
;给定时器设置计数初始值
MOV
TH0,#3CH
SETB
TR0
;开启定时器
HERE:JBC
TF0,NEXT1
SJMP
HERE
NEXT1:MOV
TL0,#0B0H
MOV
TH0,#3CH
DJNZ
R7,HERE
CLR
TR0
;定时器要软件清零
SETB
EX0
RET
3、C语言延时程序:
10ms延时子程序(12MHZ)
void
delay10ms(void)
{
unsigned
char
i,j,k;
for(i=5;i0;i--)
for(j=4;j0;j--)
for(k=248;k0;k--);
}
1s延时子程序(12MHZ)
void
delay1s(void)
{
unsigned
char
h,i,j,k;
for(h=5;h0;h--)
for(i=4;i0;i--)
for(j=116;j0;j--)
for(k=214;k0;k--);
}
200ms延时子程序(12MHZ)
void
delay200ms(void)
{
unsigned
char
i,j,k;
for(i=5;i0;i--)
for(j=132;j0;j--)
for(k=150;k0;k--);
}
500ms延时子程序程序:
(12MHZ)
void
delay500ms(void)
{
unsigned
char
i,j,k;
for(i=15;i0;i--)
for(j=202;j0;j--)
for(k=81;k0;k--);
}
C语言delay函数延时计算
C语言delay函数延时计算源代码如下:
#include "stdlib.h"
void delay()
{
time_t start,end;
start=time(null);
unchar i;
while(z--)
{
for(i=0;ilt;121;i++);
}
end=time(null);
printf("%f",difftime(end,start));
}
扩展资料
1、对于要求精确延时时间更长,这时就要采用循环嵌套的方法来实现,因此,循环嵌套的方法常用于达到ms级的延时。
对于循环语句同样可以采用for,do…while,while结构来完成,每个循环体内的变量仍然采用无符号字符变量。
求一个C语言的微秒级延时函数
c语言,微秒级延时
void Delay_us (unsigned char time_us)
{
unsigned long int TM_LODAE;
TR2 = 0; // Stop timer
TF2H = 0; // Clear timer overflow flag
TM_LODAE = 65535-(UINT)(SYSCLK/1000000) * (UINT)(time_us);
// TMR2 = -( (UINT)(SYSCLK/1000000) * (UINT)(time_us) );
TMR2H = TM_LODAE8;
TMR2L = TM_LODAE0x00FF;
TR2 = 1; // Start timer
while (!TF2H); // Wait till timer overflow occurs
TR2 = 0; // Stop timer
}
程序分析:
前面一起住航分析一下该代码,
unsigned long int TM_LODAE; 声明一个长整型数据,
TR2 = 0; 定时器2停止计时
TF2H = 0; 清除定时器2中断标志
TM_LODAE = 65535-(UINT)(SYSCLK/1000000) * (UINT)(time_us); 计算定时器初值。 SYSCLK是系统的晶振频率,SYSCLK/1000000是系统 1uS 执行的指令。 (UINT)(SYSCLK/1000000) * (UINT)(time_us)就是系统 time_us执行的指令数。 65535-(UINT)(SYSCLK/1000000) * (UINT)(time_us)定时器需要 TM_LODAE指令周期才会溢出。
该单片机的一个指令周期就是一个时钟周期.TMR2H = TM_LODAE8; TMR2L = TM_LODAE0x00FF;置定时器寄存器的初值、
TR2 = 1; 启动单片机计时 while (!TF2H); 等待定时器2寄存器溢出。TR2 = 0;停止计时,在这段代码注释中已经说明了应该有50nS的误差,这个是函数调用产生的。
单片机C语言中怎么实现微秒级延时?
可以用_nop_( )函数来实现微秒级c语言微妙延时函数的延时。
_nop_(); // 直接当成一条语句使用c语言微妙延时函数,产生一条NOP指令
NOP指令为单周期指令c语言微妙延时函数,可由晶振频率算出延时时间,对于12M晶振,延时1uS。
注c语言微妙延时函数:使用该函数时,需要将头文件#includeintrins.h包含进源文件中。
c语言微妙延时函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言延时函数怎么用、c语言微妙延时函数的信息别忘了在本站进行查找喔。