基于单片机音乐彩灯电子控制器设计

物理与电子工程学院

《单片机》 课程设计报告书

设计题目: 基于单片机音乐彩灯电子控制器设计

专 业: 自动化 班 级: 14接本 学生姓名: 李智瑶 学 号: [1**********] 指导教师: 王承林

2014年 11 月16 日

物理与电子工程学院课程设计任务书

专业: 自动化 班级: 2014接本

摘 要

随着人们生活环境的不断改善和美化,在许多场合可以看到彩色霓虹灯。LED 彩灯由于其丰富的灯光色彩,低廉的造价以及控制简单等特点而得到了广泛的应用。本篇设计为基于单片机的音乐彩灯控制器,它是指彩灯能随着音乐信号地变化而变化的一种控制电路。本文详细论述了音乐彩灯控制器的硬件原理电路,包括振荡、时钟、复位等模块电路。以及如何在硬件电路的基础上通过单片机进行软件编程最终实现音乐彩灯的同步控制。

关键词:音乐;彩灯;同步控制

目 录

1 引言 .......................................................................................................................................... 4 2.1 设计任务与要求 ................................................................................................................... 5 2.2 方案的论证和选取 ............................................................................................................... 5 3 硬件电路的设计 ...................................................................................................................... 7 3.1 单片机系统设计框图 ........................................................................................................... 7 3.2 单片机外围电路 ................................................................................................................... 8 3.3 时钟电路 ............................................................................................................................... 9 3.5 按键电路 ............................................................................................................................. 11 3.6 ISP下载口电路 ................................................................................................................... 11 3.7LED 彩灯显示电路 .............................................................................................................. 12 3.8 12864液晶电路 ................................................................................................................... 12 3.9 音乐播放电路 ..................................................................................................................... 14 3.10 直流稳压电源电路 ........................................................................................................... 15 4 系统软件设计 ........................................................................................................................ 16 4.1 单片机系统设计主程序流程图 ......................................................................................... 16 4.2 音乐产生程序 ..................................................................................................................... 20 4.3 定时器子程序设计序 ......................................................................................................... 21 4.4 液晶显示子程序 ................................................................................................................. 29 参考文献 .................................................................................................................................... 32

1 引言

目前,基于彩灯控制器的设计的方法很多,有利用单片机控制的、有利用传感器控制的,还有利用EDA 控制的等等。在简化设计步骤和节约实验器材的情况下,为了简化硬件电路,也可采用PLC S7-20CN控制的,虽然硬件电路比较简便,但是实验程序更复杂,实验步奏更繁琐;对于编写程序是个比较困难的问题。通常采用单片机控制的方法,即利用单片机的端口来控制彩灯以及音乐播放,在程序编写上更容易编写,程序的可编译性更强。

本设计利用AT89S52单片机来实现基于单片机的音乐彩灯控制的设计。用一恒流源供电,当按下“开始”按键时单片机开始输出,彩灯开始闪烁和音乐播放开始同步播放;当按下“停止”按钮时音乐播放停止,彩灯停止闪烁,LCD 显示停止。当再次按下“开始”按钮时彩灯开始闪烁和音乐播放开始同步播放。单片机系统通过对采用数据进行扫描,控制D/A转换器转换,并根据按键控制端口输出。此方案思路清楚,电路简单,便于操作[1]。

2 设计方案的比较与选择

2.1 设计任务与要求

要求将音乐分成四个不同的频段,将彩灯分为四组,各组彩灯颜色不同,每组彩灯包含两个颜色相同的彩灯。

(1) 实现音乐彩灯同步控制;

(2) 当音乐处于高频段2000~4000Hz时第一组彩灯根据音乐节拍长短不同决定灯亮的个数;

(3) 当音乐处于中频段500~1200Hz时第二组彩灯根据音乐节拍长短不同决定灯亮的个数;

(4) 当音乐处于低频段50~250Hz时第三组彩灯根据音乐节拍长短不同决定灯亮的个数;

(5) 当音乐在这些频段之外,要求所有彩灯按照1Hz 频率节奏性的闪烁;

2.2 方案的论证和选取

