原理
为什么我们开始学单片机的第一节课老师就是教我们流水灯呢?流水灯其实就是LED的一个显示方式。LED显示是在单片机学习中最为常见,最为基础的显示方式,运用也是最广的。今天我们就从仿真到我们的STC15W创客开发板详细的讲解一下LED显示的运用。
LED,其实就是发光二极管,二极管是有极性的元件,电流的只能从阳极流向阴极,当有最够大的电流(10mA左右)流过LED,那LED就会发光,所以我们必须在LED的阳极和阴极之间加正向电压,这样我们LED才会发光。在单片机运用中,我们就可以用单片机的IO口去控制加在LED阳极和阴极之间的电压,从而实现LED的亮与灭。
02
仿真调试
我们首先采用仿真的方式来讲解和演示,具体电路图参照上图。左边为最常用的C51单片机,因为是仿真,晶振电路和复位电路可以省略。右边的LED0--LED7就是今天的主角LED;因为仿真用的单片机是传统51单片机,IO口是普通的准双向IO,所以接了R1--R8。电阻R1--R8为上拉电阻,为什么要接上拉电阻呢,在此不做详细解释,可以简单的理解为增加驱动能力。
简单的分析下原理,当单片机的P0口的某个IO口输出低电平的时候,接在此IO上的LED就没短路,因为IO输出低电平,也就是0V电压,可以理解为接在了地上。而LED的分路中电流还要流过LED才能到电源地,电流都是大懒汉,哪里好走就走哪里。自然LED分路就不会有电流,自然就不亮了。当某个IO输出高电平时,也就是VCC的电压,此时电流自然就会走LED分路了,有电流流过LED,自然LED就发光。
通过以上分析,我们编程的时候只需要控制单片机的P0口输出相应的高低电平,就能实现点亮和关闭LED的功能,按一定顺序点亮,自然就成了流水灯了。
03
STC15W 创客单片机开发板调试
上图就是我们STC15W创客开发板载的LED电路部分,左边为电路的接口引出,右边为1K的排阻,做限流用。在程序中我们用排线接单片机的P0口。因为我们的STC15我单片机是增强型的C51单片机,每个IO口都有四中工作模式,当设置为推挽输出时能初始20mA的电流,这样足以点亮LED了,所以我就没有外接上拉电阻,其实芯片内部已经上拉了。具体的上拉下拉电阻后续我们会专门写篇文章推送给大家。
04
程序代码
本程序采用leil 4编写,有需要的可以直接复制来测试。以下为全部代码:
/*----------------------------
//作者:单片机技术宅
本程序功能:实现LED闪烁和流水灯
采用8P排线连接单片机和LED
P0--8位LED接口J6
下载程序后,单片机运行程序可看到4种花样的LED闪烁和流水
--------------------------------*/
#include<stc15wxx.h> //STC15w的头文件
#include<intrins.h> //调用_nop_()需要用到
//函数声明
void Delay_xms(unsigned int z);
// -----------------------
//主函数
//作者:单片机技术宅
//
//------------------------
main(){
unsigned char cnt_i;
unsigned char dat;
P0M1=0x00; //P0口推挽输出
P0M0=0xff;
while(1){
for(cnt_i=1;cnt_i<255;cnt_i++){ //做二进制自加
P0=cnt_i;
Delay_xms(50);
}
for(cnt_i=0;cnt_i<6;cnt_i++){ //隔个交替显示
P0=0xaa;
Delay_xms(500);
P0=0x55;
Delay_xms(500);
}
dat=0x01;
for(cnt_i=0;cnt_i<8;cnt_i++){ //左流水
P0=dat;
Delay_xms(120);
dat<<=1;
}
dat=0x80;
for(cnt_i=0;cnt_i<8;cnt_i++){ //右流水
P0=dat;
Delay_xms(200);
dat>>=1;
}
}
}
//------------------------
//功能:X ms延时函数
//作者:单片机技术宅
//
//------------------------
void Delay_xms(unsigned int z){
unsigned char i, j;
unsigned int k;
for(k=0;k<z;k++){ //for语句内部语句是1ms延时
_nop_();
_nop_();
i = 24;
j = 84;
do{while (--j);}
while (--i);
}
}