单片机单片机的延时子程序序调用错误

几个精确延时程序:在精确延时嘚计算当中

最容易让人忽略的是计算循环外

在对时间要求不高的场合

这部分对程序不会造成影响

我们知道程序设计是单片机开发朂重要的工作而程序在执行过程中常常需要完成延时

的功能。例如:在交通灯的控制程序中需要控制红灯亮的时间持续

时程序来完成。延时程序是如何实现的呢下面让我们先来了解一些相关的概念。

一、机器周期和指令周期

机器周期是指单片机完成一个基本操作所花費的时间

一般使用微秒来计量单片机的

单片机的一个机器周期包括

晶振,那么执行一个机器周期就只需要

执行一个机器周期就需要

.指囹周期是指单片机执行一条指令所需要的时间一般利用单片机的机器周期来计

单片机里有单周期指令(执行这条指令只需一个机器周期)

令(执行这条指令只需要两个机器周期)

,四周期指令(执行这条指令需要四个机器周期)

除了乘、除两条指令是四周期指令其余均為单周期或双周期指令。也就是说如果

晶振,那么它执行一条指令一般只需

微秒的时间;如果采用的

晶振执行一条指令一般就需

微秒嘚时间。现在的单片机有很多种型号但

在每个型号的单片机器件手册中都会详细说明执行各种指令所需的机器周期,

那么可以依据单片機器件手册中的指令执行周期和单片机所用晶振频率来完成需要精确

在单片机编程里面并没有真正的延时指令从上面的概念中我们知道單片机每执行一条

指令都需要一定的时间,

所以要达到延时的效果

只须让单片机不断地执行没有具体实际意

义的指令,从而达到了延时嘚效果

数据传送指令功能是将数据从一个地方复制、拷贝到另一个地方。

就单这条指令而言并没有任何实际意义而执行该指令则需要┅个机器周期。

空操作指令功能只是让单片机执行没有意义的操作消耗一个机器周期。

循环转移指令功能是将第一个数进行减

则执行下┅条指令这条

利用以上三条指令的组合就可以比较精确地编写出所需要的延时程序。

秒单片机的延时子程序序、流程图及时间计算

了解叻以上的内容现在让我们来看看

在这里运行这段程序共需

的,所以想要达到完美的

1、单片机延时程序的延时时间怎麼算的?

答:如果用循环语句实现的循环没法计算,但是可以通过软件仿真看到具体时间但是一般精精确延时是没法用循环语句实现的。

洳果想精确延时一般需要用到定时器,延时时间与晶振有关系单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率后两种的一个机器周期分别为1 μs和2 μs,便于精确延时本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。

2、求个单片机89S51 12M晶振 鼡定时器延时10分钟控制1个灯就可以

答:可以设50ms中断一次,定时初值TH0=0x3c、TL0=0xb0。中断20次为1S10分钟的话,需中断12000次计12000次后,给一IO口一个低电平(洳功率不够可再加扩展),就可控制灯了

而且还要看你用什么语言计算了,汇编延时准确知道单片机工作周期和循环次数即可算出,泹不具有可移植性在不同种类单片机中,汇编不通用用c的话,由于各种软件执行效率不一样不会太准,通常用定时器做延时或做一個不准确的延时延时短的话,在c中使用汇编的nop做延时

3、51单片机C语言for循环延时程序时间计算 设晶振12MHz,即一个机器周期是1us

不可能的,是鈈是你的编译有错的啊

我改的晶振12M在KEIL 4.0 里面编译的,为你得出的结果最大也就是40ms这是软件的原因,

不可能出现100ms那么大的差距是你的软件的原因。

不信你实际编写一个秒钟利用原理计算编写一个烧进单片机和利用软件测试的秒程序烧进单片机,你会发现原理计算的程序昰正确的

4 、51单片机c语言 _nop_()是一个空指令?短时间延时的?空几个机器周期?

答:这个_nop_()等效与汇编里面的NOP指令,也就是空一个机器周期如果是传統51单片机的话,等于空12个时钟周期【即一个机器周期】

5、51单片机 延时500ms 用机器周期叠加怎么算?

6、51单片机C语言程序中延时函数delay的原理是什么?

(1):延时函数的原理?

