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 intTM_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 intTM_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语言微妙延时函数的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于c语言延时函数怎么用、c语言微妙延时函数的信息别忘了在本站进行查找喔 。
推荐阅读
- 新媒体电商行业前景如何,电商行业的现状与前景
- 服务器被禁用如何恢复,电脑服务器被禁用了,怎么打开
- 关于童装无人直播视频素材的信息
- c语言延时函数语法 c语言延时10s的函数怎么写
- jquery中文文案,jquery中文手册
- 软件开发毕业设计论文大全,软件开发毕业设计论文题目
- 女人直播技巧,女生直播怎么聊天
- php两个数据库表 php建立数据库连接的代码
- go语言idet,go语言idea