资源描述
文理学院
综合课程设计
(一)
Integrated Curriculum Design(1)
所在院系
信息工程系
专业名称
电子信息工程
班级
1001
题目
数字音乐盒设计
指导教师
成员
完成时间
2012.12.28
一、设计任务及要求:
设计任务:
设计一个数字音乐盒程序。
要 求:
预写3个曲子
可以实现播放/暂停、上一曲/下一曲功能
有开机欢迎词,播放曲目时LCD屏幕上显示曲目名称
指导教师签名:
2012年12月28日
二、指导教师评语:
指导教师签名:
2012年12月 28 日
三、成绩
验收盖章
2012年12月28 日
数字音乐盒的设计
1 设计目的
(1)熟悉用于单片机C语言的一些用法。
(2)掌握单片机的基本功能。
(3)了解程序是如何控制硬件。
2 设计思路
音乐部分用控制I/O口高低电平变化的快慢来改变发出音符的频率(即不同唱名的音)
按键部分利用中断来控制播放/暂停、上曲/下曲功能
3 设计过程
3.1方案论证
该程序总体分为三个部分:音乐部分、按键部分、显示部分。
音乐部分实现不用频率不同节拍的音构成完整曲目;
按键部分实现播放/暂停(key1)、上曲/下曲功能;(key2/key3)
显示部分实现开机问候语和曲目播放中曲名的显示;
3.2程序设计
音符部分:
while(x<uchar a)//此处uchar a填的数决定音符响的时长,uint b填的数决定音符频率
{
speaker=1;
delayus(uint b);
speaker=0;
delayus(uint b)
}
x=0;
按键部分(播放/暂停)
void keyscan()
{
if(key1= =0)
{
delayms(10);
if(key1= =0)
{
ET0=~ET0;//通过控制中断开关ET0来实现播放暂停
}
}
上一曲/下一曲 部分
}
void T0_time()interrupt 1
{
LCD部分程序(显示歌曲状态为暂停)
while(1)
{if(key1= = 0)
{
delayms(10);
if (key1= =0)
}
LCD 部分程序
break;
}
}
void INT0_time()interrupt 0
{
keyscan();
}
按键部分(上曲/下曲)
{
key1 部分
if(key2= =0)
{
delayms(10);
if(key2= =0)
{
n--;
if(n= =0)
n=3;}}
if(key3= =0)
{
delayms(10);
if(key3= =0)
{
n++;
if(n= =4)
n=1;}}
}
while(x<uchar a)
{
speaker=1;
delayus(uint b);
if(n!=c)//c填的是曲目序号
break;
speaker=0;
delayus(uint b);
if(n!=c)
break;
}
曲 目 1播 放 /
曲目1继续播放
有键被按?
曲1播完?
key1?
暂停
key1?
key2?
key3?
Y
N
N
Y
N
Y
曲 目 2 播 放 /
曲目2继续播放
Y
N
有键被按?
曲2播完?
N
N
N
key1?
暂停
key1?
key2?
key3?
N
N
Y
N
曲 目 3 播 放 /
曲目3继续播放
有键被按?
曲3播完?
N
N
key1?
暂停
key1?
key2?
key3?
N
N
Y
N
4程序调试与结果分析
4.1程序调试
在程序没有写完之前,如果前面声明了子函数,但是后面没有用到的话,会出现警告。只有程序写完整了警告才会不再出现;还有其中key=1和key= =1的意义不同,编译之后系统也判为警告,但实际上只能写作key= =1,写程序时应注意。
4.2结果分析
在程序只完成了音乐部分和按键部分时(即没有加入显示部分时),用proteus仿真时反应速度较理想。在加入显示部分后,播放第一曲时按下“下一曲”键会过几秒才调到第二曲;播放曲目时按下“播放/暂停”键大概超过半秒才会暂停,而从暂停到继续播放时快速点击按键即可。上述情况仍存在,但不影响音乐盒基本功能。
5设计体会
通过这次对数字音乐盒的设计与制作,我大概明白了设计一个具有一定功能的产品的部分基本步骤,了解到自己才刚起步,还有许多东西等着我去学习,我会在不断学习与实践中累积经验,向更高的目标迈进。
参考文献(至少5篇)
[1]新概念51单片机C语言教程(郭天祥著)
[2]互联网
[3]老师、同学的指导
附件
完整程序(分段显示程序)
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="WELCOME";
uchar code table1[]="THE MUSIC BOX";
uchar code table2[]="STATE:ON";
uchar code table3[]="STATE:STOP";
uchar code table4[]=" ";
uchar code table5[]="MUSIC NO.1";
uchar code table6[]="MUSIC NO.2";
uchar code table7[]="MUSIC NO.3";
sbit speaker=P2^7;
sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;
sbit lcden=P3^4;
sbit lcdrs=P3^5;
uchar x,a,n=1,num,f,com;
uint y;
void delayus(uint);
void delayms(uint);
void musicalnotea(uchar,uint);
void musicalnoteb(uchar,uint);
void musicalnotec(uchar,uint);
void write_com(uchar com)
{
lcdrs=0;
P1=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P1=date;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void clean2()
{
write_com(0x80+0x40);
for(num=0;num<16;num++)
{
write_data(table4[num]);
delayms(5);
}
}
void clean1()
{
write_com(0x80);
for(num=0;num<16;num++)
{
write_data(table4[num]);
delayms(5);
}
}
void keyscan()
{
if(key1==0)
{
delayms(10);
if(key1==0)
{
ET0=~ET0;
}
}
if(key2==0)
{
delayms(10);
if(key2==0)
{
n--;
if(n==0)
n=3;
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
n++;
if(n==4)
n=1;
}
}
}
void init()
{ lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
TMOD=0x11;
EA=1;
ET1=1;
TR1=1;
ET0=0;
TR0=1;
IT0=1;
EX0=1;
x=0;
}
void internationalsong()
{
musicalnotea(3,269);//低A
musicalnotea(9,238);//低B
musicalnotea(18,198);//D
delayus(1000);
x=0;
musicalnotea(6,198);//D
musicalnotea(12,223);//C
musicalnotea(12,238);//低B
musicalnotea(18,269);//低A
musicalnotea(6,238);//低B
delayus(1000);
x=0;
musicalnotea(3,238);//低B
musicalnotea(15,223);//C
musicalnotea(3,238);//低B
musicalnotea(3,223);//C
musicalnotea(18,238);//低B
delayus(1000);
x=0;
musicalnotea(6,238);//低B
musicalnotea(18,269);//低A
delayus(1000);
x=0;
musicalnotea(6,269);//低A
musicalnotea(24,298);//低G
delayms(600);
x=0;
musicalnotea(12,198);//D
musicalnotea(18,148);//G
musicalnotea(6,158);//#F
musicalnotea(6,133);//A
musicalnotea(6,148);//G
musicalnotea(6,198);//D
musicalnotea(6,238);//低B
musicalnotea(18,178);//E
delayus(1000);
x=0;
musicalnotea(6,178);//E
musicalnotea(12,223);//C
delayms(300);
x=0;
musicalnotea(6,178);//E
musicalnotea(18,133);//A
musicalnotea(6,148);//G
musicalnotea(6,158);//#F
musicalnotea(6,178);//E
musicalnotea(6,198);//D
musicalnotea(6,223);//C
musicalnotea(24,238);//低B
delayms(600);
x=0;
musicalnotea(12,198);//D
musicalnotea(18,148);//G
musicalnotea(6,158);//#F
musicalnotea(6,133);//A
musicalnotea(6,148);//G
musicalnotea(6,198);//D
musicalnotea(6,238);//低B
musicalnotea(18,178);//E
delayus(1000);
x=0;
musicalnotea(6,178);//E
musicalnotea(6,223);//C
musicalnotea(6,178);//E
musicalnotea(6,133);//A
musicalnotea(6,148);//G
musicalnotea(12,158);//#F
musicalnotea(12,133);//A
musicalnotea(12,111);//高C
musicalnotea(12,158);//#F
musicalnotea(30,148);//G
delayms(300);
x=0;
musicalnotea(9,118);//B
musicalnotea(3,133);//A
musicalnotea(24,158);//#F
musicalnotea(6,178);//E
musicalnotea(6,158);//#F
musicalnotea(6,148);//G
musicalnotea(6,178);//E
musicalnotea(24,158);//#F
musicalnotea(12,198);//D
musicalnotea(6,210);//#C
musicalnotea(6,198);//D
musicalnotea(18,178);//E
delayus(1000);
x=0;
musicalnotea(6,178);//E
musicalnotea(18,133);//A
musicalnotea(6,148);//G
musicalnotea(30,158);//#F
delayms(300);
x=0;
musicalnotea(12,133);//A
delayus(1000);
x=0;
musicalnotea(18,133);//A
musicalnotea(6,158);//#F
musicalnotea(6,198);//D
delayus(1000);
x=0;
musicalnotea(6,198);//D
musicalnotea(6,210);//#C
musicalnotea(6,198);//D
musicalnotea(24,118);//B
musicalnotea(6,148);//G
musicalnotea(6,178);//E
musicalnotea(6,158);//#F
musicalnotea(6,148);//G
musicalnotea(12,158);//#F
musicalnotea(12,133);//A
musicalnotea(12,148);//G
musicalnotea(12,178);//E
musicalnotea(30,198);//D
delayms(300);
x=0;
musicalnotea(9,118);//B
musicalnotea(3,133);//A
musicalnotea(24,148);//G
musicalnotea(18,198);//D
musicalnotea(6,238);//低B
musicalnotea(24,178);//E
musicalnotea(6,223);//C
delayms(300);
x=0;
musicalnotea(9,133);//A
musicalnotea(3,148);//G
musicalnotea(24,158);//#F
musicalnotea(12,178);//E
musicalnotea(12,198);//D
delayus(1000);
x=0;
musicalnotea(30,198);//D
delayms(300);
x=0;
musicalnotea(12,198);//D
musicalnotea(24,118);//B
musicalnotea(12,133);//A
musicalnotea(12,198);//D
musicalnotea(24,148);//G
musicalnotea(18,158);//#F
delayus(1000);
x=0;
musicalnotea(6,158);//#F
musicalnotea(18,178);//E
musicalnotea(6,188);//#D
musicalnotea(12,178);//E
musicalnotea(12,133);//A
delayus(1000);
x=0;
musicalnotea(30,133);//A
delayms(300);
x=0;
musicalnotea(9,118);//B
musicalnotea(3,133);//A
musicalnotea(24,148);//G
musicalnotea(18,198);//D
musicalnotea(6,238);//低B
musicalnotea(24,178);//E
musicalnotea(6,223);//C
delayms(300);
x=0;
musicalnotea(9,133);//A
musicalnotea(3,148);//G
musicalnotea(24,158);//#F
musicalnotea(12,178);//E
musicalnotea(12,198);//D
musicalnotea(36,118);//B
delayus(1000);
x=0;
musicalnotea(12,118);//B
musicalnotea(24,99);//高D
musicalnotea(12,111);//高C
musicalnotea(12,118);//B
musicalnotea(18,133);//A
musicalnotea(6,118);//B
musicalnotea(12,111);//高C
delayms(300);
x=0;
musicalnotea(6,111);//高C
musicalnotea(18,118);//B
delayus(1000);
x=0;
musicalnotea(6,118);//B
musicalnotea(18,133);//A
delayus(1000);
x=0;
musicalnotea(6,133);//A
while(x<24) //G
{
speaker=1;
delayus(148);
if(n!=1)
break;
speaker=0;
delayus(148);
if(n!=1)
break;
}
if(n>1)
n--;
if(n<1)
n++;
x=0;
n++;
}
void icegirl()
{
delayms(800);
x=0;
musicalnoteb(6,210);//#C
musicalnoteb(6,238);//B
musicalnoteb(4,210);//#C
musicalnoteb(16,178);//E
musicalnoteb(4,423);//低#C
musicalnoteb(4,210);//#C
musicalnoteb(4,238);//B
musicalnoteb(4,210);//#C
musicalnoteb(4,178);//E
musicalnoteb(4,158);//#F
musicalnoteb(4,210);//#C
musicalnoteb(4,238);//B
musicalnoteb(6,210);//#C
musicalnoteb(6,238);//B
musicalnoteb(4,210);//#C
musicalnoteb(16,178);//E
musicalnoteb(4,423);//低#C
musicalnoteb(4,210);//#C
musicalnoteb(4,238);//B
musicalnoteb(4,210);//#C
musicalnoteb(8,140);//#G
musicalnoteb(8,158);//#F
musicalnoteb(6,210);//#C
musicalnoteb(6,238);//B
musicalnoteb(4,210);//#C
musicalnoteb(16,178);//E
musicalnoteb(4,538);//低低A
musicalnoteb(4,210);//#C
musicalnoteb(4,238);//B
musicalnoteb(4,210);//#C
musicalnoteb(4,178);//E
musicalnoteb(4,158);//#F
musicalnoteb(4,210);//#C
musicalnoteb(4,238);//B
musicalnoteb(6,210);//#C
musicalnoteb(6,238);//B
musicalnoteb(4,210);//#C
musicalnoteb(12,178);//E
musicalnoteb(4,210);//#C
musicalnoteb(4,538);//低低A
musicalnoteb(4,210);//#C
musicalnoteb(6,140);//#G
delayus(1000);
x=0;
musicalnoteb(6,140);//#G
musicalnoteb(4,158);//#F
musicalnoteb(2,269);//低A
musicalnoteb(2,238);//低B
musicalnoteb(2,223);//C
musicalnoteb(2,198);//D
musicalnoteb(4,448);//低C
musicalnoteb(4,198);//D
musicalnoteb(4,178);//E
musicalnoteb(8,398);//低D
musicalnoteb(4,148);//G
musicalnoteb(4,158);//#F
musicalnoteb(4,198);//D
musicalnoteb(8,178);//E
musicalnoteb(4,358);//低E
musicalnoteb(4,198);//D
musicalnoteb(4,398);//低D
musicalnoteb(4,178);//E
musicalnoteb(4,158);//#F
musicalnoteb(4,148);//G
musicalnoteb(12,118);//B
delayus(1000);
x=0;
musicalnoteb(4,118);//B
musicalnoteb(4,148);//G
delayus(1000);
x=0;
musicalnoteb(2,148);//G
musicalnoteb(2,118);//B
musicalnoteb(4,148);//G
musicalnoteb(4,158);//F
musicalnoteb(20,178);//E
delayus(1000);
x=0;
musicalnoteb(4,178);//E
musicalnoteb(4,148);//G
musicalnoteb(4,118);//B
musicalnoteb(12,89);//高E
delayus(1000);
x=0;
musicalnoteb(4,89);//高E
musicalnoteb(4,99);//D
delayus(1000);
x=0;
musicalnoteb(2,99);//高D
musicalnoteb(2,89);//高E
musicalnoteb(4,99);//高D
musicalnoteb(4,133);//A
musicalnoteb(24,118);//B
musicalnoteb(8,79);//高#F
musicalnoteb(12,74);//高G
delayus(1000);
x=0;
musicalnoteb(4,74);//高G
musicalnoteb(4,79);//高#F
musicalnoteb(4,74);//高G
musicalnoteb(4,59);//高B
musicalnoteb(4,79);//高#F
musicalnoteb(4,67);//高A
musicalnoteb(4,89);//高E
musicalnoteb(4,105);//高#C
musicalnoteb(4,67);//高A
musicalnoteb(4,89);//高E
musicalnoteb(4,105);//高#C
musicalnoteb(8,79);//高#F
musicalnoteb(4,74);//高G
musicalnoteb(4,89);//高E
musicalnoteb(4,118);//高低B
musicalnoteb(4,74);//高G
musicalnoteb(4,79);//高#F
musicalnoteb(4,99);//高D
musicalnoteb(4,133);//高低A
musicalnoteb(4,79);//高#F
delayus(1000);
x=0;
musicalnoteb(12,79);//高#F
musicalnoteb(4,89);//高E
delayus(1000);
x=0;
while(x<14)
{
speaker=1;
delayus(89);
if(n!=2)
break;
speaker=0;
delayus(89);
if(n!=2)
break;
}
if(n>2)
n--;
if(n==2)
n++;
x=0;
}
void unknown()
{
x=0;
musicalnotec(7,223);//C
musicalnotec(7,167);//F
musicalnotec(21,133);//A
delayus(1800);
x=0;
musicalnotec(7,133);//A
delayus(1800);
x=0;
musicalnotec(14,133);//A
musicalnotec(7,148);//G
musicalnotec(7,133);//A
musicalnotec(7,148);//G
musicalnotec(14,167);//F
delayus(1800);
x=0;
musicalnotec(7,167);//F
delayus(1800);
x=0;
musicalnotec(14,167);//F
musicalnotec(7,223);//C
musicalnotec(7,167);//F
musicalnotec(14,133);//A
musicalnotec(7,167);//F
musicalnotec(7,133);//A
musicalnotec(14,111);//高C
musicalnotec(7,126);//#A
musicalnotec(7,133);//A
musicalnotec(21,148);//G
delayus(1800);
x=0;
musicalnotec(7,148);//G
delayus(1800);
x=0;
musicalnotec(14,148);//G
musicalnotec(7,111);//高C
musicalnotec(7,126);//#A
musicalnotec(14,133);//A
delayus(1800);
x=0;
musicalnotec(7,133);//A
musicalnotec(7,148);//G
musicalnotec(14,167);//F
musicalnotec(7,148);//G
musicalnotec(7,133);//A
musicalnotec(7,111);//高C
musicalnotec(14,126);//#A
delayus(1800);
x=0;
musicalnotec(7,126);//#A
delayus(1800);
x=0;
musicalnotec(14,126);//#A
musicalnotec(7,198);//D
musicalnotec(7,210);//#C
musicalnotec(14,223);//C
musicalnotec(7,178);//E
musicalnotec(7,167);//F
musicalnotec(14,148);//G
musicalnotec(7,133);//A
musicalnotec(7,148);//G
while(x<42)
{
speaker=1;
delayus(167);
if(n!=3)
break;
speaker=0;
delayus(167);
if(n!=3)
break;
}
if(n==3)
{n=1;
ET0=1;}
x=0;
}
void main()
{
init();
write_com(0x90);
for(num=0;num<7;num++)
{
write_data(table[num]);
delayms(5);
}
write_com(0x90+0x40);
for(num=0;num<13;num++)
{
write_data(table1[num]);
delayms(5);
}
for(num=0;num<16;num++)
{
write_com(0x1c);
delayms(100);
}
write_com(0x01);
ET0=1;
while(1)
{
while(n==1)
{
clean1();
write_com(0x80);
for(num=0;num<10;num++)
{
write_data(table5[num]);
delayms(5);
}
internationalsong();
}
while(n==2)
{
clean1();
write_com(0x80);
for(num=0;num<10;num++)
{
write_data(table6[num]);
delayms(5);
}
icegirl();
}
while(n==3)
{
clean1();
write_com(0x80);
for(num=0;num<10;num++)
{
write_data(table7[num]);
delayms(5);
}
unknown();
}
}
}
void musicalnotea(uchar a,uint y)
{
while(x<a)
{
speaker=1;
delayus(y);
if(n!=1)
break;
speaker=0;
delayus(y);
if(n!=1)
break;
}
x=0;
}
void musicalnoteb(uchar a,uint y)
{
while(x<a)
{
speaker=1;
delayus(y);
if(n!=2)
break;
speaker=0;
delayus(y);
if(n!=2)
break;
}
x=0;
}
void musicalnotec(uchar a,uint y)
{
while(x<a)
{
speaker=1;
delayus(y);
if(n!=3)
break;
speaker=0;
delayus(y);
if(n!=3)
break;
}
x=0;
}
void delayus(uint y)
{
while(y>0)
{
y--;
}
}
void delayms(uint yms)
{
uint i,j;
for(i=yms;i>0;i--)
for(j=110;j>0;j--);
}
void T0_time()interrupt 1
{
clean2();
write_com(0x80+0x40);
for(num=0;num<10;num++)
{
write_data(table3[num]);
delayms(5);
}
while(1)
{
if(key1==0)
{
delayms(10);
if(key1==0)
{
clean2();
write_com(0x80+0x40);
for(num=0;num<8;num++)
{
write_data(table2[num]);
delayms(5);
}
break;}
}
if(key2==0)
{
n--;
if(n==0)
n=3;
}
if(key3==0)
{
n++;
if(n==4)
n=1;
}
}
}
void T1_time()interrupt 3
{
TH1=(65535-45872)/256;
TL1=(65535-45872)%256;
x++;
}
void INT0_time()interrupt 0
{
keyscan();
}
1. 80196单片机IP研究与实现,TN914.42
2. AT89S52单片机实验系统的开发与应用,TG155.1 F406
3. 基于单片机的LED三维动态信息显示系统,O536 TG174.444
4. 基于单片机的IGBT光伏充电控制器的研究,TV732.1 TV312
5. 基于89C52单片机的印刷品色彩质量检测系统的研究,
展开阅读全文