方案一: 基于单片机的音乐彩灯控制器的设计,是利用单片机编程产生频率分为1.2MHz~12MHz的方波,根据实际情况,本设计采用12MHz 作为系统的外部晶振,电容值取30pF 。经过发射驱动电路放大,使LED 灯闪烁,同时音乐同步播放并通过12864液晶屏显示频率[2]。其系统框图如图1所示。

图1 基于单片机的音乐彩灯控制器的设计的系统框图

这种以单片机为核心的基于单片机的音乐彩灯控制器的设计;利用振荡电路产生12MHz 的时钟信号,在通过单片机输出,单片机系统通过对采用数据进行扫描,控制D/A转换器转换,并根据按键控制端口输出,此方案思路清楚。

利用单片机、按键控制音乐彩灯,控制灵敏度高,而且单片机控制方便,操作简单。许多音乐彩灯控制器的设计都采用这种设计方法。

方案二:这种测距系统采用CPLD(Complex Programmable Logic Device) 器件,运用VHDL 编写程序,使用MAX+plusII软件进行软硬件设计的仿真和调试,最终实现测距功能。

CPLD 器件内部的宏单元是其最基本的模块,能独立地编程为D 触发器、T 触发器、RS 触发器或JK 触发器工作方式或组合逻辑工作方式。它的这种特性非常适用于本系统。可将本系统所需要的分频功能、计数功能、振荡器、七段码显示全部由MAX 来实现,而只需在外部配上适当的超声波传感器、接收和发送电路,即可组成一个性能稳定、响应速度快且具有显示功能的彩灯控制器。

本设计首先进行系统模块的划分,规定每一个模块的功能以及各模块之间的借口,最终将设计分为三大模块:四分频器,四选一控制器,8样彩灯控制器。本设计充分利用VHDL “自顶向下”的设计优点以及层次化的设计概念,从简单的单元入手,逐渐构成复杂的系统。配合使用MAX+plusII开发软件,可集设计输入、设计处理、设计校验和器件编程于一体,集成度高,开发周期短。其系统框图如图2所示。

图2 基于CPLD 的音乐彩灯控制器系统框图

综合考虑前两种方案,方案一操作方便,控制性更好,功耗低,模块简单,稳定性高,成本低的特点,方案二具有灵敏度高,但结构复杂、功耗比较和高控制不简便的缺点。综合各自的优劣点我们选择方案一。

3 硬件电路的设计 3.1 单片机系统设计框图

本文所设计的基于单片机的音乐彩灯控制器的设计主要由AT89S52单片机、时钟电路、复位电路、按键控制电路、下载口电路、喇叭声音电路、显示电路、直流稳压电源等硬件电路部分以及相应的软件部分构成。首先由单片机驱动产生12MHz 晶振,在单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。由单片机驱动后把结果输出到LED 彩灯、小喇叭和12864液晶屏上。由编程可以实现音符频率表、音名以及半音频率表的确定和分配。可以将声音分为高音(2KHz~4KHz)、中音(500Hz~1.2KHz)以及低音(50Hz~250Hz)三等,故可以分配彩灯在不同的频率段实现闪烁;同时当在划定频率外时实现彩灯以1Hz 的频率节奏闪烁;从而可以满足设计的要求,达到设计的标准[3]。

根据要求并综合以上各方面因素,采用AT89S52单片机作为主控制器,采用按键来控制音乐以及彩灯的开始、暂停和停止。基于单片机的音乐彩灯控制器的单片机最小系统如下图3所示:

V CC

图3 基于单片机的彩灯控制器的设计的设计框图

3.2 单片机外围电路

当使用单片机的内部时钟电路时,单片机的XATL1和XATL2用来接石英晶体和微调电容,晶体一般可以选择1.2MHz~12MHz,电容选择30pF 左右。我们选择晶振为12MHz, 电容30pF 。在系统上电的瞬间,RST 与电源电压同电位,随着电容的电压逐渐上升,RST 电位下降,于是在RST 形成一个正脉冲。只要该脉冲足够宽就可以实现复位,即て=RC≥20ms。一般取R≥1KΩ,C≥22uF。当人按下按钮S1时,使电容C5通过R1迅速放电,待S1弹起后,C 再次充电,实现手动复位。R1一般取10KΩ。我们通过P2.0来启动控制,程序中通过查询P2.0的电平来检测是否按键被按下,当按下按键时P2.0为低电平,单片机通过查询到低电平开始音乐输出和彩灯,当松开按键,P2.0即为高电平,在软件中通过软件延时来消除按键的机械抖动。

