单片机实现流水灯,从入门到进阶

看到这个标题,很多人会想:“流水灯?谁不会流水灯啊。单片机入门的第一节课不就是实现跑马灯嘛?” 别急,慢慢看嘛,就算是简单的跑马灯,也可以玩出花样的哟。
好吧,不卖关子了,先说说我今天讲的内容吧,首先:如何用P1口(只有八个引脚哟)实现八个流水灯,然后:如何用P1口实现十六个流水灯。怎么样,有没有一点小刺激。再然后,用32个引脚,P1,P2,P3,P4实现1024个流水灯呢?可能有人会说了,“不可能!!!”别急,再到最后,就是控制很多很多个!那我们就开始吧。

一、实验目的

1、熟悉P1口作输出口的原理与方法
2、掌握循环延时,并能计算延时时间
3、能熟练的使用keil编程和proteus仿真
4、实现多个流水灯的控制

二、实验内容

1、用keil编写程序,编译运行
2、用proteus进行仿真检验
3、用面包板进行搭线展示,用2个流水灯实现流水效果

三、实验原理

将单片机的P1口的0和1接上Led灯,采用共阴极的接法,当单片机的P1^0和P1^1引脚为低电平时,由于二极管的单项导通性,Led被点亮,即可实现循环流水效果。必要的知识还是需要滴,上图!

四、电路图

实物图:

proteus仿真结果:

五、流程图

六、源代码

