一、点亮
工作原理:
如图,二极管阳极连接电阻,二极管阴极连接单片机引脚。D0对应P20,D1对应P21,,,,,,,都通过P2孔进行控制。
二极管:
电源正极连接到二极管阳极,负极连接到阴极,二极管正常工作。所以,原理图中,引脚为低电平,连接的是二极管的阴极,阳极通过与电阻连接,电阻连接的是高电平,所以二极管正常工作。电阻的作用为保护二极管。
程序编写
#include"reg52.h"
sbit LED=P2^0; /*sbit用于定义变量。LED为自定义变量。将P2.0(注意不要写成P2.0,应写为P^0)孔赋给变量LED*/
void main()
{
while(1)
{
LED=0;/*由二极管的工作原理可得,二极管接P2.0孔,所以该孔为低电平,为0*/
}
}
二、闪烁
工作原理
在点亮LED灯的基础之上。
原理上基本与点亮LED灯工作原理相同。
自定义一个延时函数。
主函数先点亮灯,在调用延时函数,在熄灭灯,然后在调用延时函数,将这些放入循环一直执行。完成
代码
#include "reg52.h"
typedef unsigned char u8; //重定义字符型变量
typedef unsigned int u16; //重定义整型变量
/*自定义延时函数*/
void dealy(u16 i)
{
while(i--);
}
sbit led=P2^0;
void main()
{
while(1)
{
led=0; //点亮,阴极接低电平
dealy(50000);
led=1; //熄灭,阴极接高电平
dealy(50000);
}
}
三、流水灯
工作原理
1.在LED点亮、LED闪烁实验的基础之上。
2.移位函数
crol(a,b):循环左移函数,a为左移的值,b为左移的位数。
cror(a,b):循环右移函数,a为右移的值,b为右移的位数。
移位函数包含在instrins.h库函数里面。
3.c语言中十六进制的表示
Ox代表的是十六进制的前缀,不用读。例如OXaaOxbb,只看aa,bb就行。
十六进制到二进制转换
十六进制表示:每一位有不同的数码0~9,A(10),B(11),C(12),D(13),E(14),F(15)
十六进制转二进制:将十六进制的每一位转化为二进制即可。例如8FA,=>1000 1111 1010
运作过程
先看原理图
LED原理图(阳极解高电平),阴极通过电阻接接引脚
引脚默认接高电平,所以,初始时灯为熄灭状态。
流水实现
利用十六进制位位移函数实现左移和右移
_crol_(0xfe,1):0xfe转化为二进制为1111 1110;1代表位数
f代表原理图中的4个高位引脚,e代表4个低位引脚。
1111 1110 =>p0=0(低电平,灯亮)
1111 1101 =>左移,p1=0,第二个灯亮
1111 1011 =>p2
…………
_cror_(oxfe,1):与左移原理相同(从0111 1111 开始向右移)
代码实现
#include #include typedef unsigned char u8; //重定义全局字符型变量 typedef unsigned int u16; //重定义全局整型变量 #define led P2//宏定义LED为p2端口 /*延时函数*/ void dealy(u16 i) { while(i--); } void main() { u16 i; //定义变量i P2=0xfe; //点亮第一个LED灯,即1111 1110. dealy(50000); //延时450ms while(1) { for(i=0;i<7;i++) //8个LED灯,利用for循环一直执行 { led=_crol_(led,1); // 1111~1110~0111 1111,左移 dealy(50000); } for(i=0;i<7;i++) //8个LED灯,利用for循环一直执行 { led=_cror_(led,1); //0111 1111~1111 1110 ,右移 dealy(50000); } } }