早上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,睡觉去。