#include <reg51.h>
sbit Led_0 = P1^0;
sbit Led_1 = P1^1;
sbit touch = P1^2; //HTTM触摸开关void delay()
{int i,j;for(i=0;i<200;i++)for(j=0;j<200;j++);
}
void main()
{touch = 0;while(1){                      //说明:此按键为HTTM触摸开关//按下为高电平,灯亮;不按下为低电平,灯灭if(touch == 1)    //有按键被按下{Led_0 = 1;Led_1 = 0;delay();Led_0 = 0; Led_1 = 1;delay();}else   //没有按键被按下{                              Led_0 = 1;Led_1 = 1;}}
}

看到这里,有人就要说了,我都看么那么久了,你这不就是一个流水灯吗?还故弄玄虚搞那么久,我手中的西瓜刀已经准备好了,你继续表演吧。
哈哈哈,行,马上就开始表演。

七、流水灯进阶

既然我们都写过流水灯,那我们一定对延时函数一定都不陌生,就随便给个延时等待嘛,但是有没有人想过,这个延时函数到底延时了多久!!!!!!“三分钟,我要这个延时函数的全部信息!!”我:可以用定时器测试的哟。“不,我没学过定时器,但是我现在就要!!!快给我一个简单的方法!”我:呃。。。行,办法就在下面。

  1. 用C语言设计,如何计算延时时间
    对于延时时间可以通过示波器进行准确的查看。在这里我准备了两段延时函数,分别是1ms,test(自定义)来进行测试,前面的1ms是经过精确计算无误的时间,后面的test则是自己需要计算的延时函数。
    1ms测试结果(准确时间)

    测试结果:1ms时间准确。

Test延时函数测试

Test延时函数测试结:delay = (909-605)ms = 304ms。
源代码如下:

#include <reg51.h>
sbit Out = P1^0;void Delay1ms(void)   //测试1ms 误差 0us
{unsigned char a,b,c;for(c=1;c>0;c--)for(b=142;b>0;b--)for(a=2;a>0;a--);
}
void Delay10ms(void)   //测试10ms 误差 0us
{unsigned char a,b,c;for(c=5;c>0;c--)for(b=4;b>0;b--)for(a=248;a>0;a--);
}
void Delay_Test(void) //测试结果304ms
{int i,j;for(i=0;i<250;i++)for(j=0;j<150;j++);
}
void main()
{while(1){Out = 1;Delay_Test();Out = 0;Delay_Test();}
}
  1. 当LED的数量远多于接口数量时(如50,100,1000个),该怎么实现流水灯?
    解答如下:实现方法较多,这里我采用的是3-8译码器,通过3-8译码器的级联可以实现led数目的增加,实现50,100个没有问题,如果要实现1000个则需要4-16译码器,并通过级联的方式实现。
    实现结果如下:
    源代码如下:
#include <reg51.h>
//用6个IO口点亮16个流水灯
//实现效果:可以用8个IO口点亮16个流水灯,
//分别为3 3显示 2片选,最多可控制16*4=64个
/* 如果采用4-16译码器,包括片选端,那么一个占8个位置,可以亮16*16=256一共有32/8=4那么4*256=1024个灯,满足一千个灯
*/
sbit crol_1 = P1^0;
sbit crol_2 = P1^1;
sbit crol_3 = P1^2;    //设置控制代码
sbit crol_4 = P1^3;
sbit crol_5 = P1^4;
sbit crol_6 = P1^5;    //第二个译码器
sbit select_1 = P1^6;
sbit select_2 = P1^7;//片选
static int count = 0;void delay_ms()   //设置延时函数
{int i,j;for(i=0;i<250;i++)for(j=0;j<250;j++);
}
void Crol_Flow_1()  //前八个
{select_1 = 1; //设置片选端select_2 = 0;switch (count){case 0:crol_3 = 0,crol_2 = 0,crol_1 = 0;break;case 1:crol_3 = 0,crol_2 = 0,crol_1 = 1;break;case 2:crol_3 = 0,crol_2 = 1,crol_1 = 0;break;case 3:crol_3 = 0,crol_2 = 1,crol_1 = 1;break;case 4:crol_3 = 1,crol_2 = 0,crol_1 = 0;break;case 5:crol_3 = 1,crol_2 = 0,crol_1 = 1;break;case 6:crol_3 = 1,crol_2 = 1,crol_1 = 0;break;case 7:crol_3 = 1,crol_2 = 1,crol_1 = 1;break;}
}
void Crol_Flow_2()  //后八个
{select_1 = 0; //片选端select_2 = 1; switch (count)  //设计亮的顺序{case 8:crol_6 = 0,crol_5 = 0,crol_4 = 0;break;case 9:crol_6 = 0,crol_5 = 0,crol_4 = 1;break;case 10:crol_6 = 0,crol_5 = 1,crol_4 = 0;break;case 11:crol_6 = 0,crol_5 = 1,crol_4 = 1;break;case 12:crol_6 = 1,crol_5 = 0,crol_4 = 0;break;case 13:crol_6 = 1,crol_5 = 0,crol_4 = 1;break;case 14:crol_6 = 1,crol_5 = 1,crol_4 = 0;break;case 15:crol_6 = 1,crol_5 = 1,crol_4 = 1;break;}
}
void main()
{     while(1){if(count == 16)count = 0; //若是等于16则清零else if(count < 8){Crol_Flow_1();delay_ms();count++;}else if (count < 16){Crol_Flow_2();delay_ms();count++;}}
}

八、说点什么

哈哈,其实大致的思路就是借用3-8译码器扩展引脚啦,是不是感觉豁然开朗呢。实现1024个流水灯也不难啦,用4-16的是不是就可以啦?好好思考一下。当然这只是我的思路,还有其他的方法哟(其实是我忘记了,好像是用到内部的寄存器内存啥的),欢迎大家在评论区讨论啦。
都看到最后了,大家还是放下手中的西瓜刀,放过孩子吧~~~

会水的芝麻
2019.12.6
湖北师范大学

用单片机实现流水灯(进阶版)相关推荐

  1. 51单片机:流水灯蜂鸣器控制

    //51单片机:流水灯&蜂鸣器控制 //bglei@nuaa.edu.cn 2022/8/28<流水灯&蜂鸣器控制> #include<reg52.h> #in ...

  2. pic单片机流水灯循环右移c语言,PIC单片机LED流水灯程序

    PIC 单片机 LED流水灯程序 ;************************************************************* include ;*********** ...

  3. 单片机c语言 流水灯 教案,单片机控制流水灯讲课教案.doc

    单片机控制流水灯 前言 随着人们生活环境的不断改善和美化,在许多场合可以看到彩色霓虹灯不断变化闪烁.LED灯由于其丰富的灯光色彩,低廉的造价以及控制简单等特点而得到了广泛的应用,用彩灯来装饰街道和城市 ...

  4. Proteus:单片机 LED流水灯模拟

    题目概述: 单片机LED流水灯. 编程: #include <reg51.h> #include <intrins.h> #define uint unsigned int # ...

  5. 实现单片机控制流水灯代码

    可以使用C语言编写单片机控制流水灯代码,步骤如下:1. 控制单片机的IO口,把IO口设置为输出模式:2. 写一个循环,依次控制IO口输出高低电平:3. 将IO口的高低电平与流水灯相连,实现控制流水灯的 ...

  6. 51单片机循环流水灯源码

    51单片机循环流水灯源码 #include <reg52.h> #include <intrins.h> void delay(unsigned char a) {unsign ...

  7. 简单51单片机c语言编程流水灯,51单片机如何实现流水灯?51单片机实现流水灯的三种方法详细分析...

    描述 首先,介绍下原理.下图为主控芯片和流水灯模块的原理图.流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯.相反,如果要LED灯熄灭,就要把P1口的电平变为高电平 ...

  8. 51单片机LED流水灯、走马灯的实现

    目录 1. 硬件设计 2. 软件设计 流水灯: 跑马灯: 1. 硬件设计 流水灯的原理: 图中主要包括51单片机芯片和流水灯模块,流水灯模块接在了单片机的P2口,500欧电阻是用来保护电路的.由原理图 ...

  9. 基于51单片机的流水灯设计

    三个按键:A按键启动.B按键控制不同流水速度(低中高).C按键 设计思路一(未用中断): 8个LED灯正极解电源,负极接单片机I/O口. 死循环:设置P2口为11111110,使用左移函数,循环七次. ...

  10. 流水灯c语言程序tm,51单片机LED流水灯课程设计任务书+论文

    郑州工程技术学院课程设计 设计题目:LED流水灯设计 学    院:机电与车辆工程学院 专    业:16电气自动化技术专业班 级普招二班 姓    名:王*&刘* 指导教师:李* 日    ...

最新文章

  1. c++数据结构队列栈尸体_一本正经的聊数据结构(3):栈和队列
  2. 深入JVM彻底剖析前面ygc越来越慢的case
  3. Linux lvs 的固定访问
  4. dataframe保存为txt_Word,PDF,PPT,TXT之间的相互转换方法
  5. jQuery UI 下载 拖动组件
  6. 计算机系统大作业:Hello's P2P
  7. 2011年5月18日早会资料
  8. 【游戏开发3D数学笔记】1.有话说在前面
  9. 同是4G标准,TD和FDD谁更快?
  10. 《最强大脑》之四色定理—— GIS 无处不在
  11. scrapy框架爬虫
  12. 什么是ACL访问控制列表?它们的匹配机制是什么?
  13. VUE-CLI/VUE-ROUTER
  14. 一起来围观软件测试工程师月薪20K的简历
  15. 读奇特的一生 序言总结
  16. c语言在数组输出字母,c语言字符数组与字符串的使用详解
  17. 千峰JAVA逆战班Day47
  18. viper监控文件变化出现两次事件
  19. CPU分析系列--perf 通过对热点函数抓取分析具体代码对cpu的消耗
  20. 你会用QQ吗?33个QQ小技巧你知道几个?

热门文章

  1. 5G 牌照发布!中国正式进入 5G 商用元年!
  2. 游戏外挂开发原理初探——植物大战僵尸内存挂为例
  3. mysql中怎么根据生日(brithday)获取年龄
  4. web开发工程师面试题,CSS盒子模型居中方法
  5. 单片机测试开发板用什么软件,怎么知道单片机开发板的好坏
  6. 那些通宵加班的年轻人
  7. CNtV电视直播解析PHP,电视直播
  8. 课程体系包括哪些要素_未来学校的课程体系
  9. 浅谈聊天机器人 ChatBot 涉及到的技术点 以及词性标注和关键字提取
  10. 《UnityAPI.Vector3三维向量》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+Vector3+Lerp+Cross+Dot+Slerp+立钻哥哥++OK++)