Proteus_keil仿真单片机二

LED灯的使用及流水灯的实现

LED灯的介绍

发光二极管(LED):在电路及仪器中作为指示灯,或者组成文字或数字显示。

单向导通性,导致发光二极管要又PN断点之分,所以就会产生共阴极和共阳极区别(在后面讨论)

控制电流从P端口流向N端口。

PK14

许多的广告牌,是由很多个LED灯不断的闪烁,导致一片区域的灯亮起来,然后形成文字的移动等,led灯的使用有很多地方,LED灯几乎是电器必带的一个,总会显示电器的开关或运行。但LED又是最简单的元器件,许多的单片机或开发板,总会以先控制LED来尝试第一个历程。这里我们先不长篇大论的讨论真实的单片机是如何的,但我觉得有必要先讲解不同,为暂时没资金但未来会买单片机的同学有所提示。

单片机和仿真软件的不同

1、真实的单片机是已经将电路固定好了,难以改变,我们只能通过外部拓展来来进行我们想要拓展的元器件。但仿真软件的电路是不固定的,可以根据所学的电路分析的知识,来进行电器的连接。这样子我们可以灵活多变的设计电路,这里设计到自己设计PCB板,建议仿真入手,提高理解。

2.单片机的部分引脚拓展了许多的功能,一个引脚便控制多个器件,这样子大大减少了IO口的使用。仿真软件可以灵活的改变引脚。

3.单片机的0端,许多会拓展时钟等,但仿真单片机里面已经自带好了时钟。(这里使用时钟什么的都一样使用。)

未来还会有区别我们在讨论。

创建流水灯项目

在keil中创建项目,并创建xx.c文件,并设置好输出hex文件的初始设置。

流水灯的设计

Proteus设计电路

这里使用AT89C51芯片、led(灯)、res(电阻)。

prj

选好元器件后,进行摆放。分为共阴极和共阳极(如下)

共阳极

右上角的三角符号是这个软件的高电位,即电源。所有的流水灯的阳极都是连接在LED灯的P端口,这样子就是共阳极。

然后在看左边,电阻是300欧姆,为什么加电阻呢?

原因很简单,单片机端口是无法承受过大的电流和电压的,电阻是防止过大,导致烧坏芯片;但倘若电阻过大,led灯也可能会不亮。

然后在向左边,这个东西很简单,就是一个端口,两个同名的端口提高命名的方法连接(连接方式在附录),这样子电气图便可以按区块分布。这里我使用了0端口的0~7来控制。当LED灯两端呈现一正一负便可以发光。

pk15

共阴极

所有的流水灯的阴极都是连接在LED灯的N端口,这样子就是共阴极,与上面的恰恰相反(这里忘了加电阻,不过仿真电路问题不大,我们等等看看会不会出现问题,买的单片机开发板基本上不用考虑电路设计。)

总的电路如下所示:(记得保存)

pk20

Keil

流水灯程序实现

1
2
3
4
5
6
7
8
9
10
11
//最基本的程序框架

#include "reg51.h" //这个是89c51的头文件,一般我们都选择是双引号引起来,c语言中,标准库才是使用#include<..> 尖括号,这里一般使用""较好
sbit LED00=P0^0; //位操作sbit
void main()
{
while(1) //这里使用while的原因是因为单片机应当是一直循环执行的。
{
//* code *//
}
}

实例

点亮一个LED灯
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "reg51.h"
sbit led00=P0^0; //初始P00口 ^号是选择大端口的一个引脚
void delay(unsigned int n) //延迟函数
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<120;j++);
}
void main()
{
while(1)
{
led00=0; //共阳-亮
delay(5);
led00=1; //共阳-灭
delay(5);
}
}

pk21pk23

在Proteus左下角有个播放键

pk24

pk25

若你也是这样子的错误,不要慌。这是因为自己的用户名是英文,使用导致出错。这里建议添加一个英文用户。(若不会的话可以在评论区交流,很简单的)

prj

pk26

流水灯特殊实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "reg51.h"

void delay(unsigned int n) //延迟函数
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<120;j++);
}

void led()
{
int i;
for(i=0;i<8;i++)
{
P0=~(0X01<<i); //P0=~(0X01<<i) 0000 0001 位运算
P1= 0X01<<i; // 0000 0010
delay(70); // 0000 0100
} // ...
}

void main()
{
while(1)
{
led();
}
}

P0=~(0X01<<i); 共阳的

P1= 0X01<<i; 共阴的

流水灯一般实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "reg51.h"
unsigned char leddata[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//通过控制一个端口的所有引脚 以0000 0000 为16进制数来进行控制。

void delay(unsigned int n) //延迟函数
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<120;j++);
}

void led()
{
int i;
for(i=0;i<8;i++)
{
P1=leddata[i];
delay(70);
P0=leddata[i];
delay(70);
}
}

void main()
{
while(1)
{
led();
}
}

pk27

附录

一、端口的连接

首先选好要连接的端口,连接一条线出来,出来一点点的地方双击左键,使得生成节点(在这里属于端口)如下图

pk17

但这个端口不完整,仅仅是无对应端的端口,然后我们放大线条出现红色虚线,右键选择“放置网络标号”,填写一个唯一的标号,然后再在对应芯片的对应端也做如上方法。

pk18

pk19