《基于51单片机数字音乐盒的设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机数字音乐盒的设计.docx(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、基于51单片机数字音乐盒的设计 单片机实物设计 题目: 单片机音乐盒设计 班级: K0312416-17 姓名:湛俊朱斌杨裕庆 学号:K031241705 K031241632 K031241737 摘要 本设计是一个基于STC89C51RC系列单片机的音乐盒,依据单片机技术原理,通过硬件电路制作以及软件编译,设计制作出一个多功能多功能音乐盒。该音乐盒主要由按键电路、复位电路、时钟电路以及蜂鸣器组成。本音乐盒共有四首歌曲,用4个按键控制。播放歌曲时,蜂鸣器发出某个音调。本设计利用KEIL编程软件对音乐盒源程序进行编程并调试,配合PROTEUS 仿真软件对硬件进行仿真调试,节约了设计时间。 ST
2、C89C51RC 按键蜂鸣器 LCD1602液晶 目录 前言 . 第一章工作原理 . 1.1设计目标 . 第二章软件设计与分析. 2.1 软件设计的组成. 2.2 各部分软件分析 . 2.2.1 延时165MS,即十六分音符子函数 . 2.2.2 延时1MS子函数. 2.2.3 定时器0中断子函数 . 2.2.4 播放音乐子函数. 2.5 定时器1中断子函数. 2.6 按键扫描子函数 . 2.2.7 主函数. 2.3 总源程序 . 第三章软件仿真 . 3.仿真图. 3.1 元件清单 . 总结 . 参考文献. 第一章工作原理 1.1设计目标 1.1.1基本功能 具体要求是:以单片机为核心,设计一
3、个数字音乐盒: 利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏乐曲(最少3首乐曲,每首不少于30s)。 采用LCD显示信息。 a. 开机时有英文欢迎提示字符,播放时显示歌曲序号(或名称)。 b. 可通过功能键选择乐曲、暂停、播放。 第二章软件设计与分析 2.1 软件设计的组成 该系统由延时165MS,即十六分音符子函数、延时1MS子函数、按键扫描子函数、播放音乐子函数、定时器1中断子函数、定时器0中断子函数、主函数和数据定义这几部分组成。 2.2 各部分软件分析 2.2.1 延时165MS,即十六分音符子函数 /延时165MS,即十六分音符子函数 void delay1(
4、uint z) uint x,y; for(x=z;x0;x-) for(y=19000;y0;y-); 2.2.2 延时1MS子函数 /延时1MS子函数 void delay2(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-); 2.2.3 定时器0中断子函数 /定时器0中断子函数 void t0() interrupt 1 /用于产生各种音调 TH0=a; TL0=b; BEEP=BEEP; 2.2.4 播放音乐子函数 /播放音乐子函数 void song() uint temp; uchar aa;/aa是简谱 c=0; while(1)
5、 if(count2=0) break; if(count2=1) /选曲 temp=table1c; if(count2=2) temp=table2c; if(count2=3) temp=table3c; if(count2=4) temp=table4c; if(temp=0xff) break; aa=temp/16; /取数的高4位 if(aa!=0) a=cuzhiaa*2; b=cuzhiaa*2+1; else TR1=0; BEEP=1;/关蜂鸣器 delay1(temp%16); /取数的低4位 TR1=0; /唱完一个音停10MS BEEP=1; delay2(10);
6、 TR1=1; c+; TR1=0; BEEP=1; 2.2.5 定时器1中断子函数 /定时器1中断子函数 void t1() interrupt 3 /用于产生各种音调 key(); 2.2.6 按键扫描子函数 void key() if(k3=0) delay2(10); if(k3=0) num1+; if(num1=1) TR1=0; aa=count2; count2=0; if(num1=2) num1=0; count2=aa; TR1=1; while(!k3); if(k4=0) delay2(10); if(k4=0) TR1=0; count2=0; c=0; write
7、_com(0x01);/清屏 write_com(0x80+0); write_date(W); write_com(0x80+1); write_date(e); write_com(0x80+2); write_date(l); write_com(0x80+3); write_date(c); write_com(0x80+4); write_date(o); write_com(0x80+5); write_date(m); write_com(0x80+6); write_date(e); write_com(0x80+7); write_date( ); write_com(0x8
8、0+8); write_date(t); write_com(0x80+9); write_date(o); write_com(0x80+10); write_date( ); write_com(0x80+11); write_date(u); write_com(0x80+12); 2.2.7 主函数 /主函数 void main() TMOD=0x10;/定时器0工作在方式1 TH1=0; TL1=0; ET1=1; EA=1;/开总中断 EX1=1;/开外部中断1 IT1=1;/下降沿时触发中断 EX0=1;/开外部中断0 IT0=1;/下降沿时触发中断 count2=0;/唱第一首
9、歌 LCD1602_init(); while(1)/大循环 song(); 2.3 总源程序 #include/51单片机头文件 typedef unsigned char uchar; typedef unsigned int uint; sbit RS=P27;/LCD1602数据/命令选择端(H/L) sbit RW=P26;/LCD1602读/写选择端(H/L) sbit E=P25;/LCD1602使能信号端 sbit BEEP=P20;/蜂鸣器接口 sbit k1=P32;/下一首 sbit k2=P33;/上一首 sbit k3=P21;/播放/暂停 sbit k4=P22;/
10、复位 char count2;/歌曲标志 uchar a,b,c,aa,num; uchar num1,num2; /-简谱- /编程规则:字节高位是简谱,低位是持续时间, /代表多少个十六分音符 /1-7代表中央C调,8-E代表高八度,0代表停顿 /最后的0是结束标志 uchar code table1= /千年之恋 0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x 94,0xA8,0x08,/前奏 0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32
11、,0x62,/竹林的灯火到过的沙漠 0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22,/七色的国度不断飘逸风中 0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,/有一种神秘灰色的旋涡 0x32,0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02,/将我卷入了迷雾中 0x63,0xA1,0xA2,0x62,0x92,0x82,0x52,/看不清的双手 0x31,0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7C,0x02,/一朵花传来谁经过的温柔 0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76,/穿越千年的伤痛