产品分类
联系我们

销售直拨
     025-85550202;
     025-85550520;


master@csch.com.cn

技术咨询:
     025-85550520

duan@csch.com.cn

售后服务专线:

     15251851604    

wu_yuyang@csch.com.cn

传 真:025-85550303


深圳市中霍电子技术有限公司
地址:深圳市龙华新区龙华街道牛地埔村美满圆小区
联系人:颜安军/副总
Mobile:18038070895
E-mail: szyanaj@csch.com.cn  
 
首页  >  新闻中心  >  其它

单片机延时这20个问题要弄明白2

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

void delay(uchar i)

{

uchar j;

while(i--)

{

for(j=125;j>0;j--)

;

}

}

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

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

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

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

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

void delay_us(unsigned int delay_counter)//延时1us

{

do

{

delay_counter--;

}

while(delay_counter>1);

}

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

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

你使用的是软件延时

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

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

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

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

举个例子:

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

mov a,#data1;//数据data1放入a寄存器

mov b,#data2;//数据data2放入b寄存器

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

mov c,a;//将a的值放入c

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

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

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

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

void delay()

{

unsigned int d=1000;

while(--d){;}

}

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

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

1:for(x=100;--x;){;} : 2: for(x=0;x<100;x++){;} 2句话相同

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

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

答:

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

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

12、stc单片机的延时问题 ,STC10F08XE单片机,晶振22.1184M

void delay(unsigned long uldata)

{

unsigned int j = 0;

unsigned int g = 0;

for (j=0;j<5;j++)

{

for (g=0;g

{

_nop_();

_nop_();

_nop_();

}

}

}

当uldata=1时延时多少秒?

请给出具体算法…………

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

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

while (1)

{

send_char('9');

delay(n);

}

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

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

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

(9600bit/S) / 10bit(一个字符1+8+1) = 960字符/秒 约 1ms/byte

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

while(1)

{

send_char('9');

delay(n);

}

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

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

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

[!--empirenews.page--]

org 0000h

ljmp start

org 0030h

start: mov a,#0feh

mov r5,#8

output: mov p1,a

rl a

call delay

djnz r5,output

ljmp start

delay: mov r6,#0

mov r7,#0

delayloop:djnz r7,delayloop

djnz r6,delayloop

ret

end

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

delay: mov r6,#0

delayloop:mov r7,#0

:djnz r7,$

djnz r6,delayloop

ret

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

0-1=255的解释:

0000 0000

- 0000 0001

-------------------------

1111

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

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

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

答:

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

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

2 用IO口模拟I2C时序读写

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

delay200ms:

mov r2,#82

l0:mov r1,#116

l1:mov r0,#9

djnz r0,$

djnz r1,l1

djnz r2,l0

ret

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

delay200ms:

mov r2,#82;1T

l0:mov r1,#116;1T

l1:mov r0,#9;1T

djnz r0,$;2T

djnz r1,l1;2T

djnz r2,l0;2T

ret;2T

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

2*9*116*82=171216

不忽略指令是:

1+(1+(1+2*9+2)*116+2)*82+2=200001

因此延时时间大约为200ms

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

uchar i;i--;

uint i;i--;

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

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

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

答:/********************************************************************

* 名称 : Delay()

* 功能 : 延时,延时时间为 10ms * del。这是通过软件延时,有一定误差。

* 输入 : del

* 输出 : 无

***********************************************************************/

void Delay(uint del)

{

uint i,j;

for(i=0; i

for(j=0; j<1827; j++) //这个是通过软件仿真得出的数

;

}

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

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

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

20、单片机延时程序问题

延时程序 void delay(uint dt)

{

uchar bt;

for(;dt;dt--);

for(bt=0;bt<255;bt++);

}

编译时有警告C:DOCUMENTS AND SETTINGSADMINISTRATOR桌面字 310 点阵LED显示.C(46): warning C235: parameter 1: different types

为什么?求大侠指点

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

另外你这个for(;dt;dt--);没有起