音乐倒数计时器单片机课程设计报告Word下载.docx
《音乐倒数计时器单片机课程设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《音乐倒数计时器单片机课程设计报告Word下载.docx(20页珍藏版)》请在冰豆网上搜索。
XT.1L1沖
^EV:
ULI-
口w
KfiT*
丸」AL亠
S:
•MND|||—^'
KXTZktt7
KITi»
nrt~
3■_
TXD11
KF^-p-
m
]>
ZL
r^E-A
]
L並舶
PLOT;
TOC
P]1T7IX
回抻。
PLZ
JLD1T0.1
PM
g:
科:
PL4
LDs-PQl
P12
iD^FO舛
FL*
ADJNJ
PLT
JJliM£
JCT
ADmK/
FSKAX?
Ea
PJ1TKD
p^Txli
Piznm
P^EX
Pkl:
fl?
!
AC!
Pl+TCI
Ai*n.f
V^JTI
A1>
T2:
!
A12^4
阳「w
Aiirxj
KTAL2
AlfliT±
-I
XTJ1.1
皿礼1
GND
Aino1
乂T3ET
•亟
1=RE5
J:
n>
-
2.4电路仿真图如下:
H
4
電1
3
_H'
VlML
UiU■■片
L怕1
IND就
t
1h
7干Era
Ul
■JCTALf
FUAEOPBIMI
FH2A02
XTAlZ
巾轴,PH他DI*
PH詡眄
KAT
lOTft^vrnHi
**iw
町衲■
iJK
M£
EA
p莹阳応鮭『m
n.l•订
FM1WP3_uirrT
I1A
oiirrt
*15
阴斗T1
IHJ
出硕J_
FU
F?
W
JG
I
亠
J_
MW4
1
i
IK
三、系统软件设计
音乐倒数计时器软件设计关键是实现音乐的播放。
利用定时计数器,通过载入不同的计数初值,产生频率不同的方波,输入到蜂鸣器(SOUNER中,使其
发出频率不同的声音。
本设计中单片机晶振为11.0592MHz通过计算各音阶频
率,可得1、2、3、4、5、6、7共7个音应赋给定时器的初值为64580、64684、64777、64820、64898、64968、65030。
通过K1~K5开关进行控制时间设置来完成其基本功能,当倒计时为零时,通过通过蜂鸣器放出一段音乐。
3.1系统基本流程图如下:
开始
LCD初始化
时间为
K3是否按下
10min
Y
—r—口才…=
N
K5是否按下
计时结束
<
—
开始计时
K6是否按下
Music
3.2部分程序如下:
#include<
reg52.h>
intrins.h>
#definetime100
#defineuintunsignedint
#defineucharunsignedchar
uintflag,flag0,flag1,flag2,flag3,flag4,flag5,minute,second=60;
intt=0,flag6=0;
ucharnum,j,i,k=0,time_H,time_L,times,m,n,p;
ucharcodetable[]="
TIME00:
00"
;
ucharcodeFREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8低音0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,//1,2,3,4,5,6,7,!
0xFC,0xFD,0xFD,0xFD,0xFD,0xFI高音1234567
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xF超}高/音
ucharcodeFREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,//低音1234567
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,//1,2,3,4,5,6,7,i
0xEE,0x44,0x6B,0xB4,0xF4,0x2D,//高音234567
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16};
//超高音1234567
ucharcodeMUSIC[]={3,2,2,
3,2,2,
3,2,4,
5,2,2,
1,2,3,
2,2,1,
4,2,2,
4,2,3,
3,2,1,
2,2,2,
1,2,2,
5,2,3,
5,1,2,
5,1,3,
5,1,1,
6,1,3,
6,1,2,
0,0,0}
sbitkey1=P3A3;
sbitkey2=P3A4;
sbitkey3=P3A5;
sbitkey4=P3A6;
sbitkey5=P3A7;
sbitP1_0=P1A0;
sbitRS=P2A5;
sbitRW=P2A6;
sbitE=P2A7;
sbitled_red=P1A3;
voidwrite_time(uintaddr,uintdate);
voiddelay(uintz)//延时函数//{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
voiddelay1(unsignedchard)//us延时
{while(--d);
voiddelay2(unsignedchard)//延时1mS
while(d--)
{delay1(245);
delay1(245);
voiddelay3(uchard)//延时125ms,4/4拍
{
for(m=0;
m<
d;
m++)delay2(125);
TR1=0;
voidSong(){
TH仁time_H;
〃赋值定时器时间,决定频率TL1=time_L;
TR1=1;
//打开定时器
delay3(times);
//延时所需要的节拍
voidwrite_com(ucharcom)//1602写命令函数//{
RS=0;
P0=com;
delay(5);
E=1;
delay(10);
E=0;
voidwrite_date(uchardate)//1602写数据函数//{
RS=1;
P0=date;
voidKEY1()//按键1//
while(flag1)
if(key2==0)
delay(time);
if(minute<
60)minute=minute+1;
write_time(7,minute);
if(key3==0)
if(minute>
0)minute=minute-1;
if(key4==0||key5==0)
delay(150);
{flag1=0;
flag=1;
TR0=1;
voidKEY2()//按键2//
minute=5;
while(flag2)
if(key5==0)
flag2=0;
flag=1;
TR0=1;
voidKEY3()
minute=10;
while(flag3)
if(key5==0){flag3=0;
voidKEY4()
minute=20;
while(flag4)
if(key5==0){
if(key5==0){flag4=0;
//按键3
//按键4
voidwrite_time(uintaddr,uintdate)
uintge,shi;
ge=date%10;
shi=date/10;
write_com(0x80+addr);
write_date(0x30+shi);
write_date(0x30+ge);
if(addr==7&
&
date==0)
j=1;
if(j==1&
addr==10&
date==0){
flag0=1;
TR0=0;
flag5=1;
voidinit()
P3=0xff;
RW=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=0xfc;
TL1=0x44;
ET1=1;
ET0=1;
EA=1;
for(num=0;
num<
12;
num++)
write_date(table[num]);
delay(20);
//lcd1602初始化
//flag5=1
voidstart()
{if(key1==0){
if(key1==0)
flag0=0;
flag1=1;
KEY1();
}if(key2==0)
if(key2==0){
flag2=1;
KEY2();
}if(key3==0)
flag3=1;
KEY3();
}if(key4==0)
if(key4==0)
flag4=1;
KEY4();
//按键初始化
voidwrite_time0()//倒计程序的子初始化程序{
minute=minute-1;
write_time(7,minute);
write_time(10,59);
flag=0;
voidcounter()//倒计程序
while(flag6)
{led_red=~led_red;
if(flag==1)write_time0();
t=0;
flag6=0;
second=second-1;
write_time(10,second);
if(k==1&
second==0)
if(second==0)
k=1;
second=59;
intmain()
init();
while
(1)
while(flag0)
start();
counter();
while(flag5)
TMOD=0x10;
//置定时器1工作方式1EA=1;
//打开全局中断
while(1{
//打开定时1中断
i=0;
while(i<
140)
{//音乐数组长度,循环播放n=MUSIC[i]+7*MUSIC[i+1-]1;
//去音符振荡频率所需数据time_H=FREQH[n];
time_L=FREQL[n];
times=MUSIC[i+2];
//节拍时长
i=i+3;
Song();
return0;
voidinter0()interrupt1//中断T0
TL0=(65536-50000)%256;
t++;
if(t==20)
flag6=1;
//中断T1
voidinter1()interrupt3
P1_0=!
P1_0;
TH1=time_H;
TL1=time_L;