一、LED的相关知识
         1.LED,即发光二极管,是一种半导体固体发光器件。
         2.LED的工作原理:LED的工作是有方向性的,只有当正级接到LED阳极,负极接到LED的阴极的时候才能工作,如果反接LED是不能正常工作的。

         3.LED的原理图解析:开发板上面LED的原理图如右图,LED的阳极串联一个电阻,然后连接到电源VCC,而LED的阴极连接到单片机的P2口,如果你想点亮一盏LED就对把单片机相对应的IO赋为低电平。

二、点亮第一盏LED

#include<reg52.h>
 
sbit led=P2^0;
 
void main()
{
	while(1)
	{
		led=0;
	}
}

三、LED闪烁
 

1.#typedef使用
    typedef unsigned char u8;
    typedef unsigned int u16;(后面要加分号)

    重新定义一些常用的关键词,可以增强程序的可移植性,因为在不同的编译软件上面,C语言的数据类型的关键词的位宽是不一样的。

2.while循环函数
while(i<10)
{
       i=i+1;
}
while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体语句。

3.延时函数
void delay(u16 i)//大约延时10us
{
       while(i--);     
}

以下程序端口可以更换,同时延时不同,闪烁的频率不同,先置低电平点亮,再置高电平熄灭。

//LED闪烁实验
#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;
 
sbit led=P2^0;		 //将单片机的P2.0端口定义为led
 
// 延时函数,i=1时,大约延时10us
 
void delay(u16 i)
{
	while(i--);	
}
 
void main()
{
	while(1)
	{
		led=0;
		delay(50000); //大约延时450ms
		led=1;
		delay(50000); //大约延时450ms	
	}		
}

四、LED流水灯
        1.C语言常用预处理命令
            #define使用
            #define A P0(注意后面不用加分号)

  2.循环左移右移函数
        _crol_(a,b);循环左移函数,a是左移的值,b是左移的位数。包含在instrins.h库函数里面。
        _cror_(a,b);循环右移函数,a是右移的值,b是右移的位数。包含在instrins.h库函数里面。

PS:大括号里注释的内容,与下面两个移位函数所呈现的结果有一点点不一样,,注释的内容是从P2^0开始依次亮到P2^7,然后直接又从P2^0开始亮,而使用的移位函数是从P2^0开始依次亮到P2^7,再从P2^7开始依次亮到P2^0。我经过改动注释掉的内容,出现以下几种现象,以此对其移位有了更进一步的了解。首先是1.P2=~(0X01<<i),0000 0001-->(左移1位)0000 0010——>(取反)1111 1101(就实现了移动,后面类似) 2.我又将其取反符号删去,就会七个灯亮,然后依次熄灭,但是前一个又变亮。

// LED流水灯实验	
 
#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h>		//因为要用到左右移函数,所以加入这个头文件
 
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;
 
#define led P2	   //将P2口定义为led 后面就可以使用led代替P2口
 
 
void delay(u16 i)
{
	while(i--);	
}
 
void main()
{
	u8 i;
	led=0xfe;
	delay(50000); //大约延时450ms	
	while(1)
	{	
/*		for(i=0;i<8;i++)
		{
			P2=~(0x01<<i);	 //将1左移i位,然后将结果取反赋值到P2口
			delay(50000); //大约延时450ms
		}
*/		
		for(i=0;i<7;i++)	 //将led左移一位
		{
			led=_crol_(led,1);
			delay(50000); //大约延时450ms	
		}
		for(i=0;i<7;i++)	//将led右移一位
		{
			led=_cror_(led,1);
			delay(50000); //大约延时450ms	
		}	
	}		
}