led调试全过程(硬件编程精粹玩转LED)
led调试全过程(硬件编程精粹玩转LED)/*将连接LED阴极的P1.0口定义为特殊功能寄存器的位变量,方便位操作。*/#include <reg51.h> 【程序】为使描述清晰,动机或启发式解释使用多行注释符(/* */),放在预写代码的上方,而普通解释使用单行注释符(//)。/*程序功能:LED闪烁。*//*实现方法:LED按设定的时间间隔点亮、熄灭。*/
【任务】LED的发光颜色可以表示各种警示状态,而灯的闪烁亦然。试编写使一盏LED闪烁的程序。
【硬件平台】继承前篇《硬件编程精粹·玩转LED(一)》的最小系统:
AT89C51最小系统
说明:1. C1、C2称为晶振X1的负载电容,它们与晶振X1一起构成单片机的外部谐振电路,这两个电容之所以取22pF,是根据12M晶振的生产厂家的数据手册而选择的;
- VCC默认 5V,允许误差为±0.5V,即4.5~5.5V;
- 系统上电瞬间,电容C3瞬态短路,VCC瞬时加到复位脚RST(上电高电平复位),经过2个机器周期(24个振荡周期)后单片机复位。使用12M晶振时,1个机器周期=12/12M=1us,所以复位时间至少为2us。假定R1=10k(最常用,所以最容易想到的阻值),那么R1C3≥2us,C3≥2/1000)=2nF,为了可靠复位(不打擦边球),我使用了较大的电容C3=10uF;
- 当P1.0口拉低时(相当于口寄存器写入0),lLED被点亮。假定LED工作电流为3mA,工作电压为2V,那么R2=(5-2)/3=1k。
【程序】为使描述清晰,动机或启发式解释使用多行注释符(/* */),放在预写代码的上方,而普通解释使用单行注释符(//)。
/*程序功能:LED闪烁。*/
/*实现方法:LED按设定的时间间隔点亮、熄灭。*/
#include <reg51.h>
/*将连接LED阴极的P1.0口定义为特殊功能寄存器的位变量,方便位操作。*/
sbit LED = P1^0;
/*打字偷懒定义两个简写宏定义*/
#define uint unsigned int //无符号整型
#define uchar unsigned char //无符号字符型
/*延时函数*/
void delay(uint x)
{
uchar i;
while(x--) //从x(正整数)的递减外循环
{
for(i=0;i<200;i ); //从0到200(不含200)的递增内循环
}
}
/*主程序*/
void main()
{
while(1) //上电后永不停止的大循环
{
LED = ~LED; //P1.0口电平取反
delay(500); //根据硬件平台确定延时,这里试用500
}
}
上面的代码在keil c51中编译链接后生成hex文件,烧写进单片机,系统上电便使LED闪烁。
代码截图如下: