51单片机LED流水灯拖尾效果
51单片机流水灯程序
51单片机流水灯程序51单片机是一种广泛使用的微控制器,具有丰富的IO端口和定时器资源。
流水灯程序是51单片机入门的基础示例之一,通过多个LED灯按照一定顺序逐个亮起或熄灭,形成流水灯的效果。
下面详细介绍51单片机流水灯程序的编写。
一、硬件连接要实现流水灯效果,需要将多个LED灯连接到51单片机的IO端口上。
一般使用P1端口作为输出端口控制LED灯的亮灭,P2端口作为输出口控制LED灯亮起的顺序。
具体连接方式如下:•将LED灯的阳极通过限流电阻连接到VCC。
•将每个LED灯的阴极通过限流电阻连接到P1端口。
•将P2端口的每个引脚依次连接到每个LED灯的阴极。
二、程序实现#include <reg52.h> //包含51单片机头文件#define LED P1 //定义LED为P1端口#define ORDER P2 //定义顺序控制为P2端口void delay(unsigned int t); //延时函数声明void main(){unsigned char i;while(1) //循环控制流水灯效果{for(i=0; i<8; i++) //控制8个LED灯{LED = 0x01<<i; //将第i个LED灯置亮delay(10000); //延时一段时间,使LED灯亮起后延时熄灭LED = 0x01>>(i+1); //将第i个LED灯置灭}}}void delay(unsigned int t) //延时函数定义{unsigned int i, j;for(i=0; i<t; i++){for(j=0; j<1275; j++);}}该程序首先定义了LED和ORDER两个变量,分别对应P1和P2端口的输出口。
在主函数中,使用一个while循环控制流水灯效果。
在循环内部,使用一个for循环控制8个LED灯的状态。
在每次循环中,先将第i个LED灯置亮,延时一段时间后将其置灭,然后进入下一个循环。
基于51单片机的流水灯及点阵设计报告
目录1. 引言 (2)1.1 背景 (2)1.2 设计目的 (2)1.3 参考资料 (2)2. 方案设计与比较论证2.1 设计任务 (2)2.2 设计要求 (2)2.3 方案的选择 (3)3. 总体设计 (3)3.1 开发与运行环境 (3)3.2 系统软件工作流程图 (3)3.3 硬件结构 (4)4. 系统功能测试与整体指标 (6)4.1 系统各模块功能的性能测试 (6)4.1.1 LED小灯模块 (6)4.1.2 点阵模块 (9)4.1.3 按键模块 (10)4.2 系统功能测试 (12)4.3 系统误差与问题分析 (12)5. 总结 (13)附录1;详细程序 (14)1. 引言1.1 背景随着电子技术的飞速发展,电子行业和社会上的各行各业息息相关,从家用电器到航空航天,无一不与电子产业的发展密切相关。
当我们看到大街小巷都是变幻多彩的霓虹灯时,心中是否会感到很新奇?当我们看到绚丽多彩的广告牌时,心中是否会觉得很神奇?这些神奇的流水灯只是电子产业的冰山一角,更多的知识需要我们在以后的道路上慢慢探索。
在单片机上实现流水灯很简单,只需要几条指令就可以完成,大部分学生都可以完成任务。
于是我们就思考一个新的问题,能不能实现一个亮度渐变的、按规律移动的超酷流水灯?这就是本次设计的背景及意义。
1.2 设计目的本次基于51单片机的流水灯设计主要是为了让我们增进对80C51单片机电路的感性认识,加深对理论方面的理解。
了解软硬件的有关知识,并掌握软硬件设计过程、方法及实现,为以后设计和实现应用系统打下良好基础。
虽然本次设计较为简单,但是涵盖的内容较为丰富,运用了单片机的动态扫描、定时器、中断,用for循环来实现彗星灯的效果,PWM波控制LED的亮灭程度,独立按键的应用等等,另外,通过简单课题的设计练习,使我们了解必须提交的各项工程文件,达到巩固、充实和综合运用所学知识解决实际问题的目的。
1.3 参考资料【1】单片机原理及应用·马永杰主编·清华大学出版社 2011.8【2】51单片机C语言教程·郭天祥主编·电子工业出版社 2009.12【3】模拟电子技术基础·康华光主编·高等教育出版社 2006.012. 方案设计与比较论证2.1 设计任务(1)基于51单片机实现一个亮度渐变的、按规律移动的超酷流水灯;(2)基于51单片机实现在点阵上动态显示“心”型和依次显示“西北师大”;(3)通过独立按键实现流水灯和点阵显示的切换。
通过51单片机控制24个发光二极管形成流水灯效果的亮灭状态
成绩实验名称:单片机系统简单扩展实验
一、实验目的
1、了解单片机系统的扩展方法
2、熟悉8255A在单片机系统扩中的使用方法。
3、熟悉仿真软件Proteus以及编程软件Keil的使用。
二、实验仪器
三、实验内容
四、实验原理
实验报告
五、实验步骤
步骤:
1、根据给定的实验要求,分析实验的目的以及实验要求。
2、通过计算机仿真软件Proteus,根据实验目的设计电路,并且绘制电路原理图。
3、根据自己设计的电路,编写控制程序。
4、调试所编写的控制程序,直至程序没有语法及语意错误,可以通过编译。
5、将所编写的无错误的程序下载至仿真软件,并进行调试,根据仿真结果修改程序。
6、重复上一步骤,知道仿真效果达到实验要求,即可完成。
六、实验程序
#include <reg51.h>
#include<absacc.h>。
51单片机驱动带拖尾效果的扫描灯LED
51单片机驱动带拖尾效果的扫描灯LED实现办法以下是我写得一段代码,可以驱动一个单片机带8个LED灯,做类似《霹雳游侠》电视剧中车头扫描灯的效果,而且是带拖尾的哦。
代码也许有不合理的地方,但是是可以实现上述功能的。
我也不是专业的,只是业余搞搞,有兴趣的朋友可以完善一下。
里边有些变量没用到,是因为我使用一块买的现成的学习板做的,上边有一些其他外围器件需要关闭。
#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit smglk=P1^2;sbit smgbitlk=P1^1;sbit ledlk=P1^0;sbit led1=P2^0;sbit led2=P2^1;sbit led3=P2^2;sbit led4=P2^3;sbit led5=P2^4;sbit led6=P2^5;sbit led7=P2^6;sbit led8=P2^7;code uchar LedLevel_1[14]={0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x09,0x03}; code uchar LedLevel_2[14]={0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x09,0x1b,0x09}; code uchar LedLevel_3[14]={0x09,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x09,0x03,0x01,0x1b}; code uchar LedLevel_4[14]={0x1b,0x09,0x03,0x01,0x00,0x00,0x00,0x00,0x1b,0x09,0x03,0x01,0x00,0x00}; code uchar LedLevel_5[14]={0x00,0x1b,0x09,0x03,0x01,0x00,0x00,0x1b,0x09,0x03,0x01,0x00,0x00,0x00}; code uchar LedLevel_6[14]={0x00,0x00,0x1b,0x09,0x03,0x01,0x1b,0x09,0x03,0x01,0x00,0x00,0x00,0x00}; code uchar LedLevel_7[14]={0x00,0x00,0x00,0x1b,0x09,0x1b,0x09,0x03,0x01,0x00,0x00,0x00,0x00,0x00}; code uchar LedLevel_8[14]={0x00,0x00,0x00,0x00,0x1b,0x09,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00}; uint i,j,k;void delay(uchar ms){for(k=0;k<ms*2;k++);}void main(){i=0;j=0;smglk=0;smgbitlk=0;ledlk=1;while(1){if(LedLevel_1[j]!=0)led1=0;delay(LedLevel_1[j]);led1=1;delay(27-LedLevel_1[j]);if(LedLevel_2[j]!=0)led2=0;delay(LedLevel_2[j]);led2=1;delay(27-LedLevel_2[j]);if(LedLevel_3[j]!=0)led3=0;delay(LedLevel_3[j]);led3=1;delay(27-LedLevel_3[j]);if(LedLevel_4[j]!=0)led4=0;delay(LedLevel_4[j]);led4=1;delay(27-LedLevel_4[j]);if(LedLevel_5[j]!=0)led5=0;delay(LedLevel_5[j]);led5=1;delay(27-LedLevel_5[j]);if(LedLevel_6[j]!=0)led6=0;delay(LedLevel_6[j]);led6=1;delay(27-LedLevel_6[j]);if(LedLevel_7[j]!=0)led7=0;delay(LedLevel_7[j]);led7=1;delay(27-LedLevel_7[j]);if(LedLevel_8[j]!=0)led8=0;delay(LedLevel_8[j]);led8=1;delay(27-LedLevel_8[j]);i++;if(i>9999)i=0;if((i%10)==0)j++;if(j>=14)j=0;}}。
51单片机实验报告(共五则)
51单片机实验报告(共五则)第一篇:51单片机实验报告51单片机实验报告实验一点亮流水灯实验现象 Led灯交替亮,间隔大约10ms。
实验代码#include 〈reg51、h> void Delay10ms(unsigned int c);voidmain(){)1(elihwﻩ{ ﻩP0= 0x00;Delay10ms(50);;ffx0 =0Pﻩﻩ;)05(sm01yaleDﻩ } } void Delay10ms(unsigned int c){unsigned char a,b;for(;c>0;c-—){)——b;0〉b;83=b(rofﻩ{ ﻩﻩfor(a=130;a〉0;a--);}ﻩﻩ}} 实验原理W W hi i le(1)表示一直循环。
循环体内首先将P0 得所有位都置于零,然后延时约5 5 0*10=500ms,接着 0 P0 位全置于 1 1,于就是 D LED 全亮了。
接着循环,直至关掉电源..延迟函数就是通过多个for r 循环实现得。
实验 2 流水灯(不运用库函数)实验现象起初 led 只有最右面得那一个不亮,半秒之后从右数第二个led也不亮了,直到最后一个也熄灭,然后 led 除最后一个都亮,接着上述过程 #includemain(){unsigned char LED;LED = 0xfe;while(1){ ﻩ;DEL = 0PﻩDelay10ms(50);00x0 == 0P(fiﻩ {;1〈〈 DEL = DELﻩ)ﻩ;efx0 = DELﻩ} ﻩ}ﻩ} void Delay10ms(unsigned int c){unsigned char a,b;for(;c>0;c-—){)—-b;0〉b;83=b(rofﻩ{ ﻩﻩﻩ;)--a;0>a;031=a(rofﻩ} ﻩ} ﻩ} 实验原理这里运用了C语言中得位运算符, , 位运算符左移, , 初始值得二进制为1111 1 110, 之后左移一次变成1111 1 100 0,当变成00000 0000 时通过 f if 语句重置 1 1 11 1 11110、延迟函数在第一个报告已经说出了,不再多说..实验 3 流水灯(库函数版)实验现象最开始还就是最右边得一个不亮,然后不亮得灯转移到最右边得第二个,此时第一个恢复亮度,这样依次循环.实验代码#include 〈reg51、h> #include 〈intrins、h〉void Delay10ms(unsigned int c); void main(void){unsigned char LED;;EFx0 = DELﻩ)1(elihwﻩ{ ﻩP0 = LED;;)05(sm01yaleDﻩﻩ;)1,DEL(_lorc_ = DELﻩ} ﻩ} void Delay10ms(unsigned in t c){unsigned chara, b;for(;c〉0;c——){ ﻩfor(b=38;b〉0;b—-){ ﻩﻩ;)-—a;0〉a;031=a(rofﻩ} ﻩ}}实验原理利用头文件中得函数,_cro l_(,), 可以比位操作符更方便得进行 2 2 进制得移位操作, , 比位操作符优越得就是,该函数空位补全时都就是用那个移位移除得数据, , 由此比前一个例子不需要f if 语句重置操作..数码管实验实验现象单个数码管按顺序显示0-9与 A-F。
C51单片机实现呼吸灯和花样流水灯程序
C51单⽚机实现呼吸灯和花样流⽔灯程序1.⽤C51单⽚机实现花样流⽔灯,代码如下:#include <reg52.h>#define LED_A P1 //led灯所⽤的接⼝,是哪个⼝就写P⼏void delayms(){unsigned char x = 0; unsigned char i;unsigned char y = 0;while(y < 0.001) //定义led灯的切换的延时时间,越⼩越快。
{ //(y < 0.001);(x<100);(i<100)都可以修改x = 0;while(x<100){i = 0;while(i<100){i++;}x++;}y++;}}#define LED_NUM 8 //定义led灯的数量,可快速实现不同⽤途的修改;void main(){unsigned char k;unsigned char j;unsigned char LED_ALL[] = {0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F}; //led灯亮灭的⼗六进制数组;unsigned char LED_ALL_2[] = {0XFC,0XF3,0XCF,0X3F}; while(1) { for(k=0;k<3;k++) //第⼀个for实现奇偶灯交叉闪烁三次,想闪烁⼏次就修改(K<3)中的数值; { LED_A = 0xAA; delayms(); LED_A = 0x55; delayms(); } for(k=3;k>0;k--) //实现⼀个流⽔灯左右三次(从左到右再从右到左算⼀次); { for(j=0;j<LED_NUM;j++) { LED_A = LED_ALL[j]; delayms(); } for(j=6;j>0;j--) { LED_A = LED_ALL[j]; delayms(); } } for(k=0;k<3;k++) //实现前四个灯亮后四个灯灭,交叉闪烁3次,修改次数同上; { LED_A = 0xf0; delayms(); LED_A = 0xf; delayms(); } for(k=3;k>0;k--) //实现两个灯依次流⽔3次; { for(j=0;j<4;j++) { LED_A = LED_ALL_2[j]; delayms(); } for(j=2;j>0;j--) { LED_A = LED_ALL_2[j]; delayms(); } } }}2.实现第⼀个灯呼吸,由暗变亮,再由亮变暗,程序如下;#include <reg52.h>sbit LED1 = P3^0;void delay(unsigned int a) //定义⼀个延时函数{ while(--a);}void main(){ unsigned int t,circle=800; //定义变量,circle=800为led灯呼吸的间隔长短,数值越⼩,间隔越短。
第一课51单片机实现流水灯
第一课 51单片机实现流水灯
发光二级管的基础知识简介
发光二极管就是在具有导通电流的情
况下可以发光的二极管,发光二极管 的导通电压一般为1.7V,可以驱动它发 光的电流一般为10~30mA,所以在具体 的电路中我们的发光二级管都串联一 个限流电阻,我们的风云51实验板也 不例外,我们看一下他在具体电路中 的连接原理图,
风云51实验班中led电路原理图
Led电路中器件参数的计算
在电路中要使得发光二极管极管发光 所需要的电流计算下他的限流电阻, 10~30mA=(VCC-1.7V)/RL;那么RL=(VCC1.7)/10~30mA,当VCC=5V时,RL=(5V1.7V)/10~30mA=110Ω~330Ω,
Led电路中器件参数的计算
那么我们的限流电阻只要在这个范围内都可
以使其发光,但是我们在实际电路设计中遵 循宁小勿大的原则,一般让通过发光二极管 的电流小于10mA,可以防止它过流烧毁, 并可增加其寿命。我们的电路图中的限流电 阻为560Ω,实际经验值为500~1K都可以。 (这里给大家插一句,作为一个硬件工程师, 我们必须将理论与实践相结合,以理论为指 导,以实践为标准)。
基于51单片机的花样流水灯设计
摘要摘要计算机技术的飞速发展和提高,把我们带入了崭新的时代,现在,计算机的应用已经深入到千家万户。
单片微型计算机是制作在一块集成电路芯片上的计算机,简称单片机。
单片机在现在社会有着广泛的应用,小到人们的日常电子用品,大到航天飞机、宇宙飞船,上面都有单片机的广泛应用。
单片机具有体积小、功能强大、低功耗、应用广泛等特点。
以AT公司的芯片AT89C51 单片机来实现流水灯的设计。
本系统由单片机控制,I/O口接LED的负极,而LED的正极则直接与5V电源相连。
通过I/O口输出的低电平点亮LED灯。
因此可以通过控制单片机的I/O口的电平高低以达到控制LED,从而实现不同花样的流水灯的目的。
关键词:LED,单片机,高低电平变化ABSTRACTThe rapid development of computer technology and improving, bring us to the new era, now, the application of computer has been deep into the thousands. Single chip microcomputer is made on an integrated circuit chip computer, hereinafter referred to as single chip microcomputer. SCM has been widely used in the present society, small to People's Daily electronic products, big to aerospace aircraft, spacecraft, above has the wide application of single-chip microcomputer. SCM has small volume, powerful function, low power consumption, wide application, etc. AT the company's chip AT89C51 single-chip microcomputer to realize the water lamp design. This system controlled by single chip microcomputer, I/O ports connect the LED the cathode, and LED the anode is directly connected to 5V power supply. Through the I/O port output low level light leds. So you can single chip microcomputer control through the I/O ports to control LED, the level of high and low so as to realize the purpose of the different pattern of flowing water light.Key words:LED , MCU ,High and Low output leve目录第1章引言 (1)1.1 研究背景及意义 (1)1.2 国内外研究现状以及本系统的重点问题 (1)1.3 本文章节安排 (2)第2章系统设计方案论证 (3)2.1 控制器模块方案论证 (3)2.2 键盘模块方案 (4)2.3 电源模块方案 (4)第3章系统硬件设计方案 (5)3.1 系统设计框图 (5)3.2 硬件电路设计 (5)3.2.1 电源电路 (5)3.2.2 单片机89C52最小系统 (6)3.2.3 按键电路 (13)3.3.4 LED灯电路 (13)第4章程序设计及软件仿真 (15)4.1 软件设计框图 (15)4.2 软件开发平台选择 (15)4.3 软件系统功能模块 (16)4.3.1 初始化模块 (16)4.3.2 延时函数 (17)4.3.3 定时器控制模块 (17)4.3.4 键盘扫描模式 (17)4.3.5 LED灯输出控制模块 (18)4.4 程序调试仿真 (19)4.4.1 仿真平台介绍 (19)4.4.2 仿真测试 (19)第5章硬件调试 (21)5.1 硬件设计 (21)5.2 硬件调试 (21)5.2.1 下载功能调试 (21)5.2.2 LED电路测试 (21)5.2.3 模式选择功能调试 (22)5.2.4 速度加减功能调试 (22)5.2.5 复位电路调试 (22)5.2.6 稳定性测试 (22)总结 (23)致谢 (25)参考文献 (26)附录 (27)附录一:原理图 (27)附录二:硬件实物 (28)附录三:程序代码 (29)第1章引言第1章引言1.1 研究背景及意义现如今,随着集成化芯片的飞速发展,分立元件或数字逻辑电路正逐步被集成电路所取代,而单片机作为一种集成电路,其价格低廉,且可靠性强、控制简单但控制方法多样。
51单片机led水滴效果PWM波(渐变带拖尾效果)
51单片机led水滴效果(渐变带拖尾效果)实现和讲解简介学习嵌入式第一个例子通常都是控制一个LED亮灭,然后是花样繁多的流水灯,但不管灯的花样如何变化,单个LED的亮度没有变化,只有亮、灭两个状态,本章我们实现如何控制LED的亮度。
1 什么是PWM脉冲宽度调制(Pulse Width Modulation,简称PWM),是利用微处理器的数字输出来对模拟电路进行控制的一种技术。
在本章的应用中可以认为PWM就是一种方波。
比如图1:是周期为10ms,占空比为60%的PWM。
占空比:高电平在一个周期之内所占的时间比率。
2 硬件设计在例说51单片机的第三章,我们讲过如何控制开发板上LED的亮灭。
首先译码器输出端LEDS6为低,T10导通,给8个LED供电,然后通过缓冲器8个输出端BD0~BD7的控制LED的亮灭(低亮高灭)。
如果BD口输出高低不断变化,则LED会闪烁;如果这种高低电平变化非常快,由于人的视觉暂留现象,LED就会出现不同的亮度。
3 软件设计3.1 PWM能否控制亮度下面我们就用实践验证PWM是否能够控制LED的亮度,测试代码如下:程序清单L1:验证PWM能否控制LED的亮度1 #include <reg52.h>2 #include "my_type.h"3 #include "hw_config.h"456 void main(void)7 {8 u8 i = 0;910 //使能独立LED的供电,即LEDS6输出低电平11 LEDEN = 0;12 ADDR0 = 0;13 ADDR1 = 1;14 ADDR2 = 1;15 ADDR3 = 1;1617 //第一个LED亮18 P0 = 0xFE;1920 while(1)21 {22 for(i=0; i<250; i++)23 {24 if(i<10)25 {26 P0 &= 0xFD; //第二个灯亮27 }28 else29 {30 P0 |= 0x02; //第二个灯灭31 }32 }33 }34 }L1(22-32):这段代码实现P0.1输出占空比为96%的方波,而P0.0恒为低。
基于单片机的LED流水彩灯设计
第1章概述近几年来,彩灯对于美化、亮化城市有着不可轻视的重要工作。
因此作为城市装饰的彩灯需求量越来越大,对与彩灯的技术和花样也越来越高。
但传统的彩灯控制电路一般是由数字电路组成,这种彩灯控制器电路结构复杂、成本较高、功率损耗大,此外从功能效果上看,彩灯模式少而且样式单调,缺乏用户可操作性,影响亮灯效果。
因此有必要对现有的彩灯控制器进行改进。
然而单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。
LED彩灯具有成本低、发光纯度高、发光热量小、耗电量低、超长寿命的特点。
所以利用单片机作LED彩灯控制,不仅是使控制花样、路数大大增加,成本也很低,而且对环境能源没有污染,有着很大的发展前景。
本方案是一种基于AT-89C51单片机的彩灯控制方案,实现对LED彩灯的控制。
主要以AT-89C51单片机作为主控核心与发光二极管、晶振、复位、电源等组成电路,利用软件编辑实现彩灯流水灯的效果。
第2章方案设计2.1设计任务(1)共有红、绿、蓝3色彩灯各8个,要求按一定顺序和时间关系运行:红色发光二极管由弱到强—>绿色发光二极管由弱到强—>蓝色发光二极管由弱到强。
(2)利用三基色原理,控制每次点亮红色发光二极管,绿色发光二极管,蓝色发光二极管的数目,实现黄色,紫色,青色。
(3)控制不同颜色发光二极管的数目,实现花样彩灯。
(4)编写程序代码。
(5)程序分析与调试。
2.2工程方案按照设计任务要求,红,绿,蓝光由弱到强,每个颜色用8个发光二极管,在程序控制下,先亮一个,再亮两个,再亮三个,慢慢的直到最后全亮,就能看到由弱到强的现象。
如果同一颜色使用更多的发光二极管,显示效果会更柔和。
要实现黄色,紫色,青色光,只能根据三基色原理进行合成。
所谓三基色是指红,绿,蓝三色,人眼对红,绿,蓝最为敏感,大多数可以通过红,绿,蓝3种颜色按照不同的比例合成产生。
同时,绝大多数单色光也可以分解成红绿蓝三种光。
单片机 C语言 拖尾流水灯 含源码
单片机拖尾流水灯BY-零下21度de水效果:同时亮5个LED,中间那个最亮,旁边两个渐暗。
原理:利用占空比调节LED亮度。
思路:占空比有两种调节方法,一种是固定脉宽,调节周期,一种是固定周期,调节占空比,该例程用得是前者。
观看效果:/u79/v_NzMyMDg1ODg.html该程序提供给大家参考,抛砖引玉,望大家做出更漂亮的效果。
C源码:#include <stc12c5a60s2.h>#define uchar unsigned char#define uint unsigned int#define LED P1 /*硬件为P1口输出,大家相应改一下*/uchar i=0;uchar Position=0x01; /**/void Delay(uchar n){uchar i,j,k;for(i=n;i>0;i--)for(j=100;j>0;j--)for(k=100;k>0;k--);}void T0_INT(void)interrupt 1{uchar dis_tmp;dis_tmp=Position;TH0=65432/256;/*定时器T0的中断时间就是固定脉宽,大家仔细看一下就会明白了*/ TL0=65432%256;if(i<100)i++;else i=0;LED=~dis_tmp;/*我的硬件设计是低电平点亮LED,就是灌电流~*/if(i%10==0) /*调整周期,旁边第一盏灯的周期为脉宽的10倍*/{dis_tmp|=dis_tmp<<1|dis_tmp>>1;LED=~dis_tmp;}if(i==0)/*旁边第二盏灯的周期为脉宽的100倍*/{dis_tmp|=dis_tmp<<1|dis_tmp>>1|dis_tmp<<2|dis_tmp>>2;LED=~dis_tmp;}}void main(void){uchar k,g;ET0=1;TMOD=0X01;EA=1;TH0=55532/256;TL0=55532%256;TR0=1;LED0=0;while(1){for(g=20;g>0;g--){for(k=7;k>0;k--){Position<<=1;Delay(g);}for(k=7;k>0;k--){Position>>=1;Delay(g);}}for(g=0;g<20;g++){for(k=7;k>0;k--){Position<<=1;Delay(g);}for(k=7;k>0;k--){Position>>=1;Delay(g);}}}}。
51八只LED灯做流水灯实验
51八只LED灯做流水灯实验第一节:单片机在上电初始后,其各端口输出为高电平。
如果我们现在想让接在P1.0口的LED1亮,那么我们只要把P1.0口的电平变为低电平就可以了。
想让LED1灭,LED0亮,只需将P1.0升高,P1.1变低,LED 1就熄灭LED2随后既点亮!依始类推如下所示8只LED变会一亮一暗的做流水灯了。
本实验在“SP-5 1实验板”学习套件上的相关图纸:P1.0低、P1.0高、P1.1低、P1.1高、P1.2低、P1.2高、P1.3低、P1.3高、P1.4低、P1.4高、P1.5低、P1.5高、P1.6低、P1.6高、P1.7低、P1.7高、返回到开始、程序结束。
我们不能说P1.1你变低,它就变低了。
因为单片机听不懂我们的汉语的,只能接受二进制的“1、0......”代码。
我们又怎样来用二进制语议论使单片机按我们的意思去工作呢?为了让单片机工作,只能将程序写为二进制代码交给其执行;早期单片机开发人员就是使用人工编写的二进制代码交给单片机去工作的。
今天,我们不必用烦人的二进制去编写程序,完全可以将我们容易理解的“程序语言”通过“翻译”软件“翻译”成单片机所需的二进制代码,然后交给单片机去执行。
这里的“程序语言”目前主要有汇编和C两种;在这里我们所说的“翻译”软件,同行们都叫它为“编译器”,将“程序语言”通过编译器产生单片机的二进制代码的过程叫编译。
前面说到,要想使LED1变亮,只需将对应的单片机引脚电平变为低电平就可以了。
现在让我们将上面提到的8只LED流水灯实验写为汇编语言程序。
“汉语”语言汇编语言开始:star:P1.0低clr p1.0P1.0高setb p1.0P1.1低clr p1.1P1.1高setb p1.1P1.2低clr p1.2P1.2高setb p1.2这里用到了四条汇编指令:clr、 setb、 ljmp 、end;clr:是将其后面指定的位清为0;setb:是将其后面指定的位置成1;ljmp:是无条件跳转指令,意思是:跳转到指定的标号处继续运行。
超炫 20模式带拖尾LED流水灯
P0_0 = 1;
P0_1 = 1;
for(i = 0; i < 50; i++);
}
}
if(P0_7==1)
{
unsigned int a;
P0_4 = 1;
P0_5 = 1;
for(i = 0; i < 50; i++);
}
}
P0=0xfb;
if(P0_3==1)
{
unsigned int a;
for(a=0;a<350;a++) //调节点亮时间
for(i = 0; i < 50; i++);
}
}
P0=0xfd;
if(P0_2==1)
{
unsigned int a;
for(a=0;a<350;a++) //调节点亮时间
{
unsigned char i;
}
}
P0=0xdf;
if(P0_6==1)
{
unsigned int a;
for(a=0;a<350;a++) //调节点亮时间
{
unsigned char i;
P0_6 = 0;
for(i = 0; i < 15; i++); //调节亮度高低
ys1ms(300);
rtbyd(); //跳变7种模式
P0=0xff;
ys1ms(300);
51单片机LED流水灯拖尾效果
高级流水灯--水滴效果(渐变带拖尾效果)实现和讲解简介学习嵌入式第一个例子通常都是控制一个LED亮灭,然后是花样繁多的流水灯,但不管灯的花样如何变化,单个LED的亮度没有变化,只有亮、灭两个状态,本章我们实现如何控制LED的亮度。
1 什么是PWM脉冲宽度调制(Pulse Width Modulation,简称PWM),是利用微处理器的数字输出来对模拟电路进行控制的一种技术。
在本章的应用中可以认为PWM就是一种方波。
比如图1:/bbs_upload782111/files_48/ourdev_701979FVHE6E.png(原文件名:120611_0.png) 图1 方波是周期为10ms,占空比为60%的PWM。
占空比:高电平在一个周期之内所占的时间比率。
2 硬件设计在例说51单片机的第三章,我们讲过如何控制开发板上LED的亮灭。
首先译码器输出端LEDS6为低,T10导通,给8个LED供电,然后通过缓冲器8个输出端BD0~BD7的控制LED的亮灭(低亮高灭)。
/bbs_upload782111/files_48/ourdev_701980ZDAXQ9.png(原文件名:120611_1.png) 图2 LED硬件连接如果BD口输出高低不断变化,则LED会闪烁;如果这种高低电平变化非常快,由于人的视觉暂留现象,LED就会出现不同的亮度。
3 软件设计3.1 PWM能否控制亮度下面我们就用实践验证PWM是否能够控制LED的亮度,测试代码如下:程序清单L1:验证PWM能否控制LED的亮度1 #include <reg52.h>2 #include "my_type.h"3 #include "hw_config.h"456 void main(void)7 {8 u8 i = 0;910 //使能独立LED的供电,即LEDS6输出低电平11 LEDEN = 0;12 ADDR0 = 0;13 ADDR1 = 1;14 ADDR2 = 1;15 ADDR3 = 1;17 //第一个LED亮18 P0 = 0xFE;1920 while(1)21 {22 for(i=0; i<250; i++)23 {24 if(i<10)25 {26 P0 &= 0xFD; //第二个灯亮27 }28 else29 {30 P0 |= 0x02; //第二个灯灭31 }32 }33 }34 }L1(22-32):这段代码实现P0.1输出占空比为96%的方波,而P0.0恒为低。
51单片机如何实现流水灯?51单片机实现流水灯的三种方法详细分析
51单片机如何实现流水灯?51单片机实现流水灯的三种方法详细分析首先,介绍下原理。
下图为主控芯片和流水灯模块的原理图。
流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯。
相反,如果要LED灯熄灭,就要把P1口的电平变为高电平即可。
要实现流水灯功能,我们只要将LED1~LED8依次点亮、熄灭,依始类推,8只LED变会一亮一暗的做流水灯了。
实现8个LED流水灯程序用中文表示为:P1.0低、延时、P1.0高、P1.1低、延时、P1.1高、P1.2低、延时、P1.2高、P1.3低、延时、P1.3高、P1.4低、延时、P1.4高、P1.5低、延时、P1.5高、P1.6低、延时、P1.6高、P1.7低、延时、P1.7高、返回到开始、程序结束。
听起来是不是很简单啊!那么下面我们来看下实现流水灯功能的三种常用方法!第一种,总线方法实现流水灯。
这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,加上延时函数,即可控制每个LED灯的亮灭。
C程序如下:#include#define uchar unsigned char#define uint unsigned intcode unsigned char tmpled[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义八只LED灯,依次点亮八只LED灯//N毫秒的延时函数delay_ms(uint ms) { uint i,j; for(i=ms;i>0;i--) for(j=114;j>0;j--); return 0; }void main(void){unchar i;while (1){for(i=0;i#define uchar unsigned char#define uint unsigned int//N毫秒的延时函数delay_ms(uint ms) { uint i,j; for(i=ms;i>0;i--) for(j=114;j>0;j--); return 0; }。
(完整word版)实验一51单片机流水灯实验实验报告(word文档良心出品)
“流水灯”实验报告一、实验目的1.了解单片机I/O口的工作原理。
2.掌握51单片机的汇编指令。
3.熟悉汇编程序开发,调试以及仿真环境。
二、实验内容通过汇编指令对单片机I/O进行编程(本实验使用P0口),以控制八个发光二极管以一定顺序亮灭。
(即流水灯效果)三、实验原理通过更改P0口8位的高低电平,分别控制8个发光二极管的亮灭。
具体的亮灭情况如下表:要实现“流水灯”效果,也就是需要将P0口的输出值发生以下变化:FE→FD→FB→F7→EF→DF→BF→7F→BF→DF→EF→F7→FB→FD→FE→......可以使用一个循环,不断对数据进行移位运算实现。
这里的移位指令采用RL和RR,即不带进位的位移运算指令。
如果使用带进位的位移运算指令(RLC和RRC),则需要定期把CY置0,否则会出现同时亮起两个发光二极管的情况。
四、实验过程1.在仿真系统中绘制好单片机的电路图2.编写汇编程序,程序如下:ORG 0000H Delay: MOV R0, #0FFHSJMP Start Delay1: MOV R1, #0FFH Start: MOV A, #0FEH Delay2: NOPMOV P0, A DJNZ R1, Delay2CLR P2.7 DJNZ R0, Delay1CLR P3.7 RETMove: MOV R2, #7H ENDMOV R3, #7HRMove: RL AMOV P0, ACALL DelayDJNZ R2, RMoveLMove: RR AMOV P0, ACALL DelayDJNZ R3, LMoveSJMP Move五、实验结果为了便于实验结果的描述,下面分别把P0.0, P0.1…, P0.7对应的发光二极管编号为1, 2, …, 8号二极管。
在仿真系统中,先从1号二极管下面是在仿真系统中的实验结果:实验的结果:二极管的发光状态从1→2→3→4→5→6→7→8→7→…→1→2;如此往复循环。
基于51单片机的流水灯控制
按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。
AT89C51单片机是美国ATMEL公司生产的低电压、高性能CMOS 8位单片机,具有丰富的内部资源:4kB闪存、128BRAM、32根I/O口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.25~5.50V的电压工作范围和0~24MHz工作频率,使用AT89C51单片机时无须外扩存储器。
因此,本流水灯实际上就是一个带有八个发光二极管的单片机最小应用系统,即为由发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。
其具体硬件组成如图1所示。
图1 流水灯硬件原理图从原理图中可以看出,如果要让接在P1.0口的LED1亮起来,那么只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平;同理,接在P1.1~P1.7口的其他7个LED的点亮和熄灭的方法同LED1。
因此,要实现流水灯功能,我们只要将发光二极管LED1~LED8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。
在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。
3.软件编程单片机的应用系统由硬件和软件组成,上述硬件原理图搭建完成上电之后,我们还不能看到流水灯循环点亮的现象,我们还需要告诉单片机怎么来进行工作,即编写程序控制单片机管脚电平的高低变化,来实现发光二极管的一亮一灭。
软件编程是单片机应用系统中的一个重要的组成部分,是单片机学习的重点和难点。
下面我们以最简单的流水灯控制功能即实现8个LED灯的循环点亮,来介绍实现流水灯控制的几种软件编程方法。
3.1位控法这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,从而来控制相应LED灯的亮灭。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
高级流水灯--水滴效果(渐变带拖尾效果)实现和讲解简介学习嵌入式第一个例子通常都是控制一个LED亮灭,然后是花样繁多的流水灯,但不管灯的花样如何变化,单个LED的亮度没有变化,只有亮、灭两个状态,本章我们实现如何控制LED的亮度。
1 什么是PWM脉冲宽度调制(Pulse Width Modulation,简称PWM),是利用微处理器的数字输出来对模拟电路进行控制的一种技术。
在本章的应用中可以认为PWM就是一种方波。
比如图1:/bbs_upload782111/files_48/ourdev_701979FVHE6E.png(原文件名:120611_0.png) 图1 方波是周期为10ms,占空比为60%的PWM。
占空比:高电平在一个周期之内所占的时间比率。
2 硬件设计在例说51单片机的第三章,我们讲过如何控制开发板上LED的亮灭。
首先译码器输出端LEDS6为低,T10导通,给8个LED供电,然后通过缓冲器8个输出端BD0~BD7的控制LED的亮灭(低亮高灭)。
/bbs_upload782111/files_48/ourdev_701980ZDAXQ9.png(原文件名:120611_1.png) 图2 LED硬件连接如果BD口输出高低不断变化,则LED会闪烁;如果这种高低电平变化非常快,由于人的视觉暂留现象,LED就会出现不同的亮度。
3 软件设计3.1 PWM能否控制亮度下面我们就用实践验证PWM是否能够控制LED的亮度,测试代码如下:程序清单L1:验证PWM能否控制LED的亮度1 #include <reg52.h>2 #include "my_type.h"3 #include "hw_config.h"456 void main(void)7 {8 u8 i = 0;910 //使能独立LED的供电,即LEDS6输出低电平11 LEDEN = 0;12 ADDR0 = 0;13 ADDR1 = 1;14 ADDR2 = 1;15 ADDR3 = 1;17 //第一个LED亮18 P0 = 0xFE;1920 while(1)21 {22 for(i=0; i<250; i++)23 {24 if(i<10)25 {26 P0 &= 0xFD; //第二个灯亮27 }28 else29 {30 P0 |= 0x02; //第二个灯灭31 }32 }33 }34 }L1(22-32):这段代码实现P0.1输出占空比为96%的方波,而P0.0恒为低。
P0.1输出如图3所示(受纸张限制,图中高低电平长度比例和实际有偏差)。
/bbs_upload782111/files_48/ourdev_701981I421F1.png(原文件名:120611_2.png) 图3下载验证:从开发板上可以看到运行效果,D1比D2亮。
(这里说明一点:当P0输出低电平时,LED亮,所以,PWM的占空比越小越亮)。
3.2 产生8个亮度级别3.1节的例子证实了我们的设想,PWM可控制LED的亮度,下面我们设计几组占空比不同的PWM,看看对LED亮度的控制效果。
代码如下:程序清单L2:不同占空比对LED亮度的控制1 #include <reg52.h>2 #include "hw_config.h"3 #include "my_type.h"456 //亮度级别表7 code u8 LightLevel={0,1,2,4,8,16,32,64};89 void main(void)10 {11 u8 i = 0;12 u8 j = 0;13 u8 k = 0;14 u8 temp = 0;16 //使能独立LED的供电,即LEDS6输出低电平17 LEDEN = 0;18 ADDR0 = 0;19 ADDR1 = 1;20 ADDR2 = 1;21 ADDR3 = 1;2223 //开始全灭24 P0 = 0xFF;2526 while(1)27 {28 //P0端口输出8组占空比不同的PWM29 for(i=0; i<64; i++)30 {31 for(j=0; j<8; j++)32 {33 if(LightLevel <= i)34 {35 temp |= (1<<j);36 }37 else38 {39 temp &= ~(1<<j);40 }41 }4243 P0 = temp;44 }45 }46 }L2(29-45).此段程序是让P0口输出8组占空比不同的PWM,如图4:/bbs_upload782111/files_48/ourdev_701982T6U1EV.png(原文件名:120611_3.png) 图4下载验证:从开发板上可以看到运行效果,从D1到D8的亮度逐渐增大。
3.3 水滴下落效果根据PWM可控制LED亮度的原理,我们用8个LED实现水滴下落的效果。
第一步,水滴逐渐变大,用D1从暗变亮模拟;第二步,水滴下落,带有拖尾效果,LED逐个亮,移动速度加快,且越靠前的LED亮度越大。
程序清单L3 水滴流水灯1 #include <reg52.h>2 #include "hw_config.h"3 #include "my_type.h"45 //亮度级别表6 code u8 LightLevel={0,1,2,4,8,16,32,64};78 //水滴时间,实现加速效果9 code u8 LightTime={16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};101112 void main(void)13 {14 u8 i,j,k;15 u8 temp,count;16 u8 state;1718 //使能独立LED的供电,即LEDS6输出低电平19 LEDEN = 0;20 ADDR0 = 0;21 ADDR1 = 1;22 ADDR2 = 1;23 ADDR3 = 1;2425 while(1)26 {27 //开始全灭28 P0 = 0xFF;2930 //---------------水滴逐渐变大(第一个LED亮度逐渐变大)---------31 for(i=0; i<64; i++)32 {33 //一个亮度级别发送64个脉冲34 for(j=0; j<64; j++)35 {36 P0 = 0xFE;37 //以i为亮度级别,随着i的增大,占空比增大38 for(k=0; k<64; k++)39 {40 if(k > i)41 {42 P0 = 0xFF;43 }44 }45 }46 }4748 //----------------------水滴降落过程---------------------49 for(state=0; state<16; state++)50 {51 //每一状态维持LightTime个脉冲52 for(count=0; count<=LightTime; count++)53 {54 //temp记录8个LED的状态,0代表亮,1代表灭55 temp = 0x00;5657 //一个脉冲长度j从0到6358 for(j=0; j<64; j++)59 {60 //根据亮度表,依次确定8个LED当前状态,亮或灭61 for(k=0; k<8; k++)62 {63 //以j为亮度级别,每个LED亮度不一样64 if(LightLevel == j)65 {66 temp |= (1 << k);67 }68 }6970 if(state <= 7)71 {72 P0 = ~((~temp) >> (7-state));73 }74 else75 {76 P0 = ~((~temp) << (state-7));77 }78 }79 }80 }81 }82 }L2(31-46).实现水滴变大效果,这段代码的作用可用图形表达,如图5:/bbs_upload782111/files_48/ourdev_701983UIXFGH.png(原文件名:120611_4.png) 图5控制D1由暗变亮,用了64个亮度级别,每个级别发送64个脉冲。
L2(49-81).实现水滴下落。
代码就不逐行解释了,大家可根据注释自己分析,主要说一下实现的方法。
定义LED有8个亮度级别,若用开发板上的8个LED表示,如图6:/bbs_upload782111/files_48/ourdev_701984S5TQBH.png(原文件名:120611_5.png) 图6图中的红色面积代表亮度程度。
实现流水效果的方法就是:让所有的亮度依次经过在所有LED,如图7:/bbs_upload782111/files_48/ourdev_701985XGCB1Z.png(原文件名:120611_6.png) 图7状态的持续时间从0-15逐渐减小,以模拟水滴加速。
下载验证:下载到开发板上,可以看到水滴下落效果。
3.4 定时器产生PWM前面3个例子中,我们用循环语句虽然能产生占空比不同的PWM,但PWM的周期不好控制,对此,我们学习如何用定时器产生特定周期PWM。
关于8051定时器的使用方法,大家可以参考例说51单片机的4章和5章。
我们用定时器0产生PWM,代码如下:程序清单L4 定时器0产生PWM1 #include <reg52.h>2 #include "hw_config.h"3 #include "my_type.h"456 //亮度级别表7 code u8 LightLevel={1,2,4,8,16,28,50,64};89 //函数声明10 void timer0_init(void);1112 void main(void)13 {14 //使能独立LED的供电,即LEDS6输出低电平15 LEDEN = 0;16 ADDR0 = 0;17 ADDR1 = 1;18 ADDR2 = 1;19 ADDR3 = 1;2021 timer0_init();2223 while(1)24 {25 }26 }2728 /**********************************************************29 函数名称:timer0_init30 功能:初始化定时器031 **********************************************************/32 void timer0_init(void)33 {34 TMOD = 0x01; //运行模式135 TH0 = 0xFF; //10us中断36 TL0 = 0xFA;37 EA = 1; //开启中断38 ET0 = 1;39 TR0 = 1; //启动定时器4041 }4243 /************************************************************44 函数名称:timer0_overflow45 功能:定时器0溢出中断46 ************************************************************/47 void timer0_overflow(void) interrupt TIMER0_OVERFLOW48 {49 u8 i,temp = 0;50 static u8 count = 0;5152 count++;53 count %= 64;5455 for(i=0; i<8; i++)56 {57 if(LightLevel <= count)58 {59 temp |= (1<<i);60 }61 else62 {63 temp &= ~(1<<i);64 }65 }6667 P0 = temp;6869 TR0 = 0;70 TH0 = 0xFF; //重新赋值71 TL0 = 0xF7;72 TR0 = 1;73 }L4(32).初始化定时器0,没10us产生一次中断。