如果是单片机上,是有可能的
创新互联专注于安居企业网站建设,响应式网站设计,商城网站建设。安居网站建设公司,为安居等地区提供建站服务。全流程按需开发,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务
单片机12M晶振执行一条指令1us,所以C语言1us延时程序 用12M晶振延时1us,用—_nop_();
#includeintrins.h //头文件
_nop_(); //这一个语句表示1us延时
C语言的延迟函数一般是利用无意义程序运行来控制时间从而达到延时的目的
举个例子:
for(i=0;ix;i++)
for(j=0;j120;j++);
这是延时x毫秒的for循环语句。
值得注意的是记得最后的;一定得记得写。
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的误差,这个是函数调用产生的。
原理:只是执行一些所谓的“无实际意义的指令”,如缩放或执行一个int自加,简单地说,就像高中数学中的“乘法原理”一样,很容易迅速增加上面提到的“无意义指令”的数量
关于大小的值:如果是在C语言中,该值不仅与水晶振动、单片机本身的速度,但也与C的编译器,所以,虽然这个值可以精确计算,但大多数情况下,程序员是经验值。
当然,如果你在汇编中编程,情况就不同了,因为每条指令使用一定数量的机器周期,你当然可以根据所有指令使用的总时间来计算特定延迟的总时间。
扩展资料:
定义延迟XMS毫秒的延迟函数
Voiddelay(unsignedintXMS)//XMS表示需要延迟的毫秒数
{
无符号intx,y;
For(x=XMS;X0;X-)
For(y=110;Y”0;Y-);
}
使用:
VoidDelay10us(ucharMs)
{
Uchar数据我;
(;女士“0;------Ms)
对于(I = 26)我 0;我-);
}
I=[(延迟值-1.75)*12/ms-15]/4