0%

点亮发光二极管

点亮LED,LED闪烁

点亮LED

第一个内容是关于LED灯的,首先就是如何让他亮。那么我们先看一下这块实验版的LED模块的电路图:

在这里插入图片描述
(其实图上是有一点错误的,图中的二极管标号从上到下依次是D1 D2 D3….)

图中可以看出,当左端是低电位的时候,二极管导通,LED灯亮。在单片机中,0表示低电位,1表示高电位,所以我们只需要将端口参数置零,LED就会亮。
端口参数志玲,端口又是什么呢?我们还是看电路图。我们可以看到,这图里的8个二极管左侧有棕红色的标号P20 P21 P22……这些表示的是处理器的引脚,89C52一共有4组共32个引脚,我们编程控制的就是这些引脚。所以我们将端口置零就是将引脚参数设置为0。在程序中,我们一般这么写:

1
2
3
4
5
6
7
8
9
10
11
12
#include<reg52.h>     //51单片机的头文件

sbit led1=P2^0; //sbit是定义了一个位(一个字节八个位的那个位),和int,float这些差不多
sbit led2=P2^1; //这两句话的意思是,定义两个位,名字叫led1,led2,led1存的是引脚p20的值,led2是p21
void main()
{
while(1) //一个死循环,程序才会一直执行下去
{
led1=0; //p20引脚参数为0,输出低电平
led2=0;
}
}

写好后,和C语言类似,我们得先调试,按F7或者点这个
在这里插入图片描述
调试没有错误以后,我们要将程序拷录进单片机,就要用到 ,具体步骤如下:


上次忘了写一个步骤,就是生成.hex文件,这个在keil里面是默认不生成的,但是拷录时必须是.hex格式的文件。生成步骤如下:
生成hex文件第一步
生成hex文件第二步

生成hex文件第三步

拷录
拷录好后,我们再打开单片机,就是这个程序。

LED闪烁

到此,我们已经解决了灯亮的问题,如何让灯会闪呢?
我们只需要加一个循环,让端口参数从1到0周期变换,就像下面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<reg52.h>
typedef unsigned char uc;
typedef unsigned int ui;

sbit led=P2^0;

void delay(ui i){
while(i--);

}
void main(){
while(1){
led=0;
delay(10000);
led=1;
delay(10000);
}
}

跑马灯

只让一个灯闪那不够土,为了够土,我们要让他循环闪。那么最容易想到的就是依次给端口赋值,这样未免太麻烦,我们可以直接这么写

写法1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
void delay(uint i){ //延时函数
while(i--);
}
void main(){

uchar a;
a=0x01;
while(1){
P2=a;
delay(10000);
a=a<<1; //位运算,实现循环
if(a==0x00) //防止溢出
a=0x01;
}
}

0x01是一个十六进制数,表示的是0000 0001,也就是端口P2的值依次为00000001。<< 左移一位后变成了0000 0010。

写法2

我们也可以换一种写法,将端口值变为11111110就是0xfe然后循环位变换,这里引进一个函数,_crol_(char,int),效果看程序和结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<reg52.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
void delay(uint i){
while(i--);
}
void main(){

uchar a;
a=0xfe; //表示1111 1110
while(1){
P2=a;
delay(10000);
a=_crol_(a,1); //循环位移,函数的第二个参数表示移多少位,这里第一次执行后a变成了1111 1101
}
}