但是,晶振是12MHz,一条汇编的指令就至少是1us,C语言的语句,就要更多。
钟山网站建设公司成都创新互联,钟山网站设计制作,有大型网站制作公司丰富经验。已为钟山1000多家提供企业网站建设服务。企业网站搭建\外贸网站制作要多少钱,请找那个售后服务好的钟山做网站的公司定做!
void delay_ms(uint ms){ unsigned i,j;for(i=0;ims;i++)for(j=0;j1052;j++);} C语言的延时函数一般不太准,如果要求不是很高的话,搞调整一下程序中1052那个值就可以做到。如果要更精确,最好用汇编。
单片机中的delay()的单位时间不是系统提供的,而是用户自己编制的。如果用循环语句实现的循环,没法计算,但是可以通过软件仿真看到具体时间,但是一般精精确延时是没法用循环语句实现的。
关于大小的值:如果是在C语言中,该值不仅与水晶振动、单片机本身的速度,但也与C的编译器,所以,虽然这个值可以精确计算,但大多数情况下,程序员是经验值。
延时时间的计算与单片机的晶振频率有关。若晶振频率为12Mhz,那么单片机每震动一次所需要的时间是1/12M s。
void delay(uint n){ uint i,j;for(i=n;i0;i--){ for(j=110;j0;j--);} } 当n=1是延时大约是1ms,就是说n等于都少就延时多少ms,当然n的值不超过uint的最大值。
1、C语言的延迟函数一般是利用无意义程序运行来控制时间从而达到延时的目的 举个例子:for(i=0;ix;i++)for(j=0;j120;j++);这是延时x毫秒的for循环语句。值得注意的是记得最后的;一定得记得写。
2、C语言中的for语句一般的表达形式如下图所示:执行流程如下图所示:说明:表达式1为初值表达式,表达式2为循环条件表达式,表达式3为循环变量控制表达式。
3、我只记得在C语言里,有一个计时功能,大体思路如下: 在执行For循环之前,调用GetSystemTime一个类似的函数获取当前系统时间,在执行For语句后,再次得到,利用两个时间差计算for的执行时间。
4、这个延时函数是个指令延时,指令多了,延时时间就长。for(x=0;x120;x++) 这个循环里,每一次循环,都会有一个 加一 和 判断跳转指令。
5、--- 这是因为循环次数减小之后,快到让你眼睛花看不清楚而已。
6、for里面是空语句自动会跳出,因为即使执行了也不会用时间。要当它延时函数用,必须在循环体里干点事,比如随便做个加法减法什么的。
每一遍,如果是1us,才能是延时约1s。但是,晶振是12MHz,一条汇编的指令就至少是1us,C语言的语句,就要更多。
记下当前时间T1,然后按F10(不进入子函数)调试,再记录当前时间T2,则延时=T2-T1。多试几个A,差不多调到1s就够了。我一般都这么调。你要想明白其中原理,想自己算的话,你就看看delay的汇编代码段自己算吧。
void main(){ TMOD=0x00;TH1=0x3c;TL1=0xb0;EA=1;ET1=1;TR1=1;while(1){ if(i==20){ i=0;//下面写你要处理的的其他程序,你只要了定时1s。
然后,进行宏定义,代码如图所示。然后声明P1口,如下图所示。最后,将延时语句全部添加进去,代码按照图中所示的直接敲入即可。最后,点击编译,生成HEX文件就可以了,这样51单片机延时语句就完成了。
要看你的时钟周期,如果是12Mhz的话,每个时钟周期MC=6*2/12 M =1us,所以延迟是让机器计数1000000下,上面那个公式你自己套用24Mhz的就是2000000下。c语言的循环次数你自己算,每条指令一个周期,所以楼上的程序在12Mhz下是1s延迟。
本程序来自《单片机C语言程序设计实训100例——基于8051+Proteus仿真》没用中断。