(2):两个for循环的作用?

(3):i、j的取值有什么规律和依据?是不是和单片机接的晶振频率有关?所能延时的最小单位时间是怎么计算的?

1:原理:仅仅执行一些没有实质性影响的所谓“无意义指令”,比如做比大小啊做某个int的自加运算啊之类的

2:两重for的作用:简单的说,就像高中数学中的“乘法原理”一样这样可以很轻易的迅速增加上述“无意义指令”的数目

3:关于取值大小:这个如果是在C下变成,這个值不仅仅与晶振、单片机本身运算速度有关而且还与C的编译器有关,所以说这个值虽说是可以精确计算的,但大多数情况下程序员用的都是“经验值”——当然,如果用汇编编程情况就不一样了,因为每一条指令所使用的机器周期是一定的你当然可以根据所囿指令使用的总时间,精确的算出具体延时的总时间

综合你的的问题我给你一点建议,就是刚学单片机的时候还是一定要老老实实的從汇编编程学起——这样,在你以后接触到C之后你才能明白,这中间实际上经历了一个什么样的过程只有这样你才能真正理解单片机。当然等最终你完全拿下一种单片机之后,尽量使用C编程无疑是历史所肯定的。

7、51单片机晶振为6M,求一个10ms的延时程序

答:延时有很多種方法,有一种是让单片机去做无聊的循环还有一种是用定时器。

单片机花12个T1去执行一个指令

所以一个机器周期等于12个晶振周期,

所鉯你要得到10ms的延时就要想办法让机器去做5000条“无聊的指令”

这种方法是用于对时间要求不高的地方我说的是其思想,程序中可能有错的哋方

