基于单片机编程的流水灯设计原理++含程序
《单片机原理及应用》基于51单片机实验箱的流水灯设计

《单片机原理及应用》基于51单片机实验箱的流水灯设计一、实验目的和要求1.掌握单片机基本资源使用。
2.掌握单片机电路原理图。
3.掌握单片机C语言软件开发以及试验箱使用。
二、实验内容和原理实验内容:1.绘制程序流程图并编写C语言程序2.在实验箱中进行测试,最后提交实验报告三、主要仪器设备Keil4软件、C51单片机实验箱。
四、操作方法与实验步骤4.1 题目要求使用单片机实验箱实现流水灯功能。
4.2 系统设计思路主程序中实现流水灯功能,时间单位采用500ms信号,作为实现流水灯的发光二极管和单片机的P1相连。
4.2 C程序编制(包含详细的文字和程序流程图)#include<intrins.h>#include<reg52.h>#define uchar unsiged char#define uint unsigned intvoid mDelay(uint Delay){int i;for(;Delay>0;Delay--)for(i=0;i<110;i++);}void main(){unsigned char a,i;While(1){a=0x01;for(i=0;i<8;i++){a=-crol-(a,1)P2=amDelay(500);}}4.3 测试分析(包含文字和图像叙述)在KeilC51软件软件中编写好程序并调试好后,连接单片机实验箱,实验结果如下:实验箱上连接的八个灯,每个灯间隔500ms的时间一个接一个的循环闪烁。
五、讨论和心得(不少于100字)通过此次实验,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,试验过程还是比较繁琐,但是还是完成了这次试验,使我对于理解单片机的基本原理更加深刻,将所学知识运用到实践中,在实践中发现问题,强化理论知识。
课程名称:单片机原理及应用实验项目名称(二):定时计数器的应用—按钮控制LED灯四、实验目的和要求1.掌握单片机基本资源使用。
五种编程方式实现流水灯的单片机C程序

五种编程方式实现流水灯的单片机C程序流水灯是一种常见的灯光效果,常用于装饰和展示。
实现流水灯的程序可以使用多种不同的编程方式,包括传统的顺序编程、状态机编程、中断编程、调度器编程和面向对象编程。
下面分别介绍这五种方式实现流水灯的程序。
1.顺序编程方式:顺序编程是最常见的编程方式,也是最直接的方式。
下面是使用顺序编程方式实现流水灯的C程序:```c#include <reg52.h>void delay(unsigned int t)while(t--)for(int i=0; i<50; i++);}void mainunsigned char led = 0x80; // 初始灯光状态while(1)P0 = led; // 输出灯光状态delay(500); // 延时一段时间led >>= 1; // 右移一位,实现流水灯效果if(led == 0) // 到达最右边后重新开始led = 0x80;}}```2.状态机编程方式:状态机编程是一种基于状态的编程方式,通过定义不同的状态和状态转换来实现流水灯效果。
下面是使用状态机编程方式实现流水灯的C程序:```c#include <reg52.h>typedef enumState1,State2,State3,State4,State5} State;void delay(unsigned int t)while(t--)for(int i=0; i<50; i++);}void mainState state = State1; // 初始状态为State1 while(1)switch(state)case State1:P0=0x80;delay(500);state = State2;break;case State2:P0=0x40;delay(500);state = State3;break;case State3:P0=0x20;delay(500);state = State4;break;case State4:P0=0x10;delay(500);state = State5;break;case State5:P0=0x08;delay(500);state = State1;break;}}```3.中断编程方式:中断编程方式是一种基于中断事件的编程方式,通过在特定的中断事件触发时改变灯光状态来实现流水灯效果。
基于单片机编程的流水灯设计原理++含程序

1.引言当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。
单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。
目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。
学习单片机的最有效方法就是理论与实践并重,本文笔者用AT89C51单片机自制了一款简易的流水灯,重点介绍了其软件编程方法,以期给单片机初学者以启发,更快地成为单片机领域的优秀人才。
2.硬件组成按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。
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灯便会一亮一暗的做流水灯了。
在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。
单片机实验LED流水灯实验

