1.1 51单片机led灯的点亮
根据进制转换表,将二进制转换成16进制
其中程序中的P2口,0x是表示后面是16进制的
1.2 led闪烁
1.3 led流水灯
#include <REGX52.H>
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char data i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms=xms-1;
}
}
void main()
{
while(1)
{
P2=0xFE;
Delay1ms(100);
P2=0xFD;
Delay1ms(100);
P2=0xFB;
Delay1ms(100);
P2=0xF7;
Delay1ms(100);
P2=0xEF;
Delay1ms(100);
P2=0xDF;
Delay1ms(100);
P2=0xBF;
Delay1ms(100);
P2=0x7F;
Delay1ms(100);
}
}
1.4led灯的原理
LED由P型半导体和N型半导体组成,这两者之间形成一个PN结,当电流通过PN结时,P型半导体中的空穴和N型半导体中的电子在PN结附近相遇并复合,这个过程中释放能量,激发半导体材料中的原子发出光子,从而产生光线。光的颜色(可见光的不同部分)由LED使用的半导体材料决定,不同的材料产生不同颜色的光。例如,红、绿、蓝三种基色的LED灯可以组合产生多种颜色,甚至全彩显示。
通过两个半导体材料的相连,之后接上电源,从而使得N中的电子流向P中的空穴(P是阳极、N是阴极)。
特点就是具有单项导电性,电流从正极流向负极,电子方向与电流方向相反。
如图,电流方向由左向右。
2.1 独立按键控制led灯亮灭
程序如下
#include <REGX52.H>
void main()
{
while(1)//如果放进循环外面,则需要按住复位键,之后再同时按住独立按键,之后松开复位
//键,这样的程序只能运行一次。
{
if(P3_1==0&&P3_3==0)//&&表示逻辑与,||表示逻辑或;独立按键具体编码看原理图
{
P2_0=0;//这里是只控制一个led,其他的不涉及;这里要是写P2=0xfe是八个灯都在使用
}
else
{
P2_0=1;
}
}
}
这个是头文件里面显示的led灯的
这个是头文件里面,独立按键的名称
2.2 创造一个延时的子函数
如图
生成一个1ms的延时函数,之后复制到代码里去
将延时函数放在while的循环里面,Delay后面的括号改写为unsinged int xms ,从而给定一个延时时间的参数
从而unsinged int可以最大延时65535
之后将while后的括号填入xms,只要是xms不是0都会为真,则while都会一直循环。
由于生成的是1ms的延时,所以后面对xms进行减一(xms--),从而达到参数值是多少,延时就是多少。
2.3 消除按键抖动的情况下,独立按键对led灯的控制
独立按键的抖动
因此为了消除抖动,要么是增加外设,要么是在软件上进行解决,在软件上进行解决可以通过延时的方法
程序如下
#include <REGX52.H>
void Delay(unsigned int xms) //@12.000MHz
{
while(xms)
{
unsigned char data i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
if(P3_1==0)
{
Delay(500);//对闭合阶段进行延时
while(P3_1==0)//达到稳定阶段使之循环
{
}
Delay(500);//松开阶段进行延时
P2_0=~P2_0;//进行取反
}
}
}
2.4 运算符号以及基础语句
2.5独立按键控制led以二进制方式亮灯
#include <REGX52.H>
void Delay(unsigned int xms);
void main()
{
int LED;
while(1)
{
Delay(20);
if(P3_0==0)
{
while(P3_0==0);
Delay(20);
P2=~(LED++);
}
}
}
void Delay(unsigned int xms)
{
while(xms--)
{
unsigned char data i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
子函数如果放在下面,需要将函数的名称放在上面,后面写上“;”。如果变量没有规定值,则会输出高电平1,使用int或者char都可以。当LED=1的时候,则LED++就是八个位置全部是00000000则此时灯会全亮,之后依次按按键,只有灭的灯会按二进制规律(该亮的不亮,不该亮的亮了),如果对LED++进行取反,就会得到想要的结果,因此使p2=~(LED++)。
2.6 一个独立按键控制依次进行点亮
程序如下
#include <REGX52.H>
void Delay(unsigned int xms) //@12.000MHz
{
while(xms)
{
unsigned char data i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
unsigned char sum=0;
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
if(sum>7)
{
sum=0;
}
P2=~(0x01<<sum);
sum++;
}
}
}
sum的值在0~7之间,如果出了范围会与结果不同,因此需要加一个选择语句。
2.7 两个独立按键对led灯的来回控制
两个独立按键分别为,第一个P3_1,第二个P3_2,分别对两个独立按键进行按键震动消除后,把它们放进一个循环里,只有根据低电平亮灯的特点进行编写程序,这个程序的本质就是设置好“sum”值(就是向左移位的移位数目)。程序如下
#include <REGX52.H>
void Delay(unsigned int xms) //@12.000MHz
{
while(xms)
{
unsigned char data i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
unsigned char sum=0;
P2=~0x01<<sum;
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
if(sum>=7)
{
sum=0;
}
else
{
sum++;
}
P2=~(0x01<<sum);
}
if(P3_0==0)
{
Delay(20);
while(P3_0==0);
Delay(20);
if(sum==0)
{
sum=7;
}
else
{
sum--;
}
P2=~(0x01<<sum);
}
}
}