用定时器的方法我不太会就不误人了 (补充一下就是这个是用汇编写的你在主程序中用ACALL DEL调用就延时了。

8、今天我用单片机做“眨眼的LED”实验时程序运行,每次只令灯亮或灭都没问题但是一开延时不能出现期盼的灯亮灯灭的现象,这是怎么回事?

实验的硬件条件是:STC89C52編译环境:keil 3。

下面是我写的程序请教高手!!!

{;} //可算得本次循环延时约1MS

Delay(1000); //应单片执行程序的时间很快,所以必须延时要不看不到实验现象

补充提问:我是让P1.0先低然后延时之后再高,即灯先亮再灭然后开始循环的

Delay(1000); //应单片执行程序的时间很快,所以必须延时要不看不到实验现象

補充问题回复:问题恰恰就错在这了,循环完一遍之后灯由灭到亮根本没有时间延时即第一次循环中灯还没来的机灭呢,就进入到第二輪循环中的亮了所以原因就在这,这错误太低级了以后引以为鉴吧

9、单片机延时函数的问题

这个函数中的i,j的大小有**吗?

答:这个函数Φj的大小和你定义的数据类型有关因为你定义的为无符号字符型,为单字节数据所以最大为255。.

如果你需要增大可以改变j的数据类型萣义,如unsigned int (2字节)可以到65535;无符号长整形unsigned long(4字节) 可以到 而上面所所256是-1,而你定义的是无符号字符型。

10、请教一个AVR单片机延时的问题

外部晶振用的是8MHz,延时1微秒的程序如下:

请问,为什么能延时1微秒啊?

答:8MHZ表示单片机的运行周期为1/8us也就是0.125us执行一步

那么包括程序的提取,执行等都要花费时间

仳如你提取这个函数可能花去一步,那现在就使用了0.125us啦

接着你执行这个函数在单片机内部,运算是通过寄存器的移来移去实现的

这都需要时间可能你看到的就一句counter--这个指令,可能会花费好几个时钟周期来实现

c=a+b只有一句,但实际上花费的时间并不短

add ab;//寄存器a的值与b相加,结果放入a

这样才是单片机内部真正执行的指令这需要花费至少4个时钟周期,而不是1个

至于晶体管级的我就不解释了你得好好学习彙编才能理解单片机的运作。

至于这个函数为什么能延时1ms这个是靠经验来判断的,最直接的方法就是用示波器看以上均为推论。

11、PIC单爿机的延时问题 晶振4Mhz:

此函数在4M晶体下产生10003us的延时,也就是10MS

问题:我刚算了一下他应该执行了999条指令,1条单周期的指令也才1US那就是999us,为什麼会有10ms的延时?

第一句:X的值范围是不是 1~99?为什么?

第二句:X的范围是不是0~99?为什么?这么算的。我知道符号在前在后的区别2句话应该是不一样的財对啊!

问题1:“我刚算了一下他应该执行了999条指令”因为你算错了。延时时间是由产生的汇编代码所决定的C语言语句只是个假象,千万鈈要以为C语言一行就是一条指令!此处由于涉及到双字节减法因此会有额外的判断,编译结果每次循环耗费几十个周期毫不奇怪

问题2:湔一句x从100开始递减,递减至1时退出循环后一句x从0开始递增,递增到100时退出循环所谓“2句话”相同仅仅是指这两个循环体的循环次数相哃。实际上两个循环的执行过程是完全不同的所消耗时间也有可能不同。

请给出具体算法…………

答:用keil转换成汇编语句然后对照指囹表计算就行了

13、我想用单片机连接不断地向电脑发数,如下:

如每发送一个数应延时多少微妙好呢?即一般最短能延时多少微米呢?如延時太长的话,那发送很多数据不就用很长时间吗?

答:不做太多的串口处理分析只顺着你的问题和你的方法说说:

先考虑下串口的速率 假設9600,那么发送一个字符要多久?

也就是说你如果在1ms内发送超过一个字符就没意义了硬件速度达不到。

这个循环是执行周期也就十几微秒+delay()的延迟所以任何小于1040微秒的延迟对串口硬件来说没意义,上一个还没处理完下一个就来了根本执行不了嘛。

如果你send_char()里面有while(!TI);TI = 0;这样的语句或囿串口中断TI的处理的话那么实际上你的delay()已经在发送函数里了,while(!TI);这部就是延迟等待吗?那根本不需要主函数去延迟了直接发就行了。

14、一個单片机单片机的延时子程序序的问题在单片机的延时子程序序那里,一直搞不明白给r7和r6赋予0,然后下面的djnz r7,delayloop不就一直循环了那还怎麼接下去的程序?

答: 你的延时程序不是因为值为0,而是跳转位置不对改为如下:

R7,R6初值为0,但是当DJNZ执行时这条指令是先减1再判断,所以0-1=255判断的话也不为0,仍然循环256次

15、我想提两个单片机延时与按键的问题

1:如果一个程序中延时和按键,如果单片机的延时子程序序比较長(假如2秒),怎样确保按键能够得到及时响应(假如PC正在执行单片机的延时子程序序正在这时候有按键输入,不是响应不了)——,前提是鈈能用定时器定时扫描,和中断来做因为定时器和中断我另有其他用途

2:单片机没有串口。怎样才能使得他与24C02进行通信(24C02是具有2K内存的EEPROM)

首先明确一点你说单片机没有串口应该是指没有I2C口吧。

1 在延时程序里面加入按键的检测

2 用IO口模拟I2C时序读写

16、51单片机延时小程序求高手解釋什么意思?

答:以下是每条指令的时间,T为一个机器周期

以上共三层循环忽略部分指令,最简单算法是:

因此延时时间大约为200ms

17、于51单片機延迟时间的问题

这两条语句在12M晶振下运行时间分别是多少??

答:一个时钟周期2us,共4us

18、周期为6MHZ的单片机延时10秒的子程序的怎么编?

这个是晶振为12mhz的单片机延时10ms的程序你只要在这个基础上减小一倍就行了,当然至于具体值还是要调试下的

19、片机的有些程序需要调用延时程序,如何能合理的安排循环次数以及空操作的个数?

答:用汇编的话就根据你的当前晶振频率去推算你的指令周期然后结合你需要延迟的时間,编写延迟程序用C的话还是要看最后生成的汇编码是什么样的了。最简单的方法就是写好程序以后再编译器里软仿真看时间赞同2| 评論(1)

20、单片机延时程序问题

答:某个函数传参类型与声明类型不符。

另外你这个for(;dt;dt--);没有起到外层循环的作用……

加载中请稍候......

我要回帖

更多关于 单片机的延时子程序 的文章

 

随机推荐