LED流水灯实验一、实验内容将LED灯逐个点亮,然后全亮,全灭。
二、实验原理8个LED发光二极管,分别对应单片机IO口的P0.0到P0.7口,8个单片机IO口组成一个字节,用一个八位二进制的左移和右移来确定灯的亮灭,并用定时器延时。
三、描述该实验中运用的理论知识1、LED的点亮:8个LED发光二极管,分别对应单片机IO口的P0.0到P0.7口,8个单片机IO口组成一个字节,在程序编写过程中,可以直接用P0来进行操作。
2、流水效果:C语言的8位二进制数代表了8个IO口,左移,最低位填0,然后按位取反,就可以将灯逐个点亮3、延时:特殊功能寄存器TMOD,如图T1和T0分别代表单片机两个计数器。
GATE:该位被置位时为门控位。
仅当TR1被置位并且INT1脚为高,定时器开始计数。
当该位被清零时,只要TR1被置位,定时器1马上开始计数。
C/T:该位为0的时候,用作定时器,该位为1的时候,用做计数器。
0.5秒的延时12 * (65536- x)/11059200 = 0.001四、实验步骤1、流程图2、结果程序:#include <reg52.h>typedef unsigned char uint8;typedef unsigned int uint16;sbit ENLED = P1^4;sbit ADDR0 = P1^0;sbit ADDR1 = P1^1;sbit ADDR2 = P1^2;sbit ADDR3 = P1^3;main(){uint8 counter;uint16 i,j;ENLED = 0;ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; ADDR3 = 1;TMOD = 0x01;TH0 = 0xB8;TL0 = 0x00;TR0 = 1;while(1){if(1 == TF0){TF0 = 0;TH0 = 0xB8;TL0 = 0x00;counter++;}if(25 == counter){counter = 0;if(8 == j){P0 = 0X00;for(i=0;i<=38000;i++);P0 = 0XFF;for(i=0;i<=38000;i++);j = 0;}P0 = ~(1 << j++);}}}。
基于单片机的LED流水彩灯设计

第1章概述近几年来,彩灯对于美化、亮化城市有着不可轻视的重要工作。
因此作为城市装饰的彩灯需求量越来越大,对与彩灯的技术和花样也越来越高。
但传统的彩灯控制电路一般是由数字电路组成,这种彩灯控制器电路结构复杂、成本较高、功率损耗大,此外从功能效果上看,彩灯模式少而且样式单调,缺乏用户可操作性,影响亮灯效果。
因此有必要对现有的彩灯控制器进行改进。
然而单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。
LED彩灯具有成本低、发光纯度高、发光热量小、耗电量低、超长寿命的特点。
所以利用单片机作LED彩灯控制,不仅是使控制花样、路数大大增加,成本也很低,而且对环境能源没有污染,有着很大的发展前景。
本方案是一种基于AT-89C51单片机的彩灯控制方案,实现对LED彩灯的控制。
主要以AT-89C51单片机作为主控核心与发光二极管、晶振、复位、电源等组成电路,利用软件编辑实现彩灯流水灯的效果。
第2章方案设计2.1设计任务(1)共有红、绿、蓝3色彩灯各8个,要求按一定顺序和时间关系运行:红色发光二极管由弱到强—>绿色发光二极管由弱到强—>蓝色发光二极管由弱到强。
(2)利用三基色原理,控制每次点亮红色发光二极管,绿色发光二极管,蓝色发光二极管的数目,实现黄色,紫色,青色。
(3)控制不同颜色发光二极管的数目,实现花样彩灯。
(4)编写程序代码。
(5)程序分析与调试。
2.2工程方案按照设计任务要求,红,绿,蓝光由弱到强,每个颜色用8个发光二极管,在程序控制下,先亮一个,再亮两个,再亮三个,慢慢的直到最后全亮,就能看到由弱到强的现象。
如果同一颜色使用更多的发光二极管,显示效果会更柔和。
要实现黄色,紫色,青色光,只能根据三基色原理进行合成。
所谓三基色是指红,绿,蓝三色,人眼对红,绿,蓝最为敏感,大多数可以通过红,绿,蓝3种颜色按照不同的比例合成产生。
同时,绝大多数单色光也可以分解成红绿蓝三种光。
51单片机流水灯实验报告

