音乐倒数计时器单片机课程设计报告.docx
《音乐倒数计时器单片机课程设计报告.docx》由会员分享,可在线阅读,更多相关《音乐倒数计时器单片机课程设计报告.docx(15页珍藏版)》请在冰豆网上搜索。
![音乐倒数计时器单片机课程设计报告.docx](https://file1.bdocx.com/fileroot1/2022-11/27/0484baff-586a-4faa-b180-99a6471d331b/0484baff-586a-4faa-b180-99a6471d331b1.gif)
音乐倒数计时器单片机课程设计报告
音乐倒是计时器
一、设计要求
利用STC89C51单片机结合字符型LCD显示器设计一个简易的倒数计数器,可用来煮方便面、煮开水或小睡片刻等。
做一小段时间倒计数,当倒计数为0时,则发出一段音乐声响,通知倒计数终了,该做应当做的事。
同时输出控制一个继电器吸合,继电器驱动一个3W的大功率LED灯,亮度可以由单片机控制从50%~100%连续可调。
定时闹钟的基本功能如下。
⏹字符型LCD(16 2)显示器。
⏹显示格式为“TIME分分:
秒秒”。
⏹用4个按键操作来设置当前想要倒计数的时间。
一旦按下键则开始倒计数,当计数为0时,发出一阵音乐声。
1、程序执行后工作指示灯LED闪动,表示程序开始执行,按下操作键K1~K4动作如下。
K1—可调整倒计数的时间1~60分钟。
K2—设置倒计数的时间为5分钟,显示“0500”。
K3—设置倒计数的时间为10分钟,显示“1000”。
K4—设置倒计数的时间为20分钟,显示“2000”。
2、复位后LCD的画面应能显示倒计时的分钟和秒数,此时按K1键则在LCD上显示出设置画面。
此时,若:
a.按操作键K2—增加倒计数的时间1分钟。
b.按操作键K3—减少倒计数的时间1分钟。
c.按操作键K4—设置完成。
二、系统硬件说明
2.1:
音乐倒是计时器要实现一种由单片机控制的带LCD显示的倒数计时器,单片机工作于12MHZ时钟频率,使用其定时/计数器T0,改变计数值TH0和TL0可以产生不同频率的脉冲信号。
该设计具有5个功能按键,用户可以通过这些按键设置定时时间和选择控制定时,倒计数为零时,可通过扬声器将音乐播放出来。
系统结构图如下图所示。
2.2AT89C52
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,但不可以在线编程(S系列的才支持在线编程)。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
主要特性:
·兼容MCS51指令系统·8k可反复擦写(>1000次)FlashROM
·32个双向I/O口·256x8bit内部RAM
·3个16位可编程定时/计数器中断·时钟频率0-24MHz
·2个串行中断·可编程UART串行通道
·2个外部中断源·共8个中断源
·2个读写中断口线·3级加密位
·低功耗空闲和掉电模式
2.3电路原理图如下:
2.4电路仿真图如下:
三、系统软件设计
音乐倒数计时器软件设计关键是实现音乐的播放。
利用定时计数器,通过载入不同的计数初值,产生频率不同的方波,输入到蜂鸣器(SOUNER)中,使其发出频率不同的声音。
本设计中单片机晶振为11.0592MHz,通过计算各音阶频率,可得1、2、3、4、5、6、7共7个音应赋给定时器的初值为64580、64684、64777、64820、64898、64968、65030。
通过K1~K5开关进行控制时间设置来完成其基本功能,当倒计时为零时,通过通过蜂鸣器放出一段音乐。
3.1系统基本流程图如下:
3.2部分程序如下:
#include
#include
#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,//低音1234567
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,//1,2,3,4,5,6,7,!
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,//高音1234567
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF};//超高音1234567
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,3,2,2,3,2,2,3,2,4,3,2,2,
5,2,2,1,2,3,2,2,1,3,2,4,4,2,2,4,2,2,
4,2,3,4,2,2,4,2,2,3,2,2,3,2,2,3,2,1,3,2,1,
3,2,2,2,2,2,2,2,2,1,2,2,2,2,2,5,2,3,5,1,2,
5,1,2,3,2,2,2,2,2,1,2,2,5,1,3,5,1,1,
5,1,1,5,1,2,3,2,2,2,2,2,1,2,2,6,1,3,6,1,2,
6,1,2,4,2,2,3,2,2,2,2,2,6,1,3,6,1,2,0,0,0};
sbitkey1=P3^3;
sbitkey2=P3^4;
sbitkey3=P3^5;
sbitkey4=P3^6;
sbitkey5=P3^7;
sbitP1_0=P1^0;
sbitRS=P2^5;
sbitRW=P2^6;
sbitE=P2^7;
sbitled_red=P1^3;
voidwrite_time(uintaddr,uintdate);
voiddelay(uintz)//延时函数//
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);}
voiddelay1(unsignedchard)//us延时
{
while(--d);
}
voiddelay2(unsignedchard)//延时1mS
{
while(d--)
{delay1(245);
delay1(245);
}
}
voiddelay3(uchard)//延时125ms,4/4拍
{
for(m=0;mdelay2(125);
TR1=0;
}
voidSong(){
TH1=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;
delay(5);
E=1;
delay(10);
E=0;
}
voidKEY1()//按键1//
{
while(flag1)
{
if(key2==0)
{
delay(time);
if(key2==0)
{
if(minute<60)
minute=minute+1;
write_time(7,minute);
}
}
if(key3==0)
{
delay(time);
if(key3==0)
{
if(minute>0)
minute=minute-1;
write_time(7,minute);
}
}
if(key4==0||key5==0)
{
delay(150);
if(key4==0||key5==0)
{
flag1=0;
flag=1;
TR0=1;
}
}
}
}
voidKEY2()//按键2//
{
minute=5;
write_time(7,minute);
while(flag2)
{
if(key5==0)
{
delay(time);
if(key5==0)
{
flag2=0;
flag=1;
TR0=1;
}
}
}
}
voidKEY3()//按键3
{
minute=10;
write_time(7,minute);
while(flag3)
{
if(key5==0)
{
delay(time);
if(key5==0)
{
flag3=0;
flag=1;
TR0=1;
}
}
}
}
voidKEY4()//按键4
{
minute=20;
write_time(7,minute);
while(flag4)
{
if(key5==0){
delay(150);
if(key5==0){
flag4=0;
flag=1;
TR0=1;
}
}
}
}
voidwrite_time(uintaddr,uintdate)//lcd1602初始化
{
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;
TR1=1;
flag5=1;//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;
TR0=1;
EA=1;
flag0=1;
for(num=0;num<12;num++)
{
write_date(table[num]);
delay(20);
}
}
voidstart()//按键初始化
{
if(key1==0)
{
delay(time);
if(key1==0)
{
flag0=0;
flag1=1;
KEY1();
}
}
if(key2==0)
{
delay(time);
if(key2==0)
{
flag0=0;
flag2=1;
KEY2();
}
}
if(key3==0)
{
delay(time);
if(key3==0)
{
flag0=0;
flag3=1;
KEY3();
}
}
if(key4==0)
{
delay(150);
if(key4==0)
{
flag0=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(minute>0)
minute=minute-1;
write_time(7,minute);
}
if(second==0)
{
k=1;
second=59;
}
}
}
intmain()
{
init();
while
(1)
{
while(flag0)
start();
counter();
while(flag5)
{
TMOD=0x10;//置定时器1工作方式1
EA=1;//打开全局中断
ET1=1;//打开定时1中断
while(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
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==20)
flag6=1;
}
voidinter1()interrupt3//中断T1
{
TR1=0;
P1_0=!
P1_0;
TH1=time_H;
TL1=time_L;
TR1=1;
}