c语言中延时5us函数 c语言延时函数delay延时1秒

关于C语言for循环延时函数for循环实现C语言精确延时
(晶振12MHz,一个机器周期1us.)
一. 500ms延时子程序
程序:
void delay500ms(void){
unsigned char i,j,k;
for(i=15;i0;i--)
for(j=202;j0;j--)
for(k=81;k0;k--);
}
产生的汇编:
C:0x08007F0FMOVR7,#0x0F
C:0x08027ECAMOVR6,#0xCA
C:0x08047D51MOVR5,#0x51
C:0x0806DDFEDJNZR5,C:0806
C:0x0808DEFADJNZR6,C:0804
C:0x080ADFF6DJNZR7,C:0802
C:0x080C22RET
计算分析:
程序共有三层循环
一层循环n:R5*2 = 81*2 = 162usDJNZ2us
二层循环m:R6*(n 3) = 202*165 = 33330usDJNZ2usR5赋值 1us = 3us
三层循环: R7*(m 3) = 15*33333 = 499995usDJNZ2usR6赋值 1us = 3us
循环外:5us子程序调用 2us子程序返回 2usR7赋值 1us = 5us
延时总时间 = 三层循环循环外 = 499995 5 = 500000us =500ms
计算公式:延时时间=[(2*R5 3)*R6 3]*R7 5
二. 200ms延时子程序
程序:
void delay200ms(void){
unsigned char i,j,k;
for(i=5;i0;i--)
for(j=132;j0;j--)
for(k=150;k0;k--);
}
产生的汇编
C:0x08007F05MOVR7,#0x05
C:0x08027E84MOVR6,#0x84
C:0x08047D96MOVR5,#0x96
C:0x0806DDFEDJNZR5,C:0806
C:0x0808DEFADJNZR6,C:0804
C:0x080ADFF6DJNZR7,C:0802
C:0x080C22RET
三. 10ms延时子程序
程序:
void delay10ms(void){
unsigned char i,j,k;
for(i=5;i0;i--)
for(j=4;j0;j--)
for(k=248;k0;k--);
}
产生的汇编
C:0x08007F05MOVR7,#0x05
C:0x08027E04MOVR6,#0x04
C:0x08047DF8MOVR5,#0xF8
C:0x0806DDFEDJNZR5,C:0806
C:0x0808DEFADJNZR6,C:0804
C:0x080ADFF6DJNZR7,C:0802
C:0x080C22RET
四. 1s延时子程序
程序:
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--);
}
产生的汇编
C:0x08007F05MOVR7,#0x05
C:0x08027E04MOVR6,#0x04
C:0x08047D74MOVR5,#0x74
C:0x08067CD6MOVR4,#0xD6
C:0x0808DCFEDJNZR4,C:0808
C:0x080ADDFADJNZR5,C:0806
C:0x080CDEF6DJNZR6,C:0804
C:0x080EDFF2DJNZR7,C:0802
C:0x081022RET
在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响.
delay函数delay 5 表示延时多长时间 , 晶振是11.0592的delay(5);一般情况下是指延时5ms 。因为延时5us对于11.0592晶振来说根本不可能的 。
基于51单片机的C语言延时函数程序编写12M晶振延时5s的程序如下:
void delayus2x(char n)//延时nx2 us
{
while(--n);
}
void delayms(unsigned intt)//延时 t x 1ms
{
while(t--)
{
delayus2x(245);
delayux2x(245);
}
}
delayms(50000);//调用此句延时5s
至于不能大于255 , 因为你的数据类型为char型 , 及8字节,最大值为255,2的8次方减一 。
求一个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语言中一个标准的延时1us的函数怎么写?如果是单片机上,是有可能的
单片机12M晶振执行一条指令1us,所以C语言1us延时程序 用12M晶振延时1us,用—_nop_();
#includeintrins.h //头文件
_nop_(); //这一个语句表示1us延时
【c语言中延时5us函数 c语言延时函数delay延时1秒】c语言中延时5us函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言延时函数delay延时1秒、c语言中延时5us函数的信息别忘了在本站进行查找喔 。

    推荐阅读