物理与电子工程学院2014级本科课程设计

7

内部时钟方式,如图4所示:

3.3 时钟电路

图4 单片机外围电路

硬件电路的不同,单片机的时钟连接方式可分为内部时钟方式和外部时钟方式。我们采用

端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。根据

(1) 在单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出

12M

图5 晶振电路

(2) 在内部方式时钟电路中,必须在XTAL1和XTAL2引脚两端跨接石英晶体振荡器和两个微调电容构成振荡电路,C6和C7取31pF 左右,晶振的频率取值1.2MHz~12MHz。根据实际情况,本设计采用12MHz 作为系统的外部晶振,电容值取30pF [4]。

3.4 复位电路

我们在用按键控制时,为了避免单片机程序错误而导致的错误输出,从而加入复位电路,对任意的情况都能够通过复位按键使电路复位。单片机复位是使CPU 和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作。无论是单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。所以,必须弄清楚单片机复位的条件、复位电路和复位后的状态。单片机复位的条件是,必须使RST 引脚(9脚)加上持续两个机器周期(即24个振荡周期)的高电平。例如,若时钟频率为12MHz, 每机器周期为1us ,则只需2us 以上时间的高电平。在RST 引脚出现高电平后的第二个周期执行复位。单片机常见的复位电路有上电复位电路和按键复位电路。为了方便系统的硬件初始化,我们采用按键复位电路。如图6所示:

V CC

图6 复位电路

3.5 按键电路

由于要达到设计要求,同时也为了提高设计的课操作性;选用按键来控制输入从而可以手动的对音乐彩灯进行控制。按键S2与单片机P2.0端口连接是“开始”按键;按键S3与单片机P2.1端口连接是“暂停”按键;按键S3与单片机P2.2端口连接是“停止”按键。如图7所示。

按键电路

012

图7 按键电路

3.6 ISP下载口电路

下载口电路采用了ISP 下载口,能快速下载和更换单片机中的程序,从而满足和达到实验的要求下载口的1脚与单片机的P1.5相连接,下载口的2脚与VCC 相连接,下载口的3脚与单片机的相连接,下载口的5脚与单片机的相连接,下载口的7脚与单片机的P1.7相连接,下载口的9脚与单片机的P1.6相连接,下载口的4、6和8脚与GND 相连接。下载电路采用DIP10插座;其插座的管脚如图8示,DIP10管脚功能如表1所示[5]。

图8 按键下载口电路

表1 DIP10管脚使用说明

AT89ISP 引脚

1

2 3 4

CPU 端 SCK VCC MISO GND

说明 时钟信号 电源 输入信号 地线

AT89ISP 引脚

5 9 10

CPU 端 RST MOSI GND

说明 复位端 输出信号 地线

3.7 LED彩灯显示电路

LED 数码显示管有两种,一种是共阳极数码管,另一种是共阴极数码管,其内部是由八个阳极或阴极相连接的发光二极管组成,二者原理不同但功能相同。共阴极LED 数码显示块的发光二极管阴极连接在一起,形成该模块的公共端(通常称为位选端),因此称为共阴极LED 数码显示器,8个数码管的另一端通常称为段选端,当显示器的公共端接低电平,某个发光二极管的阳极接高电平时,该发光二极管被点亮;而共阳极LED 数码显示管则形成共阳极LED 数码显示块的公共端,该公共端必须接高电平,同理在共阳极LED 数码显示块中如某个发光二极管的阴极为低电平时,该发光二极管被点亮[7]。

AT89S52是采用12MHZ 晶振获得稳定的时钟频率。采用12MHz 高精度的晶振,以获得较稳定的时钟频率,从而使输出的频率更为稳定。显示电路采用简单实用的8位共阳LED 数码管。单片机系统显示电路如图9所示。

彩灯显示电路

7

图9 LED显示电路