51单片机流水灯实验报告一、实验目的1.熟悉51单片机的硬件资源2.掌握51单片机的I/O口编程3.掌握51单片机的定时器/计数器编程二、实验原理流水灯是一种简单的电子设计,通过依次点亮和熄灭多个LED灯来形成流水灯的效果。
本实验使用的是51单片机,它有40个I/O口和3个定时器/计数器,可以方便地实现流水灯的效果。
三、实验器材1.51单片机开发板B数据线3.LED灯若干4.面包板5.连线材料(公对公、公对母杜邦线)四、实验过程1.准备工作:a.将51单片机开发板和LED灯连接起来,将LED灯依次插在面包板上,并与51单片机的I/O口相连接。
b.连接电脑与51开发板,使用USB数据线将它们连接起来。
2.编写程序:a. 打开Keil开发环境,新建一个工程。
b.在C代码文件中编写流水灯的控制程序,并引用51单片机的头文件和IO口控制相关的函数。
代码示例:```c#include <reg51.h>sbit LED1 = P1^0;sbit LED2 = P1^1;sbit LED3 = P1^2;sbit LED4 = P1^3;sbit LED5 = P1^4;void delay(unsigned int t)while(t--)for(unsigned int i = 0; i < 125; i++);}void maiwhile(1)LED1=0;//点亮LED1delay(1000); // 延时LED1=1;//熄灭LED1LED2=0;//点亮LED2delay(1000); // 延时LED2=1;//熄灭LED2LED3=0;//点亮LED3delay(1000); // 延时LED3=1;//熄灭LED3LED4=0;//点亮LED4delay(1000); // 延时LED4=1;//熄灭LED4LED5=0;//点亮LED5delay(1000); // 延时LED5=1;//熄灭LED5}}```3.烧录程序:a.将开发板上的烧录开关调整为“USB”模式。
基于单片机心形流水灯C语言源程序精编

