在编写单片机程序经常会用到延时,做到精确延时的方法有两种:软件延时(采用循环体实现)和硬件延时(定时器/计数器实现)。
补充_nop_()函数
- C语言中没有_nop_()函数,该函数是在51单片机中用的延时函数,延时一个指令周期。在单片机c语言中直接调用库函数即可:#include
// 声明了void nop(void); - 编写延时函数的时候,要注意,在调用此函数时,需要一个调用指令,即LCALL指令消耗两个周期(2us),延时函数执行完后要返回主调函数,需要一个返回指令,即RET指令(2us)。
- 例如用6MHz的晶振,则如下for循环大约延时1秒。
int i;
for(i=0; i nop(); // 延时一个指令周期,相当于执行一条无意义的语言
-
指令周期(机器周期=1指令周期):CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的。通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。
-
振荡周期(时钟周期):一个振荡周期 = 晶振频率的倒数。对于单片机时钟周期,时钟周期是单片机的基本时间单位。两个振荡周期(时钟周期)组成一个状态周期。
-
机器周期:单片机的基本操作周期,在一个操作周期内,单片机完成一项基本操作,如取指令、存储器读/写等。
1个机器周期=6个状态周期=12个时钟周期=12个振荡周期。
一个机器周期(即一条单周期指令)被执行所占时间为12*(1/ 晶振频率)= x μs。
12MHZ的晶振:一个机器周期=12*[1/(12*10^6)]秒=1微秒
附上常用延时函数
- 11.0592MHz晶振
- 12MHz晶振
- 24MHz晶振
文章知识点与官方知识档案匹配,可进一步学习相关知识算法技能树首页概览33914 人正在系统学习中
来源:谏书稀
声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!