3.8 12864液晶电路 3.8.1 12864液晶简介

12864是128*64点阵液晶模块的点阵数简称。该点阵的屏显成本相对较低,适

用于各类仪器。液晶模组的驱动应遵照规定的额定指标,避免故障及永久损坏。液晶显示屏焊接温度:280°C+10°C 焊接时间3-4秒[6]。液晶的电气特性如表2所示。

L

表2 12864液晶的电气特性

项目 电源电压

液晶驱动电压

V D D-V A DJ

液晶的背光驱动电流 液晶驱动电流

IEE

-

1.0

-

ILED

-

60

80

符号 VDD-VSS

Ta=0 Ta=25 Ta=50

最小 4.75 -11.0 -10.5

典型 5.0 -11.5 -11.0

最大 5.25 -12.0 -11.5

单位 V

-10.0 -10.5 -11.0

3.8.2 12864液晶显示屏管脚号及作用

液晶的1脚VSS 接电源,为液晶提供电流;17脚为复位端,与单片机的27脚连接,通过单片机程序来控制液晶显示的复位;液晶20脚接地线;7~14脚与排阻的2~9脚连接。如表3所示。

表3 12864液晶显示屏的管脚号及作用

管脚号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

管脚名称 VSS VCC V0 RS(CS) R/W(SID) E(SCLK) DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 PSB NC

电平 +5V 3.0~+5V - H/L H/L H/L H/L H/L H/L H/L H/L H/L H/L H/L H/L -

管脚功能描述

电源地 电源正

对比度(亮度)调整

RS=“H”, 表示DB7——DB0为显示数据 RS=“L”, 表示DB7——DB0为显示指令数据 R/W=“H”,E=“H”,R/W=“L”,E=“H→L”,

使能信号

三态数据线 三态数据线 三态数据线 三态数据线 三态数据线 三态数据线 三态数据线 三态数据线

H :8位或4位并口方式,L :串口方式

空脚

续表 12864液晶显示屏的管脚号及作用 管脚号 18 19 20

管脚名称 VOUT A K

电平 - VDD VSS

管脚功能描述 LCD 驱动电压输出端

背光源正端(+5V)

背光源负端

在这个设计中由于采用的是并行,故直接将PSB 连接高电平;VSS 与LED_K端接地。液晶的数据位DB0~DB7分别接在排阻U2的A0~A7上;复位端17脚和单片机的复位端连接。12864液晶屏显示部分电图如图10所示。

PA IZU _

V

图10 12864液晶屏显示电路

3.9 音乐播放电路

为了提高声音电路的功率并保持稳定在喇叭电路中增加了一个8550三极管,并增加了一个阻值比较大的电阻来增加电路的电流。音乐播放电路如图11所示。

图11 喇叭电路

3.10 直流稳压电源电路

电源电路采用普通可调电源供电,电源由外接端口连接5V 电压参考源,可满足本系统单片机、彩灯和小喇叭的供电要求。其中采用两个电容并联,达到滤波的作用,以便得到稳定的电流。如下图12。

V CC

1u

图12 稳压电源电路

4 系统软件设计

硬件电路一旦确定,大体的功能框架也形成了。这时我们需要在硬件平台上编写软件程序,完成各部分硬件的控制和协调。系统功能是由软硬件共同实现的,由于软件的可伸缩性,最终实现的系统功能可强可弱,差别可能很大。因此,软件是本系统的灵魂。 音乐彩灯控制器的软件设计主要是为了实现彩灯与音乐同步控制。基于单片机的音乐彩灯控制器的设计的软件设计主要由主程序、复位程序、音频及半音程序、按键中断程序及显示子程序组成。下面分别对主程序、音频及半音程序、按键中断程序和显示程序逐一作介绍[7]。

4.1 单片机系统设计主程序流程图

