前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >单片机第一节课老师为什么讲的是流水灯---单片机显示1

单片机第一节课老师为什么讲的是流水灯---单片机显示1

作者头像
单片机技术宅
发布2020-03-17 10:04:39
7170
发布2020-03-17 10:04:39
举报
文章被收录于专栏:初学单片机
01

原理

为什么我们开始学单片机的第一节课老师就是教我们流水灯呢?流水灯其实就是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闪烁和流水

--------------------------------*/

代码语言:javascript
复制
#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);
 }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 单片机技术宅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档