《基于单片机多功能音乐闹钟设计论文.doc》由会员分享,可在线阅读,更多相关《基于单片机多功能音乐闹钟设计论文.doc(44页珍藏版)》请在三一办公上搜索。
1、课程设计说明书课题:基于单片机多功能音乐闹钟的设计 学 院(部): 专 业: 班 级: 学 号: 姓 名: 2010年11月第1部分 概述1.1 设计目的(1)、熟悉集成电路的引脚安排。(2)、掌握各芯片的逻辑功能及使用方法。(3)、了解硬件电路的焊接方法。(4)、了解音乐钟的组成及工作原理。(5)、熟悉音乐钟的设计与制作。1.2 设计思路本次设计音乐闹钟电路,使用了AT89S51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用按键来调整时钟的时、分、秒,设定闹钟和挑选铃音,用一蜂鸣器来进行定时提醒和播放铃音,同时使用C语言程序来控制整个时钟显示,使得编程变
2、得更容易,这样通过四个模块:按键、芯片、蜂鸣器、数码管显示即可满足设计要求。1.3 设计功能说明(1)时间以24小时为一个周期,本设计采用C语言程序设计,使单片机控制数码管显示时、分、秒,当秒计数计满60时就向分进位,分计满60后向时进位,小时按“23翻0”规律计数。时、分、秒的计数结果经过数据处理可直接送数码管显示。当计时发生误差的时候可以用校时电路进行校正。设计采用的是时、分、秒显示,单片机对数据进行处理同时在数码管上显示。(2)正常显示时、分、秒:12.00.00,闹钟显示:12.00-1,铃音欣赏显示:-01-;(3)有校时功能,可以分别对时、分秒进行单独校时,使其校正到标准时间;(4
3、)计时过程具有报时和闹铃功能,当时间到达整点进行蜂鸣报时,达到闹钟调定时间播放调定闹钟对应音乐(闹钟的优先级高于整点报时),并显示当前闹钟的序号,闹铃音乐可在任意时候强行停止,一共可调定9个闹铃;(5)在正常显示状态下,通过按键可以挑选音乐欣赏,在非闹铃音乐播放时显示当前播放音乐的序号,并且能够在任意时候强行停止音乐,一共有11首音乐可供选择。(6)为了保证计时的稳定及准确须由晶体振荡器提供表针时间基准信号。第2部分 硬件电路的设计2.1电子钟的原理图2.2 复位电路MCS-51单片机的复位是由外部的复位电路来实现的。复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,
4、在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。上电按键复位:上电复位电路是种简单的复位电路,只要在RST复位引脚接一个电容到VCC,接一个电阻到地就可以了。上电复位是指在给系统上电时,复位电路通过电容加到RST复位引脚一个短暂的高电平信号,这个复位信号随着VCC对电容的充电过程而回落,所以RST引脚复位的高电平维持时间取决于电容的充电时间。为了保证系统安全可靠的复位,RST引脚的高电平信号必须维持足够长的时间。为了调试方便,我们设计了按键复位电路,只要在复位电容上并接一个串电阻的按键即可,当按键按下时RST引脚高电平,单片机复位。电路
5、图如下:2.3 时钟电路时钟是单片机的心脏,单片机各功能部件的运行都是以时钟频率为基准,有条不紊的一拍一拍地工作。因此,时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。常用的时钟电路有两种方式:一种是内部时钟方式,另一种为外部时钟方式。本设计用的是内部时钟方式。电路图如下:MCS-51单片机内部有一个用于构成振荡器的高增益反相放大器,该高增益反向放大器的输入端为芯片引脚XTAL1,输出端为引脚XTAL2。这两个引脚跨接石英晶体振荡器和微调电容,就构成一个稳定的自激振荡器。2.4 按键电路 按键的开关状态通过一定的电路转换为高、低电平状态。按键闭合过程在相应的I/O端口
6、形成一个负脉冲。闭合和释放过程都要经过一定的过程才能达到稳定,这一过程是处于高、低电平之间的一种不稳定状态,称为抖动。抖动持续时间的常长短与开关的机械特性有关,一般在5-10ms之间。为了避免CPU多次处理按键的一次闭合,应采用措施消除抖动。本设计采用的是独立式按键,直接用I/O口线构成单个按键电路,每个按键占用一条I/O口线,每个按键的工作状态不会产生互相影响。 电路图如下: P1.0(K1)口:表示功能移位键,按键选择要调整的时位、分位或秒位,按第一下时位闪烁,按第二下分位闪烁,按第三下秒位闪烁,按第四下调整完毕,回到正常显示界面。当按一下此键后再按一下P1.3(K4)键(按几下进入第几个
7、闹钟)进入闹钟调整状态,用同样的方法可选择调整时和分位。 P1.1(K2)口:当在时间或闹钟调整状态下按下此键后表示数字“+“键,按一下则对应的数字加1。 P1.2(K3)口:当在时间或闹钟调整状态下按下此键后表示数字“-”键,按一下则对应的数字减1。(非整点报时)蜂鸣器发声状态下按下此键为音乐和闹铃强行停止键。 P1.3(K4)口:当功能键按一下后此键为闹钟选择键,按一下闹钟序号加一,正常显示状态下按下此键为音乐欣赏选择键,按一下换一首音乐。2.5 控制响铃电路P0.0口控制三极管进而控制蜂鸣器工作。当时钟当前的时间和设定闹钟时间一致时,相应的标志位为1,P0.0口输出低电平,蜂鸣器电路导通
8、,发出音乐铃声。打铃一定时间,标志位置0,P0.0输出高电平,蜂鸣器停止工作。电路图如下:2.6 数码管显示电路数码管显示器成本低,配置灵活,与单片机接口简单,在单片机应用系统中广泛应用。2.6.1 LED数码显示器简介发光二极管LED是一种通电后能发光的半导体器件,其导电性质与普通二极管类似。LED数码显示器就是由发光二极管组合而成的1种新型显示器件。在单片机系统中应用非常普遍。2.6.2 LED数码显示器的结构LED数码显示器是1种由LED发光二极管组合显示字符的显示器件。它使用了8个LED发光二极管,其中7个用于显示字符,1个用于显示小数点。2.6.3 LED数码显示器有两种连接方法(1
9、)共阳极接法。把发光二极管的阳极连在一起构成公共阳极,使用时公共阳极接+5V,每个发光二极管的阴极通过电阻与输入端相连。当阴极端输入低电平时,段发光二极管就导通点亮,而输入高电平时则不点亮。(2)共阴极接法。把发光二极管的阴极连在一起构成公共阴极,使用时公共阴极接地。每个发光二极管的阳极通过电阻与输入端相连。当阳极端输入高电平时,段发光二极管就导通点亮,而输入低电平时则不点亮。在本设计中所采用的是共阳极LED数码显示器,其引脚排列如下图所示:本设计的6个数码管均采用动态显示方式,显示当前的时间。整个显示电路应用了6个三极管V9012,这六位控制数码管的片选信号,即控制动态显示的是哪一位数码管,
10、采用74HC244做段码驱动。在片选信号和段选信号的控制下,数码管就正确的动态显示当前的时间。第3部分 软件的设计3.1 软件程序内容本设计的软件程序包括主程序、中断子程序、铃音子程序、时钟显示程序、延时子程序等等。另外由于电路中有四个按键,还另外设计了去抖动延时处理程序来防止干扰。3.2 程序流程图NY是否有键按下主程序开始定时器初始化,开中断闹钟是否到?Y调用闹铃子程序N调用按键处理程序主程序流程图进入按键功能程序按键识别有键按下?Y延时去抖等待按键释放返回N单个按键处理程序流程图1分钟到?T0中断服务程序重置T0初值1s到?秒位+1百分位清0Y百分秒+1Y 分位+1秒位清01小时到?Y小
11、时位+1分位清024小时到?Y小时位清0返回NNNN24小时的时钟显示程序流程图 按键处理K1第2次按下?设置分K1第3次按下?设置秒K4被按下?播放铃音K4再次被按下?播放下一首铃音K1被按下?K1第1次按下?K4被按下?设置第1至第9个闹钟设置时闹钟时间到?播放该闹钟对应的歌曲关闭闹钟铃声K3被按下?返回按键处理程序流程图参考源程序:#include#include#define uchar unsigned char #define uint unsigned intuchar code font=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
12、0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf; /uchar codetab=0xc40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e;uint code note_value14=0,63628,63835,64021,64103,64260,64400,64524,63731,63928,0,64185,64331,64463, /低音1,2,3,4,5,6,7,#1,#2,0(#3在此程序中无需设),#4,#5,#6 相对应的定时器初值0,64580,
13、64684,64777,64820,64898,64968,65030,64633,64732,0,64860,64934,64994, /中音1,2,3,4,5,6,7,#1,#2,0(#3在此程序中无需设),#4,#5,#6 相对应的定时器初值0,65058,65110,65157,65178,65217,65252,65283,65085,65134,0,65198,65235,65268 /高音1,2,3,4,5,6,7,#1,#2,0(#3在此程序中无需设),#4,#5,#6 相对应的定时器初值 ;uint code song67=/* 0 嘀(按键时的嘀嗒声)*/0x2701,0x
14、0,/* 1 茉莉花 */ 0x1304,0x1302,0x1502,0x1602,0x2102,0x2102,0x1602,0x1504,0x1502,0x1602,0x1507,0x1001,/* 0x1304,0x1302,0x1502,0x1602,0x2102,0x2102,0x1602,0x1504,0x1502,0x1602,0x1507,0x1001,*/ 0x1504,0x1504,0x1504,0x1302,0x1502,0x1604,0x1604,0x1507,0x1001, 0x1304,0x1202,0x1302,0x1504,0x1302,0x1202,0x1104
15、,0x1102,0x1202,0x1107,0x1001, 0x1302,0x1202,0x1102,0x1302,0x1204,0x1002,0x1302,0x1504,0x1602,0x2102,0x1507,0x1001, 0x1202,0x1302,0x1502,0x1202,0x1302,0x1102,0x0602,0x0507,0x1001,0x0604,0x0602,0x1102,0x1206,0x1302,0x1102,0x1202,0x1102,0x0602,0x050d,0x0, /* 2 莫斯科郊外的晚上 */ 0x0602,0x1102,0x1302,0x1102,0x
16、1204,0x1102,0x0702,0x1304,0x1204,0x0607,0x1001, 0x1102,0x1302,0x1502,0x1502,0x1604,0x1502,0x1402,0x1307,0x1001, 0x1414,0x1514,0x1702,0x1602,0x1304, 0x1002,0x0704,0x0602,0x1302,0x1202,0x1404, 0x1004,0x1502,0x1402,0x1304,0x1202,0x1102,0x1304,0x1204,0x060c, 0x0,/* 3 祝你生日快乐 */ 0x0502,0x0502,0x0604,0x050
17、4,0x1104,0x0708,0x0502,0x0502,0x0604,0x0504,0x1204,0x1108,0x0502,0x0502,0x1504,0x1304,0x1104,0x0704,0x0604,0x1402,0x1402,0x1304,0x1104,0x1204,0x1108,0x0,/* 4 铃儿响叮当 */0x1302,0x1302,0x1303,0x1001, 0x1302,0x1303,0x1001, 0x1302,0x1502,0x1102,0x1202,0x1307,0x1001, 0x1402,0x1402,0x1402,0x1402,0x1402,0x130
18、2,0x1302,0x1302,0x1302,0x1202,0x1202,0x1302,0x1204,0x1503,0x1001, 0x1302,0x1302,0x1303,0x1001, 0x1302,0x1303,0x1001, 0x1302,0x1502,0x1102,0x1202,0x1307,0x1001, 0x1402,0x1402,0x1402,0x1402,0x1402,0x1302,0x1302,0x1302,0x1502,0x1502,0x1402,0x1202,0x1108,0x0,/* 5 喀秋莎 */ 0x0606,0x0702,0x1106,0x0602,0x110
19、2,0x1102,0x0702,0x0602,0x0704,0x1002, 0x0706,0x1102,0x1206,0x0702,0x1202,0x1202,0x1102,0x0702,0x0607,0x1001, 0x1304,0x1604,0x1504,0x1602,0x1502,0x1402,0x1402,0x1302,0x1202,0x1304,0x0604, 0x1002,0x1404,0x1202,0x1306,0x1102,0x0702,0x0302,0x1102,0x0702,0x0608,0x0,/* 6 欢乐颂 */0x1304,0x1304,0x1404,0x1504,
20、0x1504,0x1404,0x1304,0x1204,0x1104,0x1104,0x1204,0x1304,0x1306,0x1202,0x1207,0x1001, 0x1304,0x1304,0x1404,0x1504,0x1504,0x1404,0x1304,0x1204,0x1104,0x1104,0x1204,0x1304,0x1206,0x1102,0x1107,0x1001, 0x0,/* 7 四季歌 */ 0x1304,0x1302,0x1202,0x1104,0x1102,0x0702,0x0604,0x0604,0x0607,0x1001, 0x1404,0x1402,0
21、x1302,0x1202,0x1102,0x1202,0x1402,0x130f,0x1001, 0x1404,0x1402,0x1302,0x1204,0x1202,0x1402,0x1304,0x1302,0x1102,0x0604,0x0604,0x0704,0x1304,0x1302,0x1102,0x0702,0x1102,0x060f,0x0,/* 8 月亮代表我的心 */ 0x150a,0x1302,0x1202,0x1102,0x130f,0x160a,0x1402,0x1202,0x1102,0x070c,0x1002,0x0502,0x1106,0x1302,0x1506,
22、0x1102,0x0706,0x1302,0x1504,0x1002,0x1502,0x1606,0x1702,0x2106,0x1604,0x150a,0x1302,0x1202,0x1106,0x1102,0x1104,0x1302,0x1202,0x1106,0x1102,0x1104,0x1202,0x1302,0x1206,0x1102,0x0606,0x1201,0x1301,0x120c,0x1002,0x0502,0x1106,0x1302,0x1506,0x1102,0x0706,0x1302,0x1504,0x1002,0x1502,0x1606,0x1702,0x2106
23、,0x1604,0x150a,0x1302,0x1202,0x1106,0x1102,0x1104,0x1302,0x0,/0x1202,0x1106,0x1102,0x1104,0x1202,0x1302,0x1206,0x0602,0x0704,0x1102,011202,0x110c,0x1302,0x1502,0x1306,0x1202,0x1104,0x1504,0x070c,0x0602,0x0702,0x0606,0x0702,0x0604,0x0504,0x130c,0x1504,0x1306,0x1202,0x1104,0x1504,0x070c,0x0602,0x0702,
24、0x1106,0x1102,0x1104,0x1202,0x1302,0x120c,0x1002,0x0502,0x1106,0x1302,0x1506,0x1102,0x0706,0x1302,0x1504,0x1002,0x1502,0x1606,0x1702,0x2106,0x1604,0x150a,0x1302,0x1202,0x1106,0x1102,0x1104,0x1302,0x1202,0x1106,0x1102,0x1104,0x1202,0x1302,0x1206,0x0602,0x0704,0x1102,0x1202,0x1104,0x1502,0x1402,0x1304
25、,0x1202,0x1102,0x1104,0x0702,0x0602,0x0518,0x050f,0x0,/* 9 献给爱丽丝 */ 0x2302,0x2212,0x2302,0x2212,0x2302,0x1702,0x2202,0x2102,0x1604, 0x1002,0x1102,0x1302,0x1602,0x1704, 0x1002,0x1302,0x1512,0x1702,0x2104, 0x1002,0x1302,0x2302,0x2212,0x2302,0x2212,0x2302,0x1702,0x2202,0x2102,0x1604, 0x1002,0x1102,0x13
26、02,0x1602,0x1704, 0x1002,0x1202,0x2102,0x1702,0x1604, 0x1002,0x1702,0x2102,0x2202,0x2305,0x1001, 0x1502,0x2402,0x2302,0x2205,0x1001, 0x1402,0x2302,0x2202,0x2105,0x1001, 0x1302,0x2202,0x2102,0x1704, 0x1002,0x1302,0x2302,0x1002, 0x0,/ 0x2212,0x2302, 0x1002,0x1002,0x2212,0x2302,0x2212,0x2302,0x2212,0x2
27、302,0x1702,0x2202,0x2102,0x1604, 0x1002,0x1102,0x1302,0x1602,0x1704, 0x1002,0x1302,0x1512,0x1702,0x2104, 0x1002,0x1302,0x2302,0x2212,0x2302,0x2212,0x2302,0x1702,0x2202,0x2102,0x1604, 0x1002,0x1102,0x1302,0x1602,0x1704, 0x1002,0x1202,0x2102,0x1702,0x1604,0x1004,0x0,/* 10 小星星,亮晶晶 */ 0x1104,0x1104,0x15
28、04,0x1504,0x1604,0x1604,0x1507,0x1001, 0x1404,0x1404,0x1304,0x1304,0x1204,0x1204,0x1107,0x1001, 0x1504,0x1504,0x1404,0x1404,0x1304,0x1304,0x1207,0x1001, 0x1504,0x1504,0x1404,0x1404,0x1304,0x1304,0x1207,0x1001, 0x1104,0x1104,0x1504,0x1504,0x1604,0x1604,0x1507,0x1001, 0x1404,0x1404,0x1304,0x1304,0x120
29、4,0x1204,0x1107,0x1001, 0x0,/* 11 Nokia经典铃声 */ 0x2502,0x2402,0x1604,0x1704,0x2302,0x2202,0x1404,0x1504,0x2202,0x2102,0x1304,0x1504,0x210c, 0x2502,0x2402,0x1604,0x1704,0x2302,0x2202,0x1404,0x1504,0x2202,0x2102,0x1304,0x1504,0x210c,0x0/* 12 两只老虎 */0x1104,0x1204,0x1304,0x1104,0x1104,0x1204,0x1304,0x110
30、4,0x1304,0x1404,0x1508,0x1304,0x1404,0x1508,0x1502,0x1602,0x1502,0x1402,0x1304,0x1104,0x1502,0x1602,0x1502,0x1402,0x1304,0x1104,0x1304,0x0504,0x1108,0x1304,0x0504,0x1108,0x0 ;sbit key_select=P10; /功能键sbit key_inc=P11; / 增大建sbit key_dec=P12; / 减小键sbit key_alarm_or_song=P13; /调闹钟键sbit buzzer=P00;bit m
31、usic_break=0; uchar week=1,hour=12,minute=0,second=0,alarm_num,display=1,2,0,0,0,0,n=0,bit_code=0x04,alarm_break=1,flag_display=0,flag_alarm=0; /定义数组display6作为显示缓冲区,n为数组下标,flag_display用于设置时间或闹钟时的闪烁显示标志,flag_alarm用于闹钟键按下的标志 uchar display_music6=0x10,0x10,0,0,0x10,0x10,display_alarm6=0,0,0,0,0,0,alarm
32、3=12,12,1,12,3,12,5,1,2,3,4,5,6,alarm_num=0,song_num=0;uint initial_value,count_display=0,count=0; /count_display用于设置时间或闹钟时的闪烁显示记时变量void delay_ms(uint t) /延时1ms uint i,j;for(i=t;i0;i-)for(j=110;j0;j-); void di() /按键发声函数 buzzer=0;delay_ms(100); buzzer=1; void music(uchar song_number) uchar i,section,
33、basic_note,changed_note,pitch,duration,note_num=0; /分别定义i,音区,基本音级,变化音级,音高,时值,所选歌曲的音符的编号uint note; /定义音符变量 ET1=1; music_break=1; note=songsong_numbernote_num;while(note!=0&music_break)section=note/0x1000;basic_note=note/0x100%0x10;changed_note=note/0x10%0x10;duration=note%0x10;if(changed_note=1)pitch
34、=basic_note+7;pitch=basic_note;initial_value=note_valuesectionpitch;if(initial_value!=0)TH1=initial_value/256;TL1=initial_value%256;TR1=1;elseTR1=0;if(key_alarm_or_song=0)delay_ms(10);if(key_alarm_or_song=0)break; for(i=duration;i0;i-) /音符延时函数delay_ms(125);note_num+;note=songsong_numbernote_num; if(
35、key_dec=0) /强行关闭闹钟 delay_ms(10);if(key_dec=0) while(!key_dec); break; music_break=0;TR1=0;void alarm_()for(alarm_num=1;alarm_num0;k-) buzzer=0;delay_ms(100); buzzer=1; */ void scan_key() /按键扫描函数 bit flag_break=0;/flag_break作为跳出按键扫描循环程序的标志位if(key_select=0)delay_ms(10);if(key_select=0) / 确认功能键被按下while
36、(!key_select); /释放确认di();while(1)/时按键处理flag_display=1;if(flag_break=1) alarm_num=0;break;if(key_alarm_or_song=0)delay_ms(10);if(key_alarm_or_song=0) flag_alarm=1;if(flag_break=1)alarm_num=0;break; alarm_num+;if(alarm_num=10)/添加闹钟时需要修改的地方!alarm_num=1;display_alarm0=alarmalarm_num0/10;display_alarm1=a
37、larmalarm_num0%10;display_alarm2=alarmalarm_num1/10;display_alarm3=alarmalarm_num1%10;display_alarm4=0x10;display_alarm5=alarm_num%10; while(!key_alarm_or_song);di(); if(key_select=0)delay_ms(10);if(key_select=0) /确认功能键改时被按下while(!key_select); /释放确认di();while(1)/分按键处理flag_display=2;if(flag_break=1)b
38、reak; if(key_select=0)delay_ms(10);if(key_select=0) /确认功能键改分被按下while(!key_select); /释放确认di(); while(1) /秒按键处理flag_display=3;if(key_select=0)delay_ms(10);if(key_select=0) /确认功能键改秒被按下while(!key_select); /此处等待按键释放非常重要!di();flag_alarm=0;flag_break=1;break;if(key_inc=0&flag_alarm=0)delay_ms(10);if(key_inc=0) if(flag_alarm=0) second+;if(second=60)second=0;display4=second/10;display5=second%10;