早上2点了。还是不想睡,我喜欢夜晚的宁静。
重新开始学单片机。这次以C开始,做了个单片机中的“hello world”--点亮LED灯。
一比之下,C比汇编好看,好写,好懂多了。
程序如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <span style= "font-size:20px;" ><span style= "font-family:comic sans ms,cursive;" > //作者: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; } }</span></span> |
效果如下:
可是,这时候问题出来了。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,睡觉去。