|
手把手教你使用PIC单片机点亮LED发光管(C语言版)——站长原创,如需引用请注明出处
发光二极管,也叫做LED,是种非常常用的指示器件,比如电源指示、工作指示等,即便你不怎么留心,恐怕还是在不少场合见到过的,比如各种充电器,它们用亮或者灭告诉你电源是否已经接通,用颜色的变化告诉你电池是否已经充满,再比如有不少设备,往往采用发光二极管的闪烁来表示系统正在正常工作。同时,因为它的控制比较简单有趣,所以我们的实验就选择从这里开始。
| 首先我们需要知道如何让一个发光二极管工作。发光二极管有很多类,如图1-1所示的是几种直径3mm的普通亮度发光二极管,电器原理图则如图1-2所示,当在它的A和K两个电极加上合适的电压的时候,它就会亮起来。说“合适的电压”,是因为不同的发光二极管工作电压并不相同,一般是在1.6V到2.8V之间,而工作电流则一般在2到30mA之间,但是实际工作的选择范围一般是4到10mA之间。 |
 |
 |
| |
图1-1、发光二极管实物图 |
图1-2、发光二极管原理图 |
这里之所以要说这些参数,实际是为了解释LED上串接电阻大小的选择。图1-4是跟增强型PIC实验板上跟LED控制相关部分的电路,我们可以看到LED上串接的电阻是470欧姆,如果此时LED上的电压是2.0V,那么此时通过LED的电流则为(5V-2V)/470Ω=6.38mA,如果需要提高亮度,一般会电流控制在10mA左右,则此时电阻应该选择(5V-2V)/10mA=300Ω,所以可以就近选择330Ω。 电路已经确定,然后就是连接到单片机的I/O口上,见图1-4,我们可以看到LED的A极通过限流电阻连接到PIC单片机的I/O口,K极连接到了GND地线,因此要使LED发光,也就是使电流流过LED,只需要把I/O口置成高电平即可,所以最终我们对LED的控制变成了对一个I/O口的控制,比如要点亮标号为“D10”的LED,就是把RC0口设置成高电平而已,这就是实现方法。
 |
 |
| 图1-3、增强型PIC实验板实物照片 |
图1-4、单片机控制LED显示的原理图 |
先把“ICD2 PIC仿真烧写器”与“增强型PIC实验板相连”,插上所需要的连接线缆并与PC机相连,前面部分我们已经学会了搭建PIC学习和开发的硬件与软件环境。现在,我们只要在这些环境基础上编写程序代码实施验证即可,注:在以后的系列教程中,我们仍将以这些软硬件环境为基础进行讲述。
我们创建完工程后,编写第一个点亮LED发光管的程序代码如下:
#include <pic.h> main() { TRISC=0X00; /*TRISC寄存器被赋值,PORTC每一位都为输出*/ while(1) /*循环执行点亮发光二极管的语句*/ { PORTC=0X02; /*向PORTC送数据,点亮第二个LED发光管*/ } }
这是一个最简单的PIC点LED的C程序代码,也希望能给初学者朋友们一个感性的认识,我已把能省略的语句尽量都省去了,能把每句话都看懂了,PIC的C程序最小框架你也就明白了。 第一行 #include <pic.h> 用于加载标准库函数,如51单片机中的 reg51.h 库文件一样。 main()是C语言中的主函数,一个C程序代码中,也只有一个main()主函数,程序就是从这里开始执行的。 语句“TRISC=0X00;”用来设置RC口的输入、输出状态。 while(1) 是死循环语句,即周而复始地执行{ }内的语句体,如我们现在的程序中的作用即是不停地执行 PORTC=0X02; 这条语句。 语句“ PORTC=0X02;”的功能则是给RC口赋值,即第二个引脚RC1为高电平,用“1”来表示。
说明:PIC系列单片机各类数据存储器都是以寄存器方式工作和寻址的。专用寄存器包括了定时寄存器TMRO、选择寄存器OPTION(又称为项选寄存器)、程序计数器PCL、状态寄存器STATUS、间接寻址寄存器INDF和FSR、端口I/O寄存器(如PORTA、PORTB…)和相对应的端口I/O控制寄存器(又称为端口I/O数据方向寄存器,如TRIAS、TRISB…)、保持寄存器PCLATH和中断控制寄存器INTCON等。我们现在暂时只用到了TRISC和PORTC口寄存器。
该程序实验效果如下:

现在我们知道了,可以通过改变PORTC口的数据来得到不同的花样灯效果,因此,我们只要按自己的意想来改变程序代码即可,下面是一些改制实例:
 点亮第八个LED发光管的程序
 花样流水灯运行瞬间截图之一
 花样流水灯运行瞬间截图之二
 花样流水灯运行瞬间截图之三
以下是一段让实验板上第一个LED发光管闪亮的C程序,大家可以实际编译运行一下看看最终效果: #include <pic.h> void delay() { unsigned int k; for(k=0;k<6000;k++); } void main() { TRISC=0X00; /*TRISC寄存器被赋值,PORTC每一位都为输出*/ while(1) /*循环执行点亮发光二极管的语句*/ { PORTC=0X01; /*向PORTC送数据,点亮LED发光管*/ delay(); PORTC=0X00; delay(); } }
|