基于单片机心形流水灯C语言源程序精编Document number:WTT-LKK-GBB-08921-EIGG-22986#include<>unsigned int x,y;void delayms(unsigned int z) //延时{unsigned int i,j;for(i=z;i>0;i--)for(j=150;j>0;j--);}void On_all() //开启所有灯{P0=0x00; P1=0x00; P2=0x00; P3=0x00; }void Off_all()//关闭所有灯{P0=0xff; P1=0xff; P2=0xff; P3=0xff; }void ls()//正向流水灯{P0=0x00; delayms(400);P2=0x00; delayms(400);P3=0x00; delayms(400);P1=0x00; delayms(400);P0=0x01; delayms(50);P0=0x02; delayms(50);P0=0x04; delayms(50);P0=0x08; delayms(50);P0=0x10; delayms(50);P0=0x20; delayms(50);P0=0x40; delayms(50);P0=0x80; delayms(50);P0=0x00;P2=0x01; delayms(50);P2=0x04; delayms(50); P2=0x08; delayms(50);P2=0x10; delayms(50); P2=0x20; delayms(50);P2=0x40; delayms(50); P2=0x80; delayms(50);P2=0x00;P3=0x80; delayms(50);P3=0x40; delayms(50); P3=0x20; delayms(50);P3=0x10; delayms(50);P3=0x08; delayms(50); P3=0x04; delayms(50);P3=0x02; delayms(50); P3=0x01; delayms(50); P3=0x00;P1=0x80; delayms(50);P1=0x40; delayms(50);P1=0x20; delayms(50); P1=0x10; delayms(50);P1=0x08; delayms(50); P1=0x04; delayms(50);P1=0x02; delayms(50); P1=0x01; delayms(50); P1=0x00;Off_all();P0=0xfe; delayms(50);P0=0xfd; delayms(50);P0=0xfb; delayms(50); P0=0xf7; delayms(50); P0=0xef; delayms(50); P0=0xdf; delayms(50);P0=0x7f; delayms(50);P0=0xff;P2=0xfe; delayms(50);P2=0xfd; delayms(50);P2=0xfb; delayms(50);P2=0xf7; delayms(50);P2=0xef; delayms(50);P2=0xdf; delayms(50);P2=0xbf; delayms(50);P2=0x7f; delayms(50); P2=0xff;P3=0x7f; delayms(50);P3=0xbf; delayms(50);P3=0xdf; delayms(50);P3=0xef; delayms(50);P3=0xf7; delayms(50);P3=0xfb; delayms(50);P3=0xfd; delayms(50);P3=0xfe; delayms(50);P3=0xff;P1=0x7f; delayms(50);P1=0xbf; delayms(50);P1=0xdf; delayms(50);P1=0xef; delayms(50);P1=0xf7; delayms(50);P1=0xfb; delayms(50);P1=0xfd; delayms(50);P1=0xfe; delayms(50);P1=0xff;P0=0xfe; delayms(50);P0=0xfc; delayms(50);P0=0xf8; delayms(50);P0=0xf0; delayms(50);P0=0xe0; delayms(50);P0=0xc0; delayms(50);P0=0x80; delayms(50);P0=0x00; delayms(50);P2=0xfe; delayms(50);P2=0xfc; delayms(50);P2=0xf8; delayms(50);P2=0xf0; delayms(50);P2=0xe0; delayms(50);P2=0xc0; delayms(50);P2=0x80; delayms(50);P2=0x00; delayms(50);P3=0x7f; delayms(50);P3=0x3f; delayms(50);P3=0x1f; delayms(50);P3=0x0f; delayms(50);P3=0x07; delayms(50);P3=0x03; delayms(50);P3=0x01; delayms(50);P3=0x00; delayms(50);P1=0x7f; delayms(50);P1=0x3f; delayms(50);P1=0x1f; delayms(50);P1=0x0f; delayms(50);P1=0x07; delayms(50);P1=0x03; delayms(50);P1=0x01; delayms(50);P1=0x00; delayms(50);}void fan_ls()//反向流水灯{Off_all(); delayms(300);On_all(); delayms(300); Off_all(); delayms(300); P1=0x00;delayms(400);P3=0x00;delayms(400);P2=0x00;delayms(400);P0=0x00;delayms(400); P1=0x01;delayms(50);P1=0x02;delayms(50);P1=0x04;delayms(50);P1=0x08;delayms(50);P1=0x10;delayms(50);P1=0x20;delayms(50);P1=0x40;delayms(50);P1=0x80;delayms(50);P1=0x00;P3=0x01;delayms(50);P3=0x02;delayms(50);P3=0x04;delayms(50);P3=0x08;delayms(50);P3=0x10;delayms(50);P3=0x20;delayms(50);P3=0x40;delayms(50);P3=0x80;delayms(50);P3=0x00;P2=0x80;delayms(50);P2=0x40;delayms(50);P2=0x20;delayms(50);P2=0x10;delayms(50);P2=0x08;delayms(50);P2=0x04;delayms(50);P2=0x02;delayms(50);P2=0x01;delayms(50);P2=0x00;P0=0x80;delayms(50);P0=0x40;delayms(50);P0=0x20;delayms(50);P0=0x10;delayms(50);P0=0x08;delayms(50);P0=0x04;delayms(50); P0=0x02;delayms(50);P0=0x01;delayms(50);P0=0x00;Off_all();P1=0xfe; delayms(50);P1=0xfd; delayms(50);P1=0xfb; delayms(50); P1=0xf7; delayms(50); P1=0xef; delayms(50); P1=0xdf; delayms(50); P1=0xbf; delayms(50); P1=0x7f; delayms(50);P1=0xff;P3=0xfe; delayms(50);P3=0xfd; delayms(50);P3=0xfb; delayms(50); P3=0xf7; delayms(50); P3=0xef; delayms(50); P3=0xdf; delayms(50); P3=0xbf; delayms(50); P3=0x7f; delayms(50);P3=0xff;P2=0x7f; delayms(50);P2=0xbf; delayms(50); P2=0xdf; delayms(50);P2=0xef; delayms(50); P2=0xf7; delayms(50);P2=0xfb; delayms(50); P2=0xfd; delayms(50); P2=0xfe; delayms(50);P2=0xff;P0=0x7f; delayms(50);P0=0xbf; delayms(50);P0=0xdf; delayms(50);P0=0xef; delayms(50);P0=0xf7; delayms(50);P0=0xfb; delayms(50); P0=0xfd; delayms(50); P0=0xfe; delayms(50);P0=0xff;P1=0xfe; delayms(50);P1=0xfc; delayms(50);P1=0xf8; delayms(50);P1=0xf0; delayms(50);P1=0xe0; delayms(50);P1=0xc0; delayms(50); P1=0x80; delayms(50); P1=0x00; delayms(50);P3=0xfe; delayms(50);P3=0xfc; delayms(50);P3=0xf8; delayms(50);P3=0xf0; delayms(50);P3=0xe0; delayms(50);P3=0xc0; delayms(50); P3=0x80; delayms(50); P3=0x00; delayms(50);P2=0x7f; delayms(50);P2=0x3f; delayms(50);P2=0x1f; delayms(50);P2=0x0f; delayms(50);P2=0x07; delayms(50);P2=0x03; delayms(50);P2=0x01; delayms(50);P2=0x00; delayms(50);P0=0x7f; delayms(50);P0=0x3f; delayms(50);P0=0x1f; delayms(50);P0=0x0f; delayms(50);P0=0x07; delayms(50);P0=0x03; delayms(50);P0=0x01; delayms(50);P0=0x00; delayms(50);Off_all();On_all();Off_all();On_all();Off_all();}void ban_shan()//半边交替闪{Off_all();P1=0x00;P3=0x00;delayms(50);P0=0xff;P2=0xff;d elayms(50);P1=0xff;P3=0xff;delayms(50);P0=0x00;P2=0x00;d elayms(50);P1=0x00;P3=0x00;delayms(50);P0=0xff;P2=0xff;d elayms(50);P1=0xff;P3=0xff;delayms(50);P0=0x00;P2=0x00;d elayms(50);P1=0x00;P3=0x00;delayms(50);P0=0xff;P2=0xff;d elayms(50);P1=0xff;P3=0xff;delayms(50);P0=0x00;P2=0x00;d elayms(50);P1=0x00;P3=0x00;delayms(50);P0=0xff;P2=0xff;d elayms(50);P1=0xff;P3=0xff;delayms(50);P0=0x00;P2=0x00;d elayms(50);P1=0x00;P3=0x00;delayms(50);P0=0xff;P2=0xff;d elayms(50);P1=0xff;P3=0xff;delayms(50);P0=0x00;P2=0x00;d elayms(50);}void shangxia_shan()//上下交替闪{On_all();Off_all();P0=0x00;P1=0x00;delayms(50);P2=0xff;P3=0xff;d elayms(50);P0=0xff;P1=0xff;delayms(50);P2=0x00;P3=0x00;d elayms(50);P0=0x00;P1=0x00;delayms(50);P2=0xff;P3=0xff;d elayms(50);P0=0xff;P1=0xff;delayms(50);P2=0x00;P3=0x00;d elayms(50);P0=0x00;P1=0x00;delayms(50);P2=0xff;P3=0xff;d elayms(50);P0=0xff;P1=0xff;delayms(50);P2=0x00;P3=0x00;d elayms(50);P0=0x00;P1=0x00;delayms(50);P2=0xff;P3=0xff;d elayms(50);P0=0xff;P1=0xff;delayms(50);P2=0x00;P3=0x00;d elayms(50);P0=0x00;P1=0x00;delayms(50);P2=0xff;P3=0xff;d elayms(50);P0=0xff;P1=0xff;delayms(50);P2=0x00;P3=0x00;d elayms(50);}void huayang_shan()//花样闪烁{On_all();delayms(400);P0=0xff;P2=0x00;P3=0x00;P1=0x00;delayms(200);P0=0x00;P2=0xff;P3=0x00;P1=0x00;delayms(200);P0=0x00;P2=0x00;P3=0xff;P1=0x00;delayms(200);P0=0x00;P2=0x00;P3=0x00;P1=0xff;delayms(200);P0=0x00;P2=0x00;P3=0xff;P1=0x00;delayms(200);P0=0x00;P2=0xff;P3=0x00;P1=0x00;delayms(200);P0=0xff;P2=0x00;P3=0x00;P1=0x00;delayms(200);On_all();delayms(400);P0=0x00;P2=0x00;P3=0x00;P1=0xff;delayms(200);P0=0x00;P2=0x00;P3=0xff;P1=0x00;delayms(200);P0=0x00;P2=0xff;P3=0x00;P1=0x00;delayms(200);P0=0xff;P2=0x00;P3=0x00;P1=0x00;delayms(200);P0=0x00;P2=0xff;P3=0x00;P1=0x00;delayms(200);P0=0x00;P2=0x00;P3=0xff;P1=0x00;delayms(200);P0=0x00;P2=0x00;P3=0x00;P1=0xff;delayms(200);On_all();delayms(400);Off_all();delayms(400);P0=0x00;delayms(200);P3=0x00;delayms(200);P1=0x00;delayms(200);P2=0x00;delayms(200);On_all();delayms(400);Off_all();delayms(400);P1=0x00;delayms(200);P2=0x00;delayms(200);P0=0x00;delayms(200);P3=0x00;delayms(200);On_all();delayms(400);Off_all();delayms(50);On_all();delayms(50);Off_all();delayms(50);On_all();delayms(50);Off_all();delayms(50);}void main(){On_all(); delayms(300);Off_all(); delayms(300);On_all(); delayms(300);Off_all(); delayms(300);On_all(); delayms(300);Off_all(); delayms(300);ls(); //正向流水fan_ls(); //反向流水ban_shan(); //半边交替闪shangxia_shan(); //上下交替闪烁huayang_shan();// 花样闪烁}。
基于51单片机的流水灯的设计与实现

