单片机音乐流水灯程序
- 格式:doc
- 大小:52.00 KB
- 文档页数:13
1.第一个发光管以间隔200ms 闪烁。
2.8 个发光管由上至下间隔1s 流动,其中每个管亮500ms, 灭500ms 。
3.8 个发光管来回流动,第个管亮100ms 。
4.用8 个发光管演示出8 位二进制数累加过程。
5.8 个发光管间隔200ms 由上至下,再由下至上,再重复一次,然后全部熄灭再以300ms 间隔全部闪烁 5 次。
重复此过程。
6.间隔300ms 第一次一个管亮流动一次,第二次两个管亮流动,依次到8 个管亮,然后重复整个过程。
7.间隔300ms 先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;8 个全部闪烁 3 次;关闭发光管,程序停止。
1#include<reg52.h>#define uint unsigned intsbit led 仁P"0;void delay();void main(){while(1){led1=0;delay();led1=1;delay();}}void delay(){uint x,y;for(x=200;x>0;x--) for(y=100;y>0;y--);}#include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit p P1A0; uchar a;void delay(); void main() {a=0xfe;P1=a;while(1){ a=_crol_(a,1); delay();P1=a; delay();}}void delay(){uint b; for(b=55000;b>0;b--);}3#include<reg52.h>#include <intrins.h>#define uint unsigned int #define uchar unsigned char void delay() {uint x,y; for(x=100;x>0;x--) for(y=110;y>0;y--);}void main() {uchar a,i;while(1)a=0xfe; for(i=0;i<8;i++){P1=a; delay(100); a=_crol_(a,1);}a=0x7f; for(i=0;i<8;i++){P1=a; delay(100); a=_cror_(a,1);4#include<reg52.h>#include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(uint a) { uint x,y; for(x=a;x>0;x--) for(y=110;y>0;y--);}void main() {uchar b;while(1){b++;P1=~b; delay(200);5#include<reg52.h>#include <intrins.h> #define uint unsigned int #define uchar unsigned char void main() { uchar a,i,j;while(1){ for(j=0;j<2;j++){a=0xfe; for(i=0;i<8;i++){P1=a;delay(200); a=_crol_(a,1);}a=0x7f; for(i=0;i<8;i++){P1=a; delay(200); a=_cror_(a,1);}}P1=0xff; for(j=0;j<10;j++) {delay(300);P1=~P1;}}}void delay(){uint x,y; for(x=200;x>0;x--) for(y=110;y>0;y--); 6 #include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(){uint x,y; for(x=300;x>0;x--) for(y=110;y>0;y--);} void main(){uchar a,i,j; while(1) {a=0xfe; for(j=0;j<8;j++) { for(i=0;i<8-j;i++) {P1=a; delay(200); a=_crol_(a,1);} a=_crol_(a,j); P1=0xff; a=a<<1;}} }7#include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(uint z){uint x,y; for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){uchar a,i,j;for(j=0;j<3;j++){P1=0x55;delay(300);P1=0xaa; delay(300);}for(j=0;j<3;j++){a=0xfe;for(i=0;i<8;i++){P1=a;delay(300); a=_crol_(a,1);}}P1=0xff; for(j=0;j<3;j++){P1=0x7e;delay(300);P1=0xbd; delay(300);P1=0xdb; delay(300);P1=0xe7; delay(300);}P1=0xff;for(j=0;j<3;j++){P1=0xe7;delay(300);P1=0xdb;delay(300);P1=0xbd;delay(300);P1=0x7e;delay(300);}P1=0xff; for(j=0;j<6;j++) {P1=~P1; delay(300);}P1=0xff;while(1);}。
51单片机经典流水灯汇编程序(共8页)单片机流水灯汇编程序设计流水灯汇编程序8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。
;用最直接的方式实现流水灯ORG 0000H START:MOV P1,#01111111B ;最下面的LED点亮 LCALL DELAY ;延时1秒 MOV P1,#B ;最下面第二个的L ED点亮 LCALL DELAY ;延时1秒 MOV P1,#B ;最下面第三个的LED点亮(以下省略) LCALL DELAY MOV P1,#B LC ALL DELAY MOV P1,#B LCALL DELAY MOV P1,#B LCALL DELAY MOV P1,#B LCALL DELAY MOV P1,#B LCALL DELA Y MOV P1,#B ;完成第一次循环点亮,延时约秒 AJMP START ;反复循环;延时子程序,12M晶振延时约250毫秒DELAY: ;大约值:2us*256*256*2=260ms,也可以认为为250msPUSH PSW ;现场保护指令(有时可以不加)MOV R4,#2 L3: MOV R2 ,#00HL1: MOV R3 ,#00HL2: DJNZ R3 ,L2 ;最内层循环:(256次)2个周期指令(R3减一,如果比1大,则转向L 2) DJNZ R2 ,L1 ; 中层循环:256次 DJNZ R4 ,L3 ;外层循环:2次 POP PSW RET END--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--51单片机汇编程序集(二)2008年12月12日星期五 10:27辛普生积分程序内部RAM数据排序程序(升序)外部RAM数据排序程序(升序)外部RAM浮点数排序程序(升序)BCD小数转换为二进制小数(2位)BCD小数转换为二进制小数(N位)BCD整数转换为二进制整数(1位)BCD 整数转换为二进制整数(2位)BCD整数转换为二进制整数(3位)BCD整数转换为二进制整数(N位)二进制小数(2位)转换为十进制小数(分离BCD码)二进制小数(M位)转换为十进制小数(分离BCD码)二进制整数(2位)转换为十进制整数(分离BCD码)二进制整数(2位)转换为十进制整数(组合BCD码)二进制整数(3位)转换为十进制整数(分离BCD码)二进制整数(3位)转换为十进制整数(组合BCD码)二进制整数(M位)转换为十进制整数(组合BCD码)三字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7;二进制整数(2位)转换为十进制整数(分离BCD码);入口: R3,R4;占用资源: ACC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD21 : MOV NCNT,#00HMOV R2,#00HIBD211 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV@R0,AINC R0INC NCNTMOV A,R3ORL A,R4JNZ IBD211MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(2位)转换为十进制整数(组合BCD码);入口: R3,R4;占用资源: ACC,B,R7;堆栈需求: 3字节;出口: R0IBTD22 : MOV A,R0PUSH AMOV R7,#03HCLR AIBD221 : MOV @R0,AINC R0DJNZ R7,IBD221POP AMOVR0,AMOV R7,#10HIBD222 : PUSH ACLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOVB,#03HIBD223 : MOV A,@R0ADDC A,@R0DA AMOV @R0,AINC R0DJNZ B,IBD223POP AMOV R0,ADJNZR7,IBD222RET;二进制整数(3位)转换为十进制整数(分离BCD码);入口: R2,R3,R4;占用资源: ACC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD31 : CLR AMOV NCNT,AIBD311 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV @R0,AINCR0INC NCNTMOV A,R2ORL A,R3ORL A,R4JNZ IBD311MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(3位)转换为十进制整数(组合BCD码);入口: R2,R3,R4;占用资源: ACC,B,R7;堆栈需求: 3字节;出口: R0IBTD32 : MOV A,R0PUSH AMOV R7,#04HCLR AIBD321 : MOV @R0,AINC R0DJNZ R7,IBD321POP AMOVR0,AMOV R7,#18HIBD322 : PUSH ACLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV B,#04HIBD323 : MOV A,@R0ADDC A,@R0DA AMOV @R0,AINC R0DJNZ B,IBD323POP AMOVR0,ADJNZ R7,IBD322RET第七个试验:流水灯数字显示综合练习----51单片机汇编语言试验教程收藏该程序运行结果为个位数码管轮流现实0,1,2,3,4,5,6,7,8然后十位数码管轮流现实0,1,2,3,4,5,6,7,8反复循环,, ,, ,, ,, 依次点亮然后轮流点亮小喇叭不停发出滴答声:注意该程序配套为我站的倚天版开发套件:如果是标准版:因他的数码管接法不同。
基于单片机的音乐流水灯设计音乐流水灯在现代生活中越来越受到人们的喜爱,它将音乐与灯光相结合,创造出一种独特的视听效果。
而更是将这一创意发挥到了极致。
本文将围绕这一主题展开深入研究,探讨单片机技术在音乐流水灯设计中的应用。
首先,我们需要了解什么是单片机。
单片机是一种集成在一块芯片上的微处理器,具有中心处理器、存储器、输入输出端口等功能。
在嵌入式系统设计中,单片机被广泛应用于各种领域,包括家电、汽车电子、医疗设备等。
在音乐流水灯设计中,单片机可以控制灯光的亮度、颜色、闪烁效果,并实现与音乐的同步播放。
音乐流水灯设计的关键是如何实现音乐与灯光的同步效果。
传统的音乐流水灯主要通过模拟电路来实现,但是这种设计存在灵活性低、难以控制等问题。
而基于单片机的音乐流水灯设计则可以通过编程控制灯光效果,实现更加精确的同步效果。
单片机可以根据音乐的节奏和节拍,控制灯光的亮度和闪烁频率,达到视听效果的最佳匹配。
在实际的音乐流水灯设计中,我们可以选择不同的单片机芯片和周边器件,根据需求设计相应的硬件电路。
同时,我们还需要编写相应的控制程序,实现音乐与灯光的同步效果。
在程序设计中,我们可以利用单片机的定时器、中断、串口通信等功能,实现复杂的灯光效果。
除了硬件设计和程序编写,我们还需要考虑音乐流水灯的外观设计。
灯光的颜色、形状、布局等都会影响整体效果。
在外观设计中,我们可以采用不同的灯珠、灯管、灯带等灯具,搭配适当的灯罩或反光板,创造出独特的视觉效果。
此外,我们还可以设计出不同的灯光变换模式,如呼吸灯、闪烁灯、渐变灯等,增加灯光效果的多样性。
在音乐流水灯设计中,音乐的选择也是至关重要的。
不同类型的音乐会带来不同的视听感受。
我们可以选择流行歌曲、古典乐曲、电子音乐等不同类型的音乐,根据音乐的节奏和情感色彩,设计出相应的灯光效果。
此外,我们还可以考虑加入声控功能,让灯光根据声音的大小和频率进行变化,增加互动性和趣味性。
在实际应用中,基于单片机的音乐流水灯设计可以广泛应用于家庭装饰、商业展示、演艺舞台等场合。
下面给出两个程序。
//================================================//利用单片机定时器中断,使P0口外接的8个发光二极管以1位1s的速度,轮流发光。
//================================================#include<reg52.h>#include<intrins.h>#define ucha unsigned char#define uint unsigned intvoid init();ucha b = 0;//----------------------------main(){ucha a = 0xfe;P0 = a;init();while(1) {if(b == 20) { //如果中断了20次.b = 0; //就是1sa = _crol_(a, 1);//移位P0 = a; //输出}}}//----------------------------void init(){TMOD = 0x01; //T0定时方式0TH0 = (65536 - 50000) / 256; //定时50ms@12MHzTL0 = (65536 - 50000) % 256;TR0 = 1; //启动ET0 = 1; //开放中断EA = 1;}//----------------------------void timer0() interrupt 1 //每隔50ms中断一次{TH0 = (65536 - 50000) / 256; //恢复初始值TL0 = (65536 - 50000) % 256;b++; //中断次数加一}/*//================================================//利用单片机软件延时,使P0口外接的8个发光二极管以1位1s的速度,轮流发光。
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灯呼吸的间隔长短,数值越⼩,间隔越短。
目录流水灯最原始 (1)流水灯位左移 (3)流水灯移位函数 (4)流水灯数组 (5)流水灯精确定时器 (6)流水灯最原始#include "reg51.h"sbit p0=P1^0;sbit p1=P1^1;sbit p2=P1^2;sbit p3=P1^3;sbit p4=P1^4;sbit p5=P1^5;sbit p6=P1^6;sbit p7=P1^7;voidmdelay(unsigned int t){unsigned char n;for(;t>0;t--)for(n=0;n<125;n++){;}}void main(){while(1){P1=0;p0=1;mdelay(1000);p0=0;p1=1;mdelay(1000);p1=0;p2=1;mdelay(1000);p2=0;p3=1;mdelay(1000);p3=0;p4=1;mdelay(1000);p4=0;p5=1;mdelay(1000);p5=0;p6=1;mdelay(1000);p6=0;p7=1;mdelay(1000);p7=0;}}流水灯位左移#include "reg51.h"voidmdelay(unsigned int t){unsigned char n;for(;t>0;t--)for(n=0;n<125;n++){;}}void main(){unsigned char i;unsignedint led;while(1){led=0xfe;for(i=0;i<8;i++){P1=led;mdelay(1000);led=led<<1;led=led|0x01;}}}流水灯移位函数#include "reg51.h"#include "intrins.h"voidmdelay(unsigned int t){unsigned char n;for(;t>0;t--)for(n=0;n<125;n++){;}}void main(){unsigned char led;led=0x01;while(1){P1=led;led=_crol_(led,1);mdelay(1000);}}流水灯数组#include "reg51.h"unsigned char table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; voidmdelay(unsigned int t){unsigned char n;for(;t>0;t--)for(n=0;n<125;n++){;}}void main(){unsigned char i;while(1){for(i=0;i<8;i++){P1=table[i];mdelay(1000);}}}流水灯精确定时器#include "reg51.h"#include "intrins.h"unsignedint count=0,led;void main(){P1=0x00;led=0x01;EA=1;ET0=1;TMOD=0x01;TH0=0x3c;TL0=0xb0;TR0=1;for(;;){;}}voidbiao() interrupt 1{count++;if(count==20){count=0;P1=led;led=_crol_(led,1);}TH0=0x3c;TL0=0xb0;}。
摘要随着科技和经济的快速发展,人们对生活质量和生活环境的要求不断的提高,多彩多样的彩灯成了现今装饰和美化的时尚和潮流。
千姿万态的流水灯能给人一种视觉冲击。
拟采用单片机AT89C51去实现这种千变万化的流水灯。
单片机技术是一种传统和典型的技术,具有智能化、体积小、集成度高和价格低廉等许多独特的优点。
而且单片机明显优越于其他电子电路,其硬件电路和软件方面都不是特别复杂。
本设计将所学的单片机的理论和动手实践结合起来,主要利用AT89C51单片机设计并制作一个音乐流水灯。
首先设计一个稳定的直流电源电路,然后设计一个复位电路,为单片机的正常工作提供条件,然后再设计时钟电路和声音驱动电路,可以使单片机能够更好的控制与编译音乐部分,另外还设计一个通信电路以方便单片机和PC机的连接与通信,最后还需要设计按键电路用来控制音乐流水灯。
为了使蜂鸣器能够正常的发生还需设计一个音频电路。
硬件电路设计后要将各模块连接起来进行仿真和调试。
软件设计部分则需要将各电路模块进行编译,并设计音乐频率程序、流水灯程序和按键程序,同时将其进行仿真调试和组合调试。
以实现在播放音乐时LED 灯有千变万化的效果,以满足对视觉上的享受。
关键词:单片机;音乐;流水灯;仿真;ABSTRACTWith the science and technology and the economy the rapid development, people pairs quality of life and living environment the requirements of continuously improve, colorful and diverse of the lantern became a nowadays decorative and beautify's fashion and trend. Zi million-state of flowing water lamp can give a person one kinds visual impact. Intends to adopt AT89C51 microcontroller to go achieve such kaleidoscopic of flowing water lights. MCU technology is a kind of tradition and typical technical, with intelligent, the volume is small, high integration and price inexpensive and so on many unique advantages. Moreover single-chip obviously superior to other electronic circuit, its hardware circuits and software aspects of are not particularly complicated.The single-chip design will combine theory and practice, the main use AT89C51 single-chip design of a musical water lights. First, design a stable DC power supply circuit, and then design a reset circuit for the microcontroller to provide normal working conditions, and then design a clock circuit and sound driver circuit, will enable MCU to better control and compile music part, in addition to design a to facilitate communication circuit chip and PC connectivity and communication, and finally also need to design the circuit to control the music keys light water. In order to make the buzzer to normal design an audio circuit needs to happen. After the hardware circuit design to connect the modules for simulation and debugging. Software design will need to be compiled each circuit module, and the design frequency of the music program, water lights and key procedures, and its combination of simulation debugging and debugging. When playing music in order to achieve a kaleidoscopic effect LED lights to meet the visual enjoyment.Key words:MCU; Music; Light water;Simulation目录摘要 (I)ABSTRACT (II)目录 (1)1. 绪论 (1)1.1 单片机的概念 (1)1.2 单片的历史、发展和应用 (4)2. 总体设计 (6)2.1 设计要求 (6)2.2 设计方案选择 (6)2.3 整体设计思路 (6)3. 系统硬件设计与部分电路说明 (8)3.1 硬件设计框图 (8)3.2 部分电路说明 (8)3.2.1 电源及启动电路 (8)3.2.2 复位电路 (9)3.2.3 时钟电路 (10)3.2.4 通信电路 (10)3.2.5 键盘电路 (11)3.2.6 流水灯电路 (11)3.2.7 音频电路 (12)3.3 电路原理图及说明 (12)4. 系统软件电路设计与分析 (13)4.1 音乐程序设计 (13)4.1.1 音乐程序流程图 (14)4.2 流水灯设计 (16)4.2.1 流水灯程序流程图 (16)4.2.2 流水灯程序 (16)4.3 音乐流水灯程序 (16)4.3.1 音乐流水灯程序流程图 (16)4.3.2 音乐流水灯程序 (17)5. 系统调试与仿真 (19)5.1 硬件调试 (19)5.2 软件调试 (19)5.3 软件仿真 (19)总结 (22)致谢 (23)参考文献 (24)附录一 (25)附录二 (26)附录三 (31)附录四 (32)1. 绪论1.1 单片机的概念单片机是在一块芯片上超大规模集成技术集中了中央处理单元(CPU)、随机存储器(RAM)、只读存储器(ROM)、特殊功能寄存器(SFR)和各种输入/输出(I/O)接口(定时/计数器、中断系统接口、并行和串行I/O接口以及A/D转换接口等)的微型计算机,又称微控制器。
;----- 主程序开始-----START:CLR 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;程序结束。
流水灯C语言程序流水灯是一种常见的电子显示效果,通常用于展示灯光的流动效果。
在C语言中,我们可以通过控制单片机的IO口来实现流水灯的效果。
以下是一个标准格式的C语言程序,用于实现流水灯效果。
```c#include <stdio.h>#include <stdlib.h>#include <unistd.h>#define LED_COUNT 8 // 流水灯的数量#define DELAY_MS 500 // 每一个灯亮起的延迟时间(毫秒)int main() {int leds[LED_COUNT] = {0}; // 存储每一个灯的状态,0表示灭,1表示亮 int i, j;while (1) {// 灯往右挪移for (i = LED_COUNT - 1; i > 0; i--) {leds[i] = leds[i - 1];}leds[0] = 1;// 输出灯的状态for (i = 0; i < LED_COUNT; i++) {if (leds[i]) {printf("*"); // 亮的灯用*表示} else {printf(" "); // 灭的灯用空格表示}}printf("\n");// 延迟一段时间usleep(DELAY_MS * 1000);// 清空屏幕system("clear");}return 0;}```上述程序使用了C语言的基本语法和系统函数,实现了一个简单的流水灯效果。
程序中的`LED_COUNT`表示流水灯的数量,可以根据实际需求进行调整。
`DELAY_MS`表示每一个灯亮起的延迟时间,单位为毫秒。
在程序的主循环中,通过不断改变灯的状态和输出屏幕,实现了流水灯的效果。
首先,灯往右挪移,即将前一个灯的状态赋值给后一个灯,最后一个灯的状态设置为亮。
单片机控制流水灯程序汇编语言随着科技的发展和微电子技术的迅猛进步,单片机逐渐成为智能系统与设备中不可或缺的组成部分。
而流水灯作为最基础的应用之一,不仅在学习过程中具有重要意义,同时也在实际工程中发挥着重要作用。
本文将介绍如何使用汇编语言编写单片机控制流水灯程序,并详细讲解其运行原理和实现方法。
一、流水灯原理流水灯是一种由多个LED组成的灯条或灯链,在按照一定次序依次点亮和熄灭的灯光效果。
其原理基于单片机通过控制输出口的电平高低来控制LED的亮灭状态,实现灯光的变化和移动效果。
二、程序设计方法1. 初始化设置在编写流水灯程序之前,我们首先要了解单片机的相应接口和寄存器的使用方法。
在程序开始时,需要进行相应的初始化设置,包括将数据方向寄存器和端口寄存器设置为输出,并将初始值赋予输出口电平。
例如,对于51单片机,可以使用以下汇编语言代码进行初始化设置:MOV P1, #00H ;将P1端口的输出电平置为低电平MOV P1M1, #FFH ;将P1端口的数据方向设置为输出MOV P1M0, #00H2. 主程序在流水灯程序中,需要编写主程序来实现流水灯的效果。
主程序中使用循环结构控制LED的亮灭状态和移动效果。
例如,以下是一个简单的汇编语言代码,实现了由4个LED组成的流水灯的效果:MOV R0, #F0H ;初始亮灭状态MOV R1, #00H ;初始LED位置LOOP: ;循环MOV P1, R0 ;将亮灭状态赋予P1端口的输出电平ACALL DELAY ;延时,形成流水灯效果MOV A, R1SUBB A, #01H ;将LED位置减一MOV R1, AJZ CHANGE ;当LED位置为零时,改变亮灭状态MOV R0, R0SJMP LOOP ;继续循环CHANGE: ;改变亮灭状态CPL R0 ;对亮灭状态进行取反操作SJMP LOOP ;继续循环3. 延时函数为了实现流水灯的移动效果,需要设置一个合适的延时时间来控制LED的亮灭速度。
#include <reg52.h>sbit speaker = P1^6;sbit key1=P1^5;sbit key2=P1^7;unsigned char kk=0;unsigned long t3;unsigned char timer0h, timer0l, time,n;code char led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x00,0x55,0xaa,0x00,0x55,0xaa,0x7f,0xbf,0xdf,0 xef,0xf7,0xfb,0xfd,0xfe,0x7e,0x3c,0x18,0x00,0x18,0x3c,0x7e,0x00,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x00,0x55,0 xaa,0x00,0x55,0xaa,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7e,0x3c,0x18,0x00,0x18,0x3c,0x7e,0x00,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x00,0x55,0 xaa,0x00,0x55,0xaa,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7e,0x3c,0x18,0x00,0x18,0x3c,0x7e,0x00,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x00,0x55,0 xaa,0x00,0x55,0xaa,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7e,0x3c,0x18,0x00,0x18,0x3c,0x7e,0x00,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x00,0x55,0 xaa,0x00,0x55,0xaa,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7e,0x3c,0x18,0x00,0x18,0x3c,0x7e,0x00}; //灯亮数组//--------------------------------------//单片机晶振采用11.0592MHz// 频率-半周期数据表高八位本软件共保存了四个八度地28个频率数据code unsigned char FREQH[] = {0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音12345670xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音2345670xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音1234567// 频率-半周期数据表低八位code unsigned char FREQL[] = {0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音12345670x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音2345670x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音1234567//--------------------------------------//世上只有妈妈好数据表要想演奏不同地乐曲, 只需要修改这个数据表code int shengrikuaile[] = {5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4, //生日快乐5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2,4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4,0,0,0};code int tonghua[]={5,1,2, 5,2,2, 4,2,2,3,2,4, 3,2,2, 4,2,1, 3,2,1, 3,2,4, 3,2,2, 4,2,2,3,2,2, 4,2,2, 3,2,2, 2,2,1, 1,2,1, 1,2,2, 1,2,2, 3,2,2, 5,2,2,6,2,4, 6,2,2, 6,2,1, 5,2,1, 5,2,2, 2,2,2, 2,2,2, 4,2,2,3,2,8, 1,2,2, 3,2,2, 5,2,2,6,2,4, 6,2,2, 6,2,1, 5,2,1, 2,2,2, 2,2,2, 4,2,2,3,2,2, 4,2,2, 3,2,2, 2,2,1, 1,2,1, 1,2,4, 2,2,2, 3,2,2,6,1,4, 6,1,2, 1,2,2, 1,2,2, 7,1,2, 7,1,2, 1,2,1, 1,2,16, 0,0,0};//童话//一个音符有三个数字.前为第几个音、中为第几个八度、后为时长(以半拍为单位).//6, 2, 3 分别代表:6, 中音, 3个半拍;//5, 2, 1 分别代表:5, 中音, 1个半拍;//3, 2, 2 分别代表:3, 中音, 2个半拍;//5, 2, 2 分别代表:5, 中音, 2个半拍;//1, 3, 2 分别代表:1, 高音, 2个半拍;code unsigned int nuannuan []={5,2,2, 6,2,2, 7,2,2, 1,3,2, 7,2,1, 1,3,1, 1,3,1, 5,2,1, 6,2,2, 6,2,4, 5,2,2, 4,2,1, 3,2,1,3,2,2, 3,2,2, 3,2,2, 3,2,1, 2,2,1, 2,2,2, 5,2,2, 6,2,2, 7,2,2, 1,3,2, 7,2,1, 1,3,1, 1,3,1, 5,2,1, 6,2,2, 6,2,4, 6,2,2, 1,3,1, 1,3,1,1,3,2, 1,3,2, 1,3,2, 1,3,1, 2,3,1, 2,2,2, 5,2,1, 6,2,2, 7,2,2, 1,3,2, 7,2,1, 1,3,1, 1,3,1, 3,3,2, 6,3,2, 5,3,1, 5,3,2, 4,3,2,3,3,4, 3,3,2, 2,3,2, 2,3,2, 6,2,2, 7,2,2, 1,3,4, 1,3,2, 2,3,1, 1,3,1, 1,3,2, 1,3,1, 7,2,1, 1,3,2, 2,2,1,2,3,4, 1,3,2, 7,2,2, 1,3,8,//平凡之路0,0,0};code unsigned int zanmenjiehunba[]={2,2,4, 1,2,4, 6,2,8, 6,2,2, 5,2,2, 3,2,2, 3,2,2, 3,2,2, 2,2,2, 2,2,4, 1,2,2, 2,2,2, 5,2,2,5,2,2, 5,2,2, 5,2,2, 5,2,2, 5,2,4, 2,2,2, 3,2,2,2,2,4, 1,2,4, 6,2,8, 6,2,2, 5,2,2, 3,2,2, 3,2,2, 3,2,2, 2,2,2, 2,2,4, 6,1,2, 1,2,2,2,2,2, 1,2,2, 2,2,2, 1,2,2, 2,2,4, 5,2,2, 3,2,2,2,2,4, 3,2,4, 6,2,8, 6,2,2, 5,2,2, 3,2,2, 5,2,2, 5,2,2, 5,2,2, 5,2,4, 2,2,2, 2,2,2, 5,2,2,5,2,2, 5,2,2, 5,2,2, 5,2,2, 5,2,4, 2,2,2, 3,2,2, 3,2,8, 6,1,2, 1,2,2, 3,2,4, 2,2,4, 1,2,4, 2,2,2, 3,2,2, 3,2,2, 2,2,2, 2,2,8, 3,2,2, 2,2,4, 1,2,4, 2,2,4, 3,2,2, 6,1,2, 6,1,8,0,0,0}; //咱们结婚吧code unsigned int haojiubujian[]={6,2,2, 5,2,2, 5,2,2, 3,2,2, 5,2,8, 6,2,2, 5,2,2, 3,2,2, 2,2,1, 1,2,1, 1,2,8,6,1,2, 1,2,2, 2,2,2, 3,2,2, 5,2,8, 3,2,2, 2,2,2, 1,2,2, 3,2,1, 2,2,1, 2,2,8,6,2,2, 5,2,2, 5,2,2, 3,2,2, 5,2,8, 6,2,2, 5,2,2, 3,2,2, 2,2,1, 1,2,1, 1,2,8,6,1,2, 1,2,2, 2,2,2, 3,2,2, 5,2,8, 3,2,2, 2,2,2, 1,2,2, 6,1,2, 1,2,2, 2,2,2, 1,2,2, 1,2,2,0,0,0};//你若成风code unsigned int tianshidechibang[]={3,2,2, 5,2,2, 6,2,2, 5,2,1, 6,2,1, 6,2,2, 3,2,1, 2,2,1, 2,2,8,5,2,2, 3,2,1, 5,2,1, 5,2,2, 1,2,1, 2,2,1, 1,2,8,3,2,2, 2,2,1, 3,2,1, 3,2,2, 6,1,2, 2,2,2, 1,2,1, 2,2,1, 2,2,1, 5,2,2, 3,2,1,3,2,2, 3,2,2, 3,2,8, 3,2,2, 5,2,2,6,2,2, 5,2,1, 6,2,1, 6,2,2, 3,2,1, 2,2,1, 2,2,8,5,2,2, 3,2,1, 5,2,1, 5,2,2, 2,2,1, 1,2,1, 1,2,4, 6,1,2, 1,2,2,3,2,2, 2,2,1, 3,2,1, 3,2,2, 6,1,2, 2,2,2, 1,2,1, 2,2,1, 2,2,2, 7,1,1, 6,1,1,6,1,2, 6,1,2, 6,1,8,0,0,0}; //天使地翅膀code unsigned int zuijinhaoma[]={5,1,2, 6,1,2, 1,2,2, 2,2,2, 3,2,2, 1,2,2, 3,2,2, 2,2,12,2,2,2, 2,2,2, 2,2,2, 2,2,2, 1,2,2, 1,2,2, 6,1,2, 6,1,2, 6,1,4,5,1,2, 6,1,2, 1,2,2, 2,2,2, 3,2,2, 5,2,2, 3,2,2, 2,2,12,2,2,2, 2,2,2, 2,2,2, 2,2,2, 1,2,2, 1,2,2, 6,1,2, 3,2,2, 3,2,2, 3,2,8,6,2,2, 6,2,2, 6,2,2, 6,2,2, 5,2,2, 5,2,2, 3,2,2, 2,2,12,2,2,2, 2,2,2, 2,2,2, 2,2,2, 1,2,2, 1,2,2, 5,2,2, 3,2,12,6,2,2, 6,2,2, 6,2,2, 1,3,2, 3,2,2, 2,2,2, 3,2,2, 2,2,12,2,2,2, 2,2,2, 2,2,2, 2,2,2, 1,2,2, 6,1,2, 1,2,2, 1,2,2, 1,2,2, 1,2,8, //滴答0,0,0};code unsigned int shinian []={1,2,1, 2,2,1, 5,2,1, 3,2,1,3,2,2, 3,2,1, 3,2,1, 4,2,1, 5,2,1, 6,2,1, 2,2,2, 2,2,2, 2,2,1, 4,2,1, 3,2,1, 2,2,1,1,2,2, 3,1,1, 3,1,1, 2,2,1, 1,2,1, 7,1,1,1,2,1, 6,1,1, 6,1,2, 1,2,1, 7,1,1, 6,1,1, 7,1,2, 4,2,1, 3,2,1, 2,2,2, 7,1,1, 1,2,1,1,2,4, 1,2,1, 2,2,1, 3,2,1,6,2,2, 3,2,1, 4,2,2, 5,2,1, 3,2,1, 3,2,2, 2,2,2, 1,2,1, 2,2,1, 5,2,1, 3,2,1,3,2,2, 3,2,1, 3,2,1, 4,2,1, 5,2,1, 6,2,1,2,2,2, 2,2,1, 2,2,1, 4,2,1, 3,2,1, 2,2,1,1,2,2, 3,1,1, 3,1,1, 2,2,1, 1,2,1, 7,1,1, 1,2,1, 6,1,1, 6,1,1, 1,2,1, 7,1,1, 6,1,1,7,1,2, 4,2,1, 3,2,1, 2,2,2, 3,2,1, 2,2,1,0,0,0 //十年};//-------------------------------------- ,void t0int() interrupt 1 //T0中断程序,控制发音地音调{TR0 = 0; //先关闭T0speaker = !speaker; //输出方波, 发音TH0 = timer0h; //下次地中断时间, 这个时间, 控制音调高低TL0 = timer0l;TR0 = 1; //启动T0}//--------------------------------------void delay(unsigned char t) //延时程序,控制发音地时间长度{unsigned char t1;unsigned long t2;if(kk==1){t3=6000;}if(kk==2){t3=6000;}if(kk==3){t3=5000;}if(kk==4){t3=3000;}if(kk==5){t3=6000;}if(kk==6){t3=4000;}if(kk==7){t3=6000;}if(kk==8){t3=5000;}for(t1 = 0; t1 < t; t1++) //双重循环, 共延时t个半拍for(t2 = 0; t2 < t3; t2++); //延时期间, 可进入T0中断去发音TR0 = 0; //关闭T0, 停止发音}//--------------------------------------void song() //演奏一个音符{TH0 = timer0h; //控制音调TL0 = timer0l;TR0 = 1; //启动T0, 由T0输出方波去发音delay(time); //控制时间长度}void delaytime (){unsigned char e,f;for(e=0;e<100;e++)for(f=0;f<30;f++);}//--------------------------------------void main(void){unsigned char k, i;TMOD = 1; //置T0定时工作方式1ET0 = 1; //开T0中断EA = 1; //开CPU中断while(1) {i = 0;time = 1;P0=P2=P3=0x0;while(time){if (key1==0){delaytime();while(!key1);kk=kk+1;}if (key2==0){delaytime();while(!key2);kk=kk-1;}if(kk==1){k = shengrikuaile[i] + 7 * shengrikuaile[i + 1] - 1; //第i个是音符, 第i+1个是第几个八度if(n==8){n=0;}{P0=P3=P2=led[n]; } //控制灯亮timer0h = FREQH[k]; //从数据表中读出频率数值timer0l = FREQL[k];n=n+1; //实际上, 是定时地时间长度time = shengrikuaile[i + 2]; //读出时间长度数值i += 3;song();}if(kk==2){k = tonghua[i] + 7 * tonghua[i + 1] - 1; //第i个是音符, 第i+1个是第几个八度if(n==8){n=0;}{P0=P3=P2=led[n]; } //控制灯亮timer0h = FREQH[k]; //从数据表中读出频率数值timer0l = FREQL[k];n=n+1; //实际上, 是定时地时间长度time = tonghua[i + 2]; //读出时间长度数值i += 3;song();}if(kk==3){k = nuannuan[i] + 7 * nuannuan[i + 1] - 1; //第i个是音符, 第i+1个是第几个八度if(n==8){n=0;}{P0=P3=P2=led[n]; } //控制灯亮timer0h = FREQH[k]; //从数据表中读出频率数值timer0l = FREQL[k];n=n+1; //实际上, 是定时地时间长度time = nuannuan[i + 2]; //读出时间长度数值i += 3;song();}if(kk==4){k = zanmenjiehunba[i] + 7 * zanmenjiehunba[i + 1] - 1; //第i个是音符, 第i+1个是第几个八度if(n==8){n=0;}{P0=P3=P2=led[n]; } //控制灯亮timer0h = FREQH[k]; //从数据表中读出频率数值timer0l = FREQL[k];n=n+1; //实际上, 是定时地时间长度time = zanmenjiehunba[i + 2]; //读出时间长度数值i += 3;song();}if(kk==5){k = haojiubujian[i] + 7 * haojiubujian[i + 1] - 1; //第i个是音符, 第i+1个是第几个八度if(n==8){n=0;}{P0=P3=P2=led[n]; } //控制灯亮timer0h = FREQH[k]; //从数据表中读出频率数值timer0l = FREQL[k];n=n+1; //实际上, 是定时地时间长度time = haojiubujian[i + 2]; //读出时间长度数值i += 3;song();}if(kk==6){k = tianshidechibang[i] + 7 * tianshidechibang[i + 1] - 1; //第i个是音符, 第i+1个是第几个八度if(n==8){n=0;}{P0=P3=P2=led[n]; } //控制灯亮timer0h = FREQH[k]; //从数据表中读出频率数值timer0l = FREQL[k];n=n+1; //实际上, 是定时地时间长度time = tianshidechibang[i + 2]; //读出时间长度数值i += 3;song();}if(kk==7){k = zuijinhaoma[i] + 7 * zuijinhaoma[i + 1] - 1; //第i个是音符, 第i+1个是第几个八度if(n==8){n=0;}{P0=P3=P2=led[n]; } //控制灯亮timer0h = FREQH[k]; //从数据表中读出频率数值timer0l = FREQL[k];n=n+1; //实际上, 是定时地时间长度time = zuijinhaoma[i + 2]; //读出时间长度数值i += 3;song();}if(kk==8){k = shinian[i] + 7 * shinian[i + 1] - 1; //第i个是音符, 第i+1个是第几个八度if(n==8){n=0;}{P0=P3=P2=led[n]; } //控制灯亮timer0h = FREQH[k]; //从数据表中读出频率数值timer0l = FREQL[k];n=n+1; //实际上, 是定时地时间长度time = shinian[i + 2]; //读出时间长度数值i += 3;song();}if(kk>8){unsigned int c;unsigned int d=40000;for(c=0;c<50;c++)while(d--)P0=P2=P3=led [n]; delaytime();delaytime();}} //发出一个音符} }版权申明本文部分内容,包括文字、图片、以及设计等在网上搜集整理.版权为个人所有This article includes some parts, including text, pictures, and design. Copyright is personal ownership.用户可将本文地内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律地规定,不得侵犯本网站及相关权利人地合法权利.除此以外,将本文任何内容或服务用于其他用途时,须征得本人及相关权利人地书面许可,并支付报酬.Users may use the contents or services of this article for personal study, research or appreciation, and othernon-commercial or non-profit purposes, but at the same time, they shall abide by the provisions of copyright law and other relevant laws, and shall not infringe upon the legitimate rights of this website and its relevant obligees. In addition, when any content or service of this article is used for other purposes, written permission and remuneration shall be obtained from the person concerned and the relevant obligee.转载或引用本文内容必须是以新闻性或资料性公共免费信息为使用目地地合理、善意引用,不得对本文内容原意进行曲解、修改,并自负版权等法律责任.Reproduction or quotation of the content of this article must be reasonable and good-faith citation for the use of news or informative public free information. It shall not misinterpret or modify the original intention of the content of this article, and shall bear legal liability such as copyright.。