采用单片机编程来实现音乐彩灯的控制1引言随着人们对房屋的装饰需要彩灯,在许多城市可以看到彩色霓虹灯。
LED彩灯由于其丰富的灯光色彩,便宜的造价以及控制简单等特点而得到了广泛的应用,用彩灯来装饰街道和城市建筑物已经成为一种时尚。
但目前市场上各式样的LED彩灯控制器大多数用全硬件电路实现,电路结构复杂、电路复杂、功率损耗大等缺点。
此外从功能效果上看,亮灯模式少而且样式单调,缺乏用户可操作性,。
本方案提出了一种基于8051单片机的彩灯控制方案,实现对LED彩灯的控制。
本方案以8051单片机作为主控核心,在主控模块上设有3个按键和8个码LED显示灯,根据需要可以编写若干种亮灯模式,利用其内部定时器T0实现一个基本单位时间为1 ms的定时中断,根据各种亮灯时间的不同需要,在不同时刻输出灯亮或灯灭的控制信号,然后驱动各种颜色的灯亮或灭。
与普通LED彩灯相比,具有体积小、价格低、低能耗等优点。
2系统功能LED彩灯用软件控制硬件的方式来是彩灯闪烁,即彩灯控制器和管内LED板模块)。
彩灯采用8051提供+5V电压工作,经过开关电源变换,输出直流工作电压,一方面为管内LED模块提供+5V工作电源,另一方面为主控模块单片机系统彩灯控制器提供5 V工作电源。
整个系统工作由软件程序控制运行,根据需要,用户可以在LED彩灯工作时通过主控模块上的按键来设定亮灯时间和灯光闪动频率。
上电后系统经过初始化,查询是否有功能切换键按下:有,则进入设定模式状态;无,则进入默认工作状态。
在设定模式状态下,可以根据个人爱好及不同场合的需要来指定调用哪些模式,并且可以改变每种模式的时间T1、频率F1参数,在工作状态下,LED彩灯控制器按照程序设定好的若干亮灯花样模式程序顺序调用往下走,开始工作,依次8个等亮完为一个亮灯周期,然后再回主循环继续工作,同样如果想进入其它设定模式状态,只需按下功能切换键即可。
整个3种亮灯模式时间可以看作一个大周期T,对于每一个模式编写一个独立工作子程序,其中设定了从左到右点亮LED,在从右到左点亮LED,还有自己定义的LED点亮方式。
因此在LED彩灯上电工作后,可以方便地通过控模块上的显示器知道LED彩灯当前工作模式,工作时间Ti,频率Fi等实时参数。
若实际应用需要根据不同场合和时间来改变彩灯闪亮效果,可以通过主控模块上的按键来设定LED不同的闪烁频率Fi和亮灯时间Ti,以便符合实际需要。
此外如果对某一种模式感兴趣需要仔细观看该种亮灯模式,可以让程序循环硬件设计LED彩灯系统包括,即LED彩灯控制器(8051主控模块)LED彩灯管在8051外部接一个震荡时钟频率。
用8051的控制模块,具有按键、显示等功能,并利用8051的P0口输出控制信号,利用P0口的8个输出端上面焊有8个LED彩灯,使得彩灯在软件的控制下工作。
主控模块电路设计主控模块电路如图1所示。
主控模块主要设计器件有80C51,8个LED显示器,3个开关按键,1个稳压器(5 V电压),1个外部晶振震荡器信号输出驱动,4个电阻。
通过软件设计,使单片机P0口作为三色LED驱动信号输出口及移位时钟CLOCK信号,8051的P0口为LED的输出口。
软件设计LED彩灯控制器最大特点在于所有亮灯模式均由软件控制完成。
系统中软件可以分为主程序和中断服务子程序。
上电后在按键控制灯的闪烁方式,通过软件来控制循环,以一个单位时间1 ms的T0定时为中断服务子程序。
在这个1 ms的T0定时基础上,可以根据需要来确定各种模式工作时间Ti,以及确定在各种亮灯内点亮和熄灭各种状态LED灯等。
整个系统软件由程序)、各个模式子程序、1 ms中断服务子程序、调用循环程序组成。
利用T0定时器作为定时基本单位,根据模式需要计算好各控制信号的发生时刻,根据移位触发的翻转时刻步调一致,使LED彩灯按照设计的模式工作。
除了T0定时中断之外,程序的大部份时间是在处理按键的查询和LED显示的延时。
3个按键分别为:K1按键.从左到右点亮LED,K2按键.从右到左点亮LED,K3按键.用户自己定义方式点亮LED。
在每次的T0定时中断服务子程序里,需要对各个时间寄存器和模式寄存器进行加1或者清,为主程序查询作准备,同时查询是否已中断1ms,若1ms到了,则对按键一次,是否有按下并进行相应子程序处理。
主程序除了调用各种子模式子程序,调用LED显示子程序和延时子程序之外,还一直保持查询是否有功能切键按下以及是否有模式改变按键按下,一旦有功能切换键和模式改变键按下,就会进入相应的按键处理。
程序流程如图2所示亮灯模式,只要控制好各色灯触发和熄灭时刻就可以组合成各种亮灯效果。
2.1原理框图扬声器功率放大电路LM386电源电路彩灯驱动显示电路复位电路时钟电路基于单片机控制的音乐彩灯的原理框图2.2电路原理图2.3工作原理根据设计要求可以把电路组成部分大致分为音乐控制部分,整个系统有三个或以上的控制开关。
控制彩灯闪烁快慢的时钟信号CLK-IN,音乐控制按钮,清零端CLRDENG等。
利用单片机89C51产生乐曲音符,再把乐普翻译成计算机音乐语言,由单片机进行信息处理,在经过信号放大,由喇叭放出乐曲声。
由于音符和节拍是由计算机产生的,所以发音音符和节拍准确。
单片机演奏乐曲的原理:通过控制定时器的定时时间来产生不同频率的方波,驱动喇叭发出不同音阶的声音,再利用延迟来控制发音时间的长短,即可控制音调中的节拍。
把乐谱中的音符和相应的节拍变换为定常数和延迟常数,作为数据表格存放在存储器中。
由程序查表得到定时常数和延迟常数,分别用以控制定时器产生方波的频率和发出该频率方波的持续时间。
当延迟时间到时,再查下一个音符的定时常数和延迟常数。
依次下去,就可以自动演奏乐曲。
工作程序流程图如下:开始T0初始化,A清零,开中断,中断计数20H单元,清零查首地址送DPTR查表取常数是结束符00H ?延时100msN是休止符FFH?YY恢复初始条件A清零延时1s后再循环N音阶常数送R6取节拍常数送R7启动T0计数P2.0取反按R6延时节拍时间到否?N停止T0计数,中断计数,20H单元清零,DPTR加1Y2.4音乐彩灯控制程序代码音乐播放源程序:(采用定时器T0,定时器方式1)ORG 000HLJMP STARTORG 000BHAJMP CONTORG 0100HSTART: MOV SP, #50HMOV TH0, #0DBHMOV TL0, #0FFHMOV TMOD, #01HMOV IE, #82HMUSIC0: MOV DPTR,#DAT ;表首地址送DPTR MOV 20H,#00H ;中断计数单元清零MUSIC1: CLR AMOVC A,@A+DPTR ;查表取音阶常数JZ END0 ;是结束符?CJNE A,#0FFH,MUSIC5 ;是休止符?LJMP MUSIC3 ;产生100MS停顿MUSIC5: NOPMOV R6,A ;音阶常数送R6INC DPTR ;DPTR+1MOV A, #0MOVC A,@A+DPTR ;取节拍常数送R7MOV R7, ASETB TR0 ;启动定时器T0MUSIC2: NOPCPL P1.0 ;输出电平取反MOV A, R6MOV R3,A ;音阶常数送R3LCALL DEL20MOV A,R7 ;节拍常数送ACJNE A,20H,MUSIC ;节拍时间到否?MOV 20H,#00H ;为下一个音阶常数做准备INC DPTRLJMP MUSIC1MUSIC3: NOP ;休止100MSCLR TR0MOV R2,#14H ;R2=20MUSIC4: NOPMOV R3,#250 ;R3=250LCALL DEL20DJNZ R2, MUSIC4INC DPTR ;为取下一个音阶常数准备LJMP MUSIC1END0: MOV R2,#200 ;歌曲结束,延时1秒后继续MUSIC6:MOV R3, #250LCALL DEL20DJNZ R2, MUSIC6LJMP MUSIC0DEL: MOV R4, #05HDEL4: NOPDJNZ R4, DEL4DJNZ R3, DELRETCONT: INC 20H ;计数单元内容加1MOV TH0,#0DBH ;重新送100MS定时初值MOV TL0, #0FFHRETIDAT: DB 18H,30H,1CH,10H,20H,40H,1CH,10H ;《八月桂花遍地开》的谱表DB 18H,10H,20H,10H,1CH,10H,18H,40HDB 1CH,20H,20H,20H,1CH,20H,18H,20HDB 20H,80H,0FFH,20H,30H,1CH,10H,18HDB 20H,15H,20H,1CH,20H,20H,20H,26HDB 40H,20H,20H,2BH,20H,26H,20H,20HDB 20H,30H,80H,0FFH,20H,20H,1CH,10HDB 18H,10H,20H,20H,26H,20H,2BH,20HDB 30H,20H,2BH,40H,20H,20H,1CH,10HDB 18H,10H,20H,20H,26H,20H ,2BH,20HDB 30H,20H,2BH,40H,20H,30H,1CH,10HDB 18H,20H,15H,20H,1CH,20H,20H,20HDB 26H,40H,20H,20H,2BH,20H,26H,20HDB 20H,20H,30H,80H,20H,30H,1CH,10HDB 20H,10H,1CH,10H,20H,20H,26H,20HDB 2BH,20H,30H,20H,2BH,40H,20H,15HDB 1FH,05H,20H,10H,1CH,10H,20H,20H DB 26H,20H,2BH,20H,30H,20H,2BH,40H, DB 20H,30H,1CH,10H,18H,20H,15H,20H DB 1CH,20H,20H,20H,26H,40H,20H,20H DB 2BH,20H,26H,20H,20H,20H,30H,30H DB 20H,30H,1CH,10H,18H,40H,1CH,20H DB 20H,20H,26H,40H,13H,60H,18H,20H DB 15H,40H,13H,40H,18H,80H,00HEND时钟控制部分源程序:ORG 00HJMP STARTORG 0BHJMP TIM0START:MOV 28H, #00MOV 2AH, #12HMOV 2BH, #00MOV 2CH, #00MOV TMOD, #00000001BHMOV TH0, #> (65536-4000)MOV TL0, #< (65536-4000)MOV IE, #10000010BHMOV R4, #250SETB TR0LOOP: JB P0.0, N2CALL DELAYMOV A, 2CHADD A, #01HDA AMOV 2CH, ACJNE A, #60H, N1MOV 2CH, #00HN1: JNB P0.0, $CALL DELAYN2: JB P0.1, N4CALL DELAYMOV A, 2BHADD A, #01HDA AMOV 2BH, ACJNE A, #60H, N3MOV 2BH, #00H N3: JNB P0.1, $CALL DELAYN4: JB P0.2, LOOPCALL DELAYMOV A, 2AHADD A, #01HDA AMOV 2AH, ACJNE A, #24H, N5MOV 2AH, #00N5: JNB P0.2, $CAL DELAYJMP LOOPTIM0: MOV TH0, #> (65536-4000) MOV TL0,#<(65536-4000)PUSH APUSH PSWDJNZ R4, X2MOV R4, #250CALL CLOCKCALL DISPX2: CALL SCANPOP PSWPOP ARETISCAN: MOV R0, #28HINC @R0CJNE@R0,#6,X3MOV@R0,#0X3: MOV A,@R0ADD A, #20HMOV R1, AMOV A,@R0SWAP AORL A,@R1MOV P1, ARETCLOCK:MOV A, 2CHADD A, #1DA AMOV 2CH, ACJNE A, #60H, X4MOV 2CH, #00MOV A, 2BHADD A, #1DA AMOV 2BH, ACJNE A, #60H, X4MOV 2BH, #00MOV A, 2AHADD A, #1DA AMOV 2AH, ACJNE A, #24H, X4X4: RET DISP: MOV R1, #20HMOV A, 2CHMOV B, #10HDIV ABMOV @R1, BINC R1MOV @R1, AINC R1MOV A, 2BHMOV B, #10HDIV ABMOV @R1, BINC R1MOV @R1, AINC R1MOV A, 2AHMOV B, #10HDIV ABMOV @R1, BINC R1MOV @R1, ARETD1: MOV R7, #248DJNZ R7, $DJNZ R6, D1RET END2.5硬件系统设计单片机选择AT89C51,由于AT89C51是一个低电压,高性能CMOS8位单片机,内含4k bytes的可反复擦鞋的制度程序存储器(PEROM)和128bytes的随机存取数据存储器(RAM),器件采用ATMEL 公司的高密度、非易失性存储技术生产,兼容标准MCS—51指令系统,片内置通用8位中央处理器和Flash 存储单元,内置功能强大的微型计算机AT89C51提供了高性价比的解决方案。