基于51单片机的流水灯的设计与实现摘要:本文基于STC89C52单片机应用为核心,从系统的硬件电路入手,将8位发光二极管通过共阴极接法接到单片机的P0端口,并通过控制P0口的电平高低以达到控制发光二极管,从而实现循环流水灯的设计。
【关键词】发光二极管单片机流水灯在我们的日常生活中,随处可见各种美丽的霓虹灯,这些美丽的霓虹灯将我们的城市装扮的绚丽多彩,霓虹灯广告牌也已经成为各大商家争相竞争的手段。
其实这些霓虹灯是由发光二极管组合而成的,而这些发光二极管的组合多数也是基于单片机设计和制作出来的。
而这些霓虹灯大多电路结构复杂,不容易实现。
我们就以制作一台简易循环流水灯为例来介绍一下它基于51单片机的设计方案。
1 功能需求约定本次设计主要实现8个发光管间隔200ms由上至下,再由下至上,一个轮回后再重复上个轮回,即用单片机来设计循环流水灯,就是实现这十五种状态的循环切换控制。
2 开发方案的设计本文分别从硬件设计方案和软件设计方案两个方面进行分析。
2.1 硬件设计方案根据循环流水灯的十五种运行状态,可以看出,每盏灯的每种状态我们可以做同样的处理,因此在电路设计中,可以在每种状态下,对单片机的对应引脚做同样的输出,这样我们就可以实现基于51单片机最小系统电路(如图1a所示)流水灯模型的硬件设计了,值得说明的是我们这里采用的是共阴极连接方式(如图1b所示),所谓共阴极连接方式即发光二极管的阴极连接在一起形成一个公共端。
如图1b中的D0-D7八个发光二极管就为共阴极连接方式。
在这里每个发光二极管上还串联了一个限流电阻,那此限流电阻的阻值又该如何选取呢?由于单片机上提供的电压一般为+5V,发光二极管的导通压降一般为1.7V左右,需要的电流一般为3mA,所以限流电阻阻值的计算公式为2.2 软件设计方案状态控制码的确定所谓状态控制码,就是要使流水灯工作在某一种状态,我们应该向单片机的控制口所输出的编码,由前面的硬件设计可知,在某一个状态下,当P0口的某一引脚输出为1时,对应的发光二极管点亮,当P0口某一引脚输出为0时,对应发光二极管熄灭,因此我们前方十五种状态所对应的P0口控制码可以依次写出,以状态1D0灯亮为例,我们可以得到00000001的一个状态码,也就是01(十六进制),因此我们只需要为01通过P0口输出就可以实现状态1的显示了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.引言当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。
单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。
目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。
学习单片机的最有效方法就是理论与实践并重,本文笔者用AT89C51单片机自制了一款简易的流水灯,重点介绍了其软件编程方法,以期给单片机初学者以启发,更快地成为单片机领域的优秀人才。
2.硬件组成按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。
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灯的亮灭。
程序如下:ORG 0000H ;单片机上电后从0000H地址执行AJMP START ;跳转到主程序存放地址处ORG 0030H ;设置主程序开始地址START:MOV SP,#60H ;设置堆栈起始地址为60HCLR P1.0 ;P1.0输出低电平,使LED1点亮ACALL DELAY ;调用延时子程序SETB P1.0 ;P1.0输出高电平,使LED1熄灭CLR P1.1 ;P1.1输出低电平,使LED2点亮ACALL DELAY ;调用延时子程序SETB P1.1 ;P1.1输出高电平,使LED2熄灭CLR P1.2 ;P1.2输出低电平,使LED3点亮ACALL DELAY ;调用延时子程序SETB P1.2 ;P1.2输出高电平,使LED3熄灭CLR P1.3 ;P1.3输出低电平,使LED4点亮ACALL DELAY ;调用延时子程序SETB P1.3 ;P1.3输出高电平,使LED4熄灭CLR P1.4 ;P1.4输出低电平,使LED5点亮ACALL DELAY ;调用延时子程序SETB P1.4 ;P1.4输出高电平,使LED5熄灭CLR P1.5 ;P1.5输出低电平,使LED6点亮ACALL DELAY ;调用延时子程序SETB P1.5 ;P1.5输出高电平,使LED6熄灭CLR P1.6 ;P1.6输出低电平,使LED7点亮ACALL DELAY ;调用延时子程序SETB P1.6 ;P1.6输出高电平,使LED7熄灭CLR P1.7 ;P1.7输出低电平,使LED8点亮ACALL DELAY ;调用延时子程序SETB P1.7 ;P1.7输出高电平,使LED8熄灭ACALL DELAY ;调用延时子程序AJMP START ;8个LED流了一遍后返回到标号START处再循环DELAY:;延时子程序MOV R0,#255 ;延时一段时间D1: MOV R1,#255DJNZ R1,$DJNZ R0,D1RET ;子程序返回END ;程序结束3.2循环移位法在上个程序中我们是逐个控制P1端口的每个位来实现的,因此程序显得有点复杂,下面我们利用循环移位指令,采用循环程序结构进行编程。
我们在程序一开始就给P1口送一个数,这个数本身就让P1.0先低,其他位为高,然后延时一段时间,再让这个数据向高位移动,然后再输出至P1口,这样就实现“流水”效果啦。
由于8051系列单片机的指令中只有对累加器ACC中数据左移或右移的指令,因此实际编程中我们应把需移动的数据先放到ACC中,让其移动,然后将ACC移动后的数据再转送到P1口,这样同样可以实现“流水”效果。
具体编程如下所示,程序结构确实简单了很多。
ORG 0000H ;单片机上电后从0000H地址执行AJMP START ;跳转到主程序存放地址处ORG 0030H ;设置主程序开始地址START:MOV SP,#60H ;设置堆栈起始地址为60HMOV A,#0FEH ;ACC中先装入LED1亮的数据(二进制的11111110)MOV P1,A ;将ACC的数据送P1口MOV R0,#7 ;将数据再移动7次就完成一个8位流水过程LOOP: RL A ;将ACC中的数据左移一位MOV P1,A ;把ACC移动过的数据送p1口显示ACALL DELAY ;调用延时子程序DJNZ R0,LOOP ;没有移动够7次继续移动AJMP START ;移动完7次后跳到开始重来,以达到循环流动效果DELAY:;延时子程序MOV R0,#255 ;延时一段时间D1: MOV R1,#255DJNZ R1,$DJNZ R0,D1RET ;子程序返回END ;程序结束3.3查表法上面的两个程序都是比较简单的流水灯程序,“流水”花样只能实现单一的“从左到右”流方式。
运用查表法所编写的流水灯程序,能够实现任意方式流水,而且流水花样无限,只要更改流水花样数据表的流水数据就可以随意添加或改变流水花样,真正实现随心所欲的流水灯效果。
我们首先把要显示流水花样的数据建在一个以TAB为标号的数据表中,然后通过查表指令“MOVC A,@A+DPTR”把数据取到累加器A 中,然后再送到P1口进行显示。
具体源程序如下,TAB标号处的数据表可以根据实现效果的要求任意修改。
ORG 0000H ;单片机上电后从0000H地址执行AJMP START ;跳转到主程序存放地址处ORG 0030H ;设置主程序开始地址START:MOV SP,#60H ;设置堆栈起始地址为60HMOV DPTR,# TAB ;流水花样表首地址送DPTRLOOP: CLR A ;累加器清零MOVC A,@A+DPTR ;取数据表中的值CJNE A,#0FFH,SHOW;检查流水结束标志AJMP START ;所有花样流完,则从头开始重复流SHOW: MOV P1,A ;将数据送到P1口ACALL DELAY ;调用延时子程序INC DPTR ;取数据表指针指向下一数据AJMP LOOP ;继续查表取数据DELAY:;延时子程序MOV R0,#255 ;延时一段时间D1: MOV R1,#255DJNZ R1,$DJNZ R0,D1RET ;子程序返回TAB:;下面是流水花样数据表,用户可据要求任意编写DB 11111110B ;二进制表示的流水花样数据,从低到高左移DB 11111101BDB 11111011BDB 11110111BDB 11101111BDB 11011111BDB 10111111BDB 01111111BDB 01111111B ;二进制表示的流水花样数据,从高到低右移DB 10111111BDB 11011111BDB 11101111BDB 11110111BDB 11111011BDB 11111101BDB 11111110BDB 0FEH,0FDH,0FBH,0F7H ;十六进制表示的流水花样数据DB 0EFH,0DFH,0BFH,7FHDB 7FH,0BFH,0DFH,0EFHDB 0F7H,0FBH,0FDH,0FEH……DB 0FFH ;流水花样结束标志0FFHEND ;程序结束4.结语当上述程序之一编写好以后,我们需要使用编译软件对其编译,得到单片机所能识别的二进制代码,然后再用编程器将二进制代码烧写到AT89C51单片机中,最后连接好电路通电,我们就看到LED1~LED8的“流水”效果了。
本文所给程序实现的功能比较简单,旨在抛砖引玉,用户可以自己在此基础上扩展更复杂的流水灯控制,比如键盘控制流水花样、控制流水灯显示数字或图案等等。
参考文献:[1]徐煜明,韩雁.单片机原理及接口技术[M].北京:电子工业出版社,2005.1[2]万光毅,严义,邢春香.单片机实验与实践教程[M].北京:北京航空航天大学出版社,2006.4。