当前位置: 代码迷 >> 单片机 >> 单片机延时解决方案
  详细解决方案

单片机延时解决方案

热度:236   发布时间:2016-04-28 16:32:38.0
单片机延时
在单片机中,经常用while(i--);
这条语句来进行延时,我不懂为什么这样能进行延时呢?

像这样的语句我写在VC++ 6.0或者TC 编译器下时候,为什么在输出结果中就看不到延时的效果呢。


例如:

#include<stdio.h>

int main()
{
int i = 500000;
printf("a\n");
while(i--);
printf("b\n");
}
   
  这样写的话,a,b几乎是同时输出的,却不是先输出a,然后隔一段时间再输出b的,但是在张孝祥的51《十天学会单片机》视频教程中,如下:

#include<reg52.h>
sbit p1_1=P1^0;
unsigned int a;
void main()
{
while(1)
{
a=51000;
p1_1=0;
while(a--);
a=51000;
while(a--);

p1_1=1;
a=51000;
while(a--);
a=51000;
while(a--);
}
}
  这是控制发光二级管的程序,发光二级光在亮和灭之间会有一个延时,即形成了闪烁的效果,会有一个时间的延迟。
  刚接触单片机,恳请各位不吝赐教,谢谢!
 

------解决方案--------------------
其实就是循环等一会啊,就向你跑步前进过程中,某一段时间原地踏步走一样啊。计算机上延时没效果很简单,计算机上的主频太高了,延时50万次的时间你根本感觉不出来,再说计算机上的printf是带缓冲的输出,不会立即显示(比如在1ms内如果缓冲中凑齐了16个字节就立即显示,如果没凑齐就等到1ms超时后再显示,不过这里的1ms和16字节是我编的,过程类似这样)。而在单片机种如51中,如果晶振是12MHZ的话,CPU指令周期才是1MHZ(计算机上是上G的,并且计算机的CPU结构是并行流水线的),所以延时的时间你就能感觉出来了。
------解决方案--------------------
延时时间长一点就能感觉到了
------解决方案--------------------
pc上面你改成
long i = 500000000000;
就能看到延时了
------解决方案--------------------
因为a延时后面再执行b,b执行完了就没有延时就执行a了,你再b后面再加一个while的延时就看出来了,
至于怎么延时啊,i一开始等与0,0减1就等于255,一直减,减到等于1了就退出while,相当于
for(i=255,i<1,i--),差不多吧,可能差几个us的。
------解决方案--------------------
PC的速度和单片机不是一个级别的啊! 呵呵~
------解决方案--------------------
PC机主频太高,现在都是2Ghz的,单片机才MHz的,i的大小就是CPU执行一条指令的时间*这个数
------解决方案--------------------
探讨

PC机主频太高,现在都是2Ghz的,单片机才MHz的,i的大小就是CPU执行一条指令的时间*这个数

------解决方案--------------------
探讨
引用:

其实就是循环等一会啊,就向你跑步前进过程中,某一段时间原地踏步走一样啊。计算机上延时没效果很简单,计算机上的主频太高了,延时50万次的时间你根本感觉不出来,再说计算机上的printf是带缓冲的输出,不会立即显示(比如在1ms内如果缓冲中凑齐了16个字节就立即显示,如果没凑齐就等到1ms超时后再显示,不过这里的1ms和16字节是我编的,过程类似这样)。……

------解决方案--------------------
单片机的运行速度要能达到PC的话,PC机就可以大降价了!
你先搞清楚指令运行时间的概念吧,还有就是WHILE(I--)代表的是什么意思。
------解决方案--------------------
#include<stdio.h>

int main()
{
 int i = 500000;<------------⑵
 printf("a\n");<------------⑶然后到这里
 while(i--);
 printf("b\n");<------------⑴执行到这里
}
按我1.2.3,在⑴ 和 ⑶ 之间等于没有间隔。明白了吗?
 
  相关解决方案