本设计选用AT89S52的单片机来控制歌曲播放和歌词显示。采用直流电源为其提供基准电压+5V,采用12864LCD 显示,小喇叭播放音乐[8]。通过软件程序与按键输入来控制输入与输出。当电源接通时,程序开始初始化。当开始键按下时单片机的21脚输入低电平,程序启动;音乐开始播放彩灯交替移动点亮;随即进入通过频率变化范围中断若在整体频率范围内则继续程序;若不在整体频率范围内则所有彩灯1Hz 闪烁。当程序进入高频判定时,若在高频段内则使高频段灯亮,液晶显示当前频率的大概值;若不在高频段范围内则进入中频判定,判定结果同高频;当程序进入低频判定时,若满足频率判定要求则低频段灯亮,液晶显示当前频率的大概值;若不满足判定要求则程序结束。图13为主要程序流程图。

音乐彩灯控制器的主程序如下。 #include #include #pragma ot(0)

#define uint unsigned int #define uchar unsigned char

#define io_LCD12864_DATAPORT P0; #define SET_DATA io_LCD12864_RS = 1 ; #define SET_INC io_LCD12864_RS = 0 ; #define SET_READ io_LCD12864_RW = 1 ; #define SET_WRITE io_LCD12864_RW = 0 ; #define SET_EN io_LCD12864_EN = 1 ; #define CLR_EN io_LCD12864_EN = 0 ;

#define OSFREQ 11059200 //所使用的晶振频率 sbit io_LCD12864_RS = P2^3 ; sbit io_LCD12864_RW = P2^4 ; sbit io_LCD12864_EN = P2^5 ; sbit BEEP_PWR=P2^7; sbit P3.0=P3^0; sbit P3.1=P3^1; sbit P3.2=P3^2; sbit P3.3=P3^3; sbit P3.4=P3^4; sbit P3.5=P3^5; sbit P3.6=P3^6; sbit P3.7=P3^7; sbit P2.0=P2^0;

uchar FreqSandH,FreqSandL; /*产生方波的定时器的初值*/ uchar timer1cnt; /*定时器延时计数 */ uchar timer1cntflg; /*定时器定时完成标志 */ uchar g_PL=0, g_Pai=0;

uchar gp_Freq[16]="当前频率值: ";

uint g_Freq=0;

/**************音符频率表****************/ uint code notefreq[]={ 523, 587, 659, 698, 784, 880, 988,

1047,1175,1319,1396,1568,1760,1976,

2093,2349,2637,2793,3136,3520,3961}; /*************音名***************/ uchar code notename[]={'c','d','e','f','g','a','b', '1','2','3','4','5','6','7',

'C','D','E','F','G','A','B',0};

/*************半音频率表*****************/ uint code halfnotefreq[]={ 554, 622, 740, 831, 933, 1109,1245,1480,1161,1865, 2218,2489,2960,3322,3729};

/*************音名***************/ uchar code halfnotename[]={'c','d','f','g','a', '1','2','4','5','6', 'C','D','F','G','A',0}; /*声明*/

void Dis_PL(uchar *p,unit i); void v_Lcd12864CheckBusy_f( void );

void v_Lcd12864SendCmd_f( unsigned char byCmd );

void v_Lcd12864SendData_f( unsigned char byData ); void v_DelayMs_f( unsigned int nDelay ); void v_Lcd12864Init_f( void );

void v_Lcd12864PutString_f( unsigned char x, unsigned char y, unsigned char *pData );

4.2 音乐程序

