单片机延时
在单片机中,经常用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执行一条指令的时间*这个数
[解决办法]