下面的是我用定时器0做的延时函数,你看看,可以精确到10ms,如果你还想精确,调定时器的初值就可以。
在邯山等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站建设、成都网站制作 网站设计制作按需求定制设计,公司网站建设,企业网站建设,成都品牌网站建设,营销型网站,成都外贸网站建设,邯山网站建设费用合理。
启动定时器,程序可用读取其计数,或者用定时器触发中断,在中断中自己用变量计数,这样就有了一个时间计数值了。再有就是利用RTC也行。
应该是指令周期,根据指令的不同,一般一个指令需要1-4个机器周期来完成(比如乘法或除法就需要48个时钟周期来完成),一般的51单片机都是12分频,也就是说1个机器周期分为12个时钟周期。
delay函数是一个自己定义的延时函数,C语言定义延时函数主要通过无意义指令的执行来达到延时的目,并没有一个软件自带头文件专门有delay这个函数的。
可以放参数,因为void Delay(unsigned char x) //x为形参例如:a=3000*b/a;Delay(a); //带参数a到x,调用延时 delay函数是一般自己定义的一个延时函数。
在单片机的C语言编程中,可以使用循环结构来实现延时操作。具体而言,可以使用一个for循环来实现一段时间的延时。
所谓延时函数就是在函数中设置了几个空操作的动作,每次操作都需要消耗一定的时间,动作结束了,延时时间也就完成了,就会跳出延时函数继续做其他事情了。
恢复现场 继续运行,就好像没有调用过中断服务程序一样。
c语言定义延时函数主要通过无意义指令的执行来达到延时的目的。下面给出一个经典的延时函数。
比如12M晶振for(j=0;j120;j++);大概延时1毫秒,10592M晶振那么for(j=0;j110;j++);延时1毫秒,你这里的for(j=0;j100;j++);延时1毫秒的话,晶振应该是10M,不太常见哟,特别是在单片机方面。
可以有很多办法,一是调整参数,使其延时5分钟或6分钟,循环24次或20次。二是将延时函数的形参改为长整型(32位)延时时间扩大65536倍。
关于大小的值:如果是在C语言中,该值不仅与水晶振动、单片机本身的速度,但也与C的编译器,所以,虽然这个值可以精确计算,但大多数情况下,程序员是经验值。
在单片机c语言中直接调用库函数即可,具体如下:includeintrins.h // 声明了void _nop_(void);_nop_(); // 产生一条NOP指令。