主要利用单片机的频率发生器产生方波,来产生不同频率的音乐。[10],具体程序如下。 void main(void) { uint i;

TMOD=0x11; ET1=1; ET0=1; EA=1; v_Lcd12864Init_f() ; while(1)

{

if(P1.0==0) { } if(i==1) {

//Play("1_1_5_5_6_6_54_4_3_3_2_2_15_5_4_4_3_3_2 if(i==1)i=0; //启动关闭按键 if(i==0)i=1;

5_5_4_4_3_3_21_1_5_5_6_6_5 4_4_3_3_2_2_1"); //满天都是小星星

v_Lcd12864PutString_f( 0,0, "曲目:两只老虎") ;

Play("1_2_3_1_1_2_3_1_3_4_5 3_4_55=6=5=4=3_1_ 5=6=5=4=3_1_ 2_g_12_g_1");

//两只老虎

//Play("a-a1-a2--a-b1b13-2a--a--a-33-12--a-b1b13-21--1--5-55432--a-b1-12123--3--

1-1_1_1235--4-32-b3-2a--a-- a-66565--4-34-56543--3--1-1_1_1235--4-32-b3-2a--a--"); //山楂树

v_Lcd12864PutString_f( 0,0, "学习雷锋好榜样") ;

Play("5._3=2_1_5-12_3_g-5.3_23_5_1a_3_2-356.5_352._3=2_1_a32_21_a1g05.3_6562_3

_50"); //学习雷锋好榜样

//Play("C-53.2_1530C-53.2_1650

5_C6_5_C05_C6_5_6_0_3_C.6_53C.6_C0C53_6_5_3_2.1_30_5_C56_C_6_5_33_1_6-60C._C=5_5_2._3=5_5_6.5_6DC6_5_C6_5_33_5_C-");

// Play("3- 2_3_4_3 3- 2_3_4_3 3- 4- 3_4_5_4 4- 3-2- 3- 2_3_4_3 3- 2_3_4_3 3-4-

3_4_5_4 4- 3-2");//许巍-星空前奏 }

/**************音符频率表****************/ uint code notefreq[]={ 523, 587, 659, 698, 784, 880, 988, 1047,1175,1319,1396,1568,1760,1976, 2093,2349,2637,2793,3136,3520,3961}; /*************音名***************/ uchar code notename[]={'c','d','e','f','g','a','b', '1','2','3','4','5','6','7', 'C','D','E','F','G','A','B',0};

/*************半音频率表*****************/ uint code halfnotefreq[]={ 554, 622, 740, 831, 933, 1109,1245,1480,1161,1865, 2218,2489,2960,3322,3729};

/*************音名***************/

uchar code halfnotename[]={'c','d','f','g','a', '1','2','4','5','6', 'C','D','F','G','A',0};

} }

v_Lcd12864PutString_f( 0,0, "许巍 时光") ;

Play("543 3_2_1_2_30 g53 3_2_1_2_30 a65 4_3_2_3_4 1 b a g");//许巍-时光 SoundOff();

4.3 定时器子程序设计序 4.3.1 定时器工作原理

当定时器设置为定时方式时,计数器对内部机器周期计数,每过一个机器周期,计数器加1,直至计满溢出。定时器的定时时间与系统的振荡频率紧密相关,实验单片机系统采用12MHz 晶振,计数周期为1μs ,适当选择定时器的初值可获取各种定时时间。

4.3.2 定时器特殊功能寄存器

定时器的初始化是通过定时器的方式寄存器TMOD 和控制寄存器TCON 完成的。

(1) 定时器的方式寄存器TMOD

TMOD 为定时器0、定时器1的工作方式寄存器,其格式如表4所示。

表4 定时器工作方式寄存器

TMOD 的低四位为定时器0的方式字段,高四位为定时器1的方式字段,它们的含义完全相同。各位的意义如下。

① M1M0:工作方式选择位,设最大计数值为M 。具体功能如表5所示。

表5 M1M0工作功能描述

M1M0 工作方式 功能描述 00 01 10 11

方式0 方式1 方式2 方式3

13位定时器/计数器 16位定时器/计数器

常数自动重装的8位定时器/计数器

仅适用于T0,分为两个8位定时器/计数器。定时器0分成两个8位计数器,所以两个定时器的M 值均为256。

② C/T:定时器/计数器的选择位。C/T =0工作于定时方式,C/T =1 工作于计数方式。 ③ GATE :门控位。

最大计数值 M=2=8192 M=216=65536 M=28=256

当GATE=0时,只要有TRi=1,定时器/计数器就开始工作,称为软启动。当GATE=1时,只有INTi 引脚和TRi 引脚同时为1时,定时器/计数器才开始工作,主要用于测量INT 引脚上高电平脉冲的宽度,称为硬启动。

(2) 定时器控制寄存器TCON

TCON 的作用是控制定时器/计数器的启动、停止,标志定时器的溢出和中断情况,其

格式如表6所示。

表6 定时器控制寄存器

① TF1(TF0):定时器/计数器T1(T0)的溢出标志。

当T1(T0)被允许计数后,T1(T0)从初始值开始加1计数,最高位产生溢出时,该位由内部硬件置位,并向CPU 请求申请中断。当CPU 响应,由硬件清零。

② TR1(TR0):定时器/计数器T1(T0)的运行控制位。由软件置1或清零来启动或

关闭定时器/计数器。

本程序通过单片机的T2产生中断,来调用歌词显示程序和彩灯程序,达到一种同步的效果。按下复位键后,将从头开始。软件分为两部分,主程序和中断服务程序,主程序完成初始化工作、进入定时中断程序。定时中断服务子程序完成对彩灯和音乐的控制,外部中断服务子程序主要完成时间值的读取、程序的运算、结果的输出等工作[9]。定时中断与外部中断流程图分别如图14、15所示。

图14 定时中断服务子程序流图

图15 外部中断服务子程序流图

4.3.3 定时器子程序

首先我们定义寄存器TMOD=0X01,选择定时器0,定时方式,方式1。本设计采用的12MHz 的晶振,所以计数周期为1μs 。方式1最大计数时间为65536μs ,这里我们选择定时50ms 。所以初值就可以计算:

初值 X=65536-50000=15536=3CB0H (公式1) TH0=3CH

TL0=B0H (公式2)

由于本设计需要使彩灯1Hz 的频率闪烁,即需要定时时间为500ms ,所以,没完成一次定时,定义一个count 自加一次,当count 计数到10时,使所以彩灯取反。定义好初值以后则打开总开关EA=1和允许中断开关ET0=1,最后启动定时器0,TR1=1。定时器程序如下:

/*********定时器0用来产生方波***************/

void timer0int () interrupt 1 {

TH0=FreqSandH; TL0=FreqSandL;

BEEP_PWR=!BEEP_PWR; }

/**********定时器用来进行比较准确的延时************/ void timer1int() interrupt 3 {

TH1=0xe0; TL1=0x00; timer1cnt++;

if(timer1cnt>=(OSFREQ/1500000l)) {timer1cntflg=1; TR1=0;} }

void delay(uchar time) { uchar i; uint j;

for(i=0;i

for(i=0;i

{timer1cnt=0; timer1cntflg=0; TR1=1;

while(!timer1cntflg); } ***/ }

4.4 彩灯显示子程序

当检测到不同的音乐频率是彩灯的闪烁样式和个数就会发生变化。高频段时高频段的灯亮,当为1个节拍时3个彩灯全部点亮,当为半拍时2个彩灯点亮,当为1/4拍时1个彩灯点亮。低频段时和中频段时亮灯个数与原理同高频。没有在设定频率范围内时所有彩灯以1Hz 的频率闪烁。彩灯子程序如下。 //函数名称:led_dis

//函数说明:用于显示音乐的led 灯 主要是根据频率和节拍来显示不同的效果 //输入参数:uint pl,uchar pai //输出参数:无

void led_dis(uint pl,uchar pai) {

uchar i; if(pl

else if(pl>500&&pl

else if(pl>2000&&pl

case 0: if(P3==0xff) { } else {

P3=0xff; P2.0=1; P3=0x00; P2.0=0;

}break;

case 1: switch(pai) { //高频

case 1:P3=0x07;P2.0=0;break; case 2:P3=0x03;P2.0=0;break; case 3:P3=0x01;P2.0=0;break; default :P3=0x00;P2.0=0;break;

} case 2: //中频

switch(pai) { case 1:P3=0x38;P2.0=0;break; case 2:P3=0x08;P2.0=0;break; case 3:P3=0x04;P2.0=0;break; default :P3=0x00;P2.0=0;break;

} case 3:

switch(pai) //低频

{ case 1:P3=0xc0;P2.0=1;break; case 2:P3=0xc0;P2.0=0;break; case 3:P3=0x40;P2.0=0;break; default :P3=0x00;P2.0=0;break;

}

default :break; }

}

4.4 液晶显示子程序

液晶显示子程序通过定时器延时计数来检测信号;同时通过定时器定时来完成定时器的计数。初始化液晶显示程序并对液晶屏进行清屏。通过0x0c 来开始液晶显示,使用光标右移的数据移动方式来显示数据。 //函数名称:Dis_PL

//函数说明:用来显示当前的音乐的频率值 //输入参数:uchar *p,unit i //输出参数: 无

void Dis_PL(uchar *p,unit i) { }

void v_Lcd12864CheckBusy_f( void ) //忙检测函数 {

unsigned int nTimeOut = 0 ; SET_INC SET_READ CLR_EN SET_EN

while( ( io_LCD12864_DATAPORT & 0x80 ) && ( ++nTimeOut != 0 ) ) ; CLR_EN SET_INC SET_READ }

void v_Lcd12864SendCmd_f( unsigned char byCmd ) //发送命令

int j=0; ;

p[j]=(i%10)+0x30;i++; p[j]=((i/10)%10)+0x30;i++; p[j]=((i/100)%10)+0x30;i++; p[j]=((i/1000)%10)+0x30;

v_Lcd12864PutString_f(0,1,gp_Freq)

v_Lcd12864CheckBusy_f() ; SET_INC SET_WRITE CLR_EN

io_LCD12864_DATAPORT = byCmd ; _nop_(); _nop_(); SET_EN _nop_(); _nop_(); CLR_EN SET_READ SET_INC }

void v_Lcd12864SendData_f( unsigned char byData ) {

v_Lcd12864CheckBusy_f() ; SET_DATA SET_WRITE CLR_EN

io_LCD12864_DATAPORT =byData ; _nop_(); _nop_(); SET_EN _nop_(); _nop_(); CLR_EN SET_READ SET_INC }

void v_DelayMs_f( unsigned int nDelay ) //发送数据//延时

unsigned int i ;

for( ; nDelay > 0 ; nDelay-- ) {

for( i = 125 ; i > 0 ; i-- ) ; } }

void v_Lcd12864Init_f( void ) //初始化 {

v_Lcd12864SendCmd_f( 0x30 ) ; //基本指令集 v_DelayMs_f( 50 ) ;

v_Lcd12864SendCmd_f( 0x01 ) ; //清屏 v_DelayMs_f( 50 ) ;

v_Lcd12864SendCmd_f( 0x06 ) ; //光标右移 v_DelayMs_f( 50 ) ;

v_Lcd12864SendCmd_f( 0x0c ) ; //开显示 }

void v_Lcd12864SetAddress_f( unsigned char x, y ) //地址转换 {

unsigned char byAddress ; switch( y ) {

case 0 : byAddress = 0x80 + x ; break;

case 1 : byAddress = 0x90 + x ; break ;

case 2 : byAddress = 0x88 + x ; break ;

case 3 : byAddress = 0x98 + x ; break ; default : break ;

}

v_Lcd12864SendCmd_f( byAddress ) ; }

void v_Lcd12864PutString_f( unsigned char x, unsigned char y, unsigned char *pData ) {

v_Lcd12864SetAddress_f( x, y ) ; while( *pData != '\0' ) {

v_Lcd12864SendData_f( *pData++ ) ; } }

参考文献

[1] 杨国志,王立峰,杨东光,王辉林编著. 实用电子制作实例[M]. 福建科学技术出版社,2000.10. [2] 张仁. 单片机音乐彩灯同步控制器的设计[J]. 成都气象学院院报,1995.5.(165~168). [3] 王连涛主编. 音乐喷泉的单片机控制[J]. 电子世界,2005.(21~22).

[4] 康华光,陈大钦编著. 电子技术基础(模拟部分第四版)[M].高等教育出版社,2002.3. [5] 潘永雄,沙河编著,电子线路CAD 实用教程(第三版)[M]. 西安电子科技大学出版社,2010.2. [6] 门宏编著. 图解电子技术[M].人民邮电出版社,2010.6.

[7] 刘瑞新,沈淑娟著. C 语言程序设计基础[M]. 机械工业出社,2004.8.

[8] 唐颖,程菊花,任条娟著. 单片机原理与应用及C51程序设计[M]. 北京大学出版社,2010.7. [9] 何立民主编. 单片机应用技术选编[M]. 北京航空航天大学出版社,1999. [10] 杨旭主编. C 语言程序设计[M]. 人民邮电出版社,2005.


© 2024 实用范文网 | 联系我们: webmaster# 6400.net.cn