音乐倒数计时器单片机课程设计报告.docx

上传人:b****6 文档编号:4107252 上传时间:2022-11-27 格式:DOCX 页数:15 大小:175.05KB
下载 相关 举报
音乐倒数计时器单片机课程设计报告.docx_第1页
第1页 / 共15页
音乐倒数计时器单片机课程设计报告.docx_第2页
第2页 / 共15页
音乐倒数计时器单片机课程设计报告.docx_第3页
第3页 / 共15页
音乐倒数计时器单片机课程设计报告.docx_第4页
第4页 / 共15页
音乐倒数计时器单片机课程设计报告.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

音乐倒数计时器单片机课程设计报告.docx

《音乐倒数计时器单片机课程设计报告.docx》由会员分享,可在线阅读,更多相关《音乐倒数计时器单片机课程设计报告.docx(15页珍藏版)》请在冰豆网上搜索。

音乐倒数计时器单片机课程设计报告.docx

音乐倒数计时器单片机课程设计报告

音乐倒是计时器

一、设计要求

利用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;m

delay2(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;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 政史地

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1