3
10
2011
0

延迟函数

早上2点了。还是不想睡,我喜欢夜晚的宁静。

重新开始学单片机。这次以C开始,做了个单片机中的“hello world”--点亮LED灯。

一比之下,C比汇编好看,好写,好懂多了。

程序如下:

//作者:xmww
//时间:2011.03.11
//备注:无
#include <REG51.h>

sbit LED = P1^7;	//P1.7接一个发光二极管

void Delay(unsigned int a){
	unsigned int i;
	while ( a--){
		for(i = 0;i<1000;i++);
	}
}

void main(void)
{
	while(1){
		LED = 0;	//点亮
		Delay(1000);	//亮1s;
		LED = 1;	//熄灭
		Delay(1000);	//暗1s;
	}
}

 

效果如下:

可是,这时候问题出来了。LED灯闪烁的时间明显超过1秒。

按照网上资料说,我用的是12M的晶振。一个周期为12/12*10^6 = 1 us,而for( i = 0;i < 1000;i++)则是执行1000次空指令。那么就是1ms,然后程序中执行Delay(1000)。应该是1s才对。可是结果不是这样。好生奇怪。网上查不到。我估计应该是C语言的理解上有问题。这个问题要深究一下。

另外这次在电路上加了电阻。电源是5V,LED的电压时3V。不加电阻的话,容易把单片机烧坏。没加电阻前我用万用表测了一下电流,立刻到头。吓的我赶忙接上。我查了一下技术手册,上面说每个I/O口的电流可达20ma,但是真个单片机不能超过55毫安。以后要接很多的LED灯的话,估计还需要驱动电路。

OK,睡觉去。

Category: 单片机 | Tags: 单片机 LED | Read Count: 1819

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com