#51单片机实现的音乐闹钟程序代码.docx
- 文档编号:4636587
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:15
- 大小:17.64KB
#51单片机实现的音乐闹钟程序代码.docx
《#51单片机实现的音乐闹钟程序代码.docx》由会员分享,可在线阅读,更多相关《#51单片机实现的音乐闹钟程序代码.docx(15页珍藏版)》请在冰豆网上搜索。
#51单片机实现的音乐闹钟程序代码
功能描述:
产品可以显示时间和日期,时间格式为hhmmss 日期格式为yy.mm.dd
时间和日期轮流显示。
时间显示5S日期显示3S。
可以设置5个闹铃,闹铃音乐可以设置两种:
毛驴和童年。
三个按键对时间和闹铃进行设置,六个LED进行显示。
计时采用DS1307。
继电时间不丢失,设置过的闹铃也不丢失。
闹铃音乐由单片机的两个定时器去产生频率实现。
部分程序如下:
//*************************************************
//************************************************
//***********************************************
//程序名:
DS1307时钟程序
//功能描述:
用六个八段LED轮流显示时间
// 和日期。
有6个闹钟。
上电时从DS1307中读出
// 当前时间、日期、闹钟。
//
//
//
//
//
#include
#include
#defineucharunsignedchar
#defineuint unsignedint
#defineLEDP2
#defineLEDBitP0
#definenop _nop_(>
#defineLightCount 40
#defineLightMax 80
sbitSCL=P3^1。
sbitSDA=P3^0。
sbitModeKey=P1^0。
sbitUpKey=P1^1。
sbitDownKey=P1^2。
sbitSpeak=P3^6。
codeucharLCD_NUM[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}。
//0x25,
//uchar Clock[]={0x88,0x88,0x88}。
codeuint Music_Sound_Long1[]={4,8,4,8,8,4,8,4,4,4, /*童年*/
8,4,8,4,4,4,4,4,16,4,
4,8,4,4,4,4,4,8,4,4,
4,8,4,4,4,4,4,4,16,4,
4,8,4,4,4,4,4,8,4,4,
4,8,4,4,4,4,4,4,16,4,
8,4,8,4,4,4,8,8,4,4,
4,4,4,4,4,4,4,4,4,16,
4,8,4,8,8,4,8,4,4,4,
8,4,8,4,4,4,4,4,16,4,
8,4,8,8,4,8,4,4,4,8,
4,8,4,4,4,4,4,16,0},
Music_Sound_Long2[]={4,4,4,4,4,4,4,4,4,4, /*小毛驴*/
4,4,16,4,4,4,4,4,4,4,
4,4,4,4,4,8,4,4,4,4,
4,4,4,4,4,4,4,4,4,16,
4,4,4,4,2,2,2,2,4,4,
4,4,4,4,16,0},
Music_Sound_Tone1[]={379,379,379,379,425,477,477,477,425,477,
568,637,637,637,568,637,425,379,477,719, 637,637,719,637,568,568,506,568,568,568,
637,477,477,477,477,568,477,568,637,719,
637,637,719,637,568,568,506,568,568,568,
637,477,477,477,477,568,568,477,851,318,
318,318,318,379,425,477,477,568,477,568,
477,425,425,425,425,425,477,379,425,425,
379,379,379,379,425,477,477,477,425,477,
568,637,637,637,568,637,425,379,477,379,
379,379,379,425,477,477,477,425,477,568,
637,637,637,568,637,425,379,477,0}, /*童年*/
Music_Sound_Tone2[]={956,956,956,719,637,637,637,637,568,568, /*小毛驴*/
568,477,637,716,716,716,568,719,719,719,
719,851,851,851,851,637,637,956,956,956,
719,637,637,637,637,568,568,568,477,637,
716,716,716,568,719,719,719,719,719,719,
851,851,851,719,956,0}。
uchar DS1307[27]={0}。
//00为秒,01为分,02为时
//10为日,11为月,12为年
//20为闹钟控制,21为分,22为时。
//30为闹钟控制,31为分,32为时。
//40为闹钟控制,41为分,42为时。
//同上
//同上
//闹钟控制十位为闹钟数
//闹钟控制个位为选择闹钟声音程序
//个位为零关闭闹钟
uchar DisplayArr[8][3]={0}。
//*********************************
voidBeep(void>。
voidDiplayClock(uchar*>。
//voidUsuaDisPlay(uchar*>。
voidDelay(uintCount>。
voidDiplayDelay(void>。
voidStart(void>。
voidStop(void>。
voidack(bit>。
bitcack(void>。
voidSend8bit(unsignedchar>。
//高字节位先传字节最低位1为读,0为写
unsignedcharRead8bit(void>。
voidSendWord(unsignedchar,unsignedchar>。
unsignedcharReadWord(unsignedchar>。
voidReadDS1307(uchar>。
//**************************
voidModeButten(void>。
voidUpButten(void>。
voidDownButten(void>。
//********************
//函数名:
INC
//功能:
加1函数
voidINC(void>。
unsignedcharInc(uchar>。
unsignedcharDec(uchar>。
voidRing(void>。
//*********************************
ucharMode=0。
//Mode=0轻按UP、Down为查看时间、日期、闹钟
//Mode=1
ucharRead=0。
//Read==1为读DS1307
ucharJuge=0。
//闪烁位数
ucharDisplyMode。
ucharLight。
ucharBlack。
ucharDisplayLoop。
ucharRingFlag。
uchar Sound_Long_Count。
uintPeriod。
/********************* 音乐频率中断 ******************************************/
voidMusic_Tone(>interrupt3using2
{
Speak=!
Speak。
TL1=(65536-Period>&0xff。
TH1=(65536-Period>>>8。
TF1=0。
}
/********************** 10ms中断变量 ***************************************/
voidMusic_Long(>interrupt1 using3
{
if(Sound_Long_Count!
=0>Sound_Long_Count--。
TL0=(65536-10000>&0xff。
TH0=(65536-10000>>>8。
TF0=0。
/* TL2=(65536-10000>&0xff。
TH2=(65536-10000>>>8。
TF2=0。
*/
}
//***********************************
main(>
{
uchari,j,Loop。
uchar RingMinBuffer。
uchar RingHouBuffer。
uchar RingMinBufferOld=0xff。
ucharRingTimeLong。
TMOD=0x11。
/*开定时器0,工作在方式3模式下*/
// TH0=TL0=0x6。
/*置定时器初值*/
TL0=(65536-10000>&0xff。
TH0=(65536-10000>>>8。
IE=0xca。
/*允许定时器中断*/
// ET2=1。
//**************************************************88
//**************************************************
/*
for(i=0。
i<6。
i++>
{
Stop(>。
Start(>。
Send8bit(0xD0>。
if(cack(>==1>continue。
Send8bit(0x08+i*0x03>。
if(cack(>==1>continue。
Send8bit(i*0x10+0x10>。
if(cack(>==1>continue。
Stop(>。
}
*/
ReadDS1307(26>。
for(DisplyMode=0。
DisplyMode<8。
DisplyMode++>
{
INC(>。
}
DisplyMode=0。
ReadDS1307(26>。
for(i=0,Loop=0。
i<8。
i++>
for(j=0。
j<3。
j++,Loop++>
{
if(Loop==3>Loop++。
if(Loop==7>Loop++。
DisplayArr[i][j]=DS1307[Loop]。
}
for(i=2。
i<8。
i++>
for(j=0。
j<3。
j++>
{
switch(j>
{
case0:
DisplayArr[i][j]&=0x73。
break。
//开关闹钟
case1:
DisplayArr[i][j]&=0x7F。
break。
//分钟
case2:
DisplayArr[i][j]&=0x3F。
break。
}
}
DisplayArr[1][0]&=0x3F。
//日期
DisplayArr[1][1]&=0x1F。
//月份
Speak=0。
while(1>
{
//DisplayClock(6,Clock>。
//DiplayClock(Clock>。
// DiplayClock(DisplayArr[DisplyMode]>。
//Juge=1。
DiplayClock(DisplayArr[DisplyMode]>。
//*****************************************************************111
//读出的数存入单片机中,
if(Read==1>
{
ReadDS1307(26>。
Read=0。
}
else ReadDS1307(6>。
DiplayClock(DisplayArr[DisplyMode]>。
for(i=0,Loop=0。
i<8。
i++>
for(j=0。
j<3。
j++,Loop++>
{
if(Loop==3>Loop++。
if(Loop==7>Loop++。
DisplayArr[i][j]=DS1307[Loop]。
DiplayClock(DisplayArr[DisplyMode]>。
}
//******************************************************************111
//******************************************************************222
//读出的数格式化
for(i=2。
i<8。
i++>
for(j=0。
j<3。
j++>
{
switch(j>
{
case0:
DisplayArr[i][j]&=0x73。
break。
//开关闹钟
case1:
DisplayArr[i][j]&=0x7F。
break。
//分钟
case2:
DisplayArr[i][j]&=0x3F。
break。
default:
DiplayClock(DisplayArr[DisplyMode]>。
}
DiplayClock(DisplayArr[DisplyMode]>。
}
DisplayArr[1][0]&=0x3F。
//日期
DisplayArr[1][1]&=0x1F。
//月份
//********************************************************************222
DiplayClock(DisplayArr[DisplyMode]>。
// Beep(>。
ModeButten(>。
DownButten(>。
UpButten(>。
DiplayClock(DisplayArr[DisplyMode]>。
//**********************************************333
//日期时间交替显示程序 if(Juge==0>
DisplayLoop++。
if(DisplayLoop>10>DisplyMode=0。
if(DisplayLoop>60>
{
DisplyMode=1。
DisplayLoop=0。
}
//***********************************************333
//************************************************444
//闹钟程序比较
if(Juge==0>
{ for(i=2。
i<8。
i++>
{
DiplayClock(DisplayArr[DisplyMode]>。
if(DisplayArr[i][0]&0x0F==0>continue。
if(DisplayArr[i][1]!
=DisplayArr[0][1]>continue。
RingMinBuffer=DisplayArr[i][1]。
if(RingMinBufferOld==RingMinBuffer>continue。
if(DisplayArr[i][2]!
=DisplayArr[0][2]>continue。
if(RingFlag==0>RingMinBufferOld=0xff。
RingFlag=DisplayArr[i][0]&0x0F。
}
}
//************************************************444
ModeButten(>。
DownButten(>。
UpButten(>。
DiplayClock(DisplayArr[DisplyMode]>。
RingTimeLong=0。
switch(RingFlag>
{
case1:
{
DisplyMode=0。
i=0。
while(DisplayArr[0][1]==RingMinBuffer> /*是否响闹铃1程序*/
{
/* if(DisplayArr[0][1]!
=RingMinBuffer>
{
RingMinBuffer=DisplayArr[0][1]。
RingTimeLong++。
}
*/
RingMinBufferOld=RingMinBuffer。
if(Music_Sound_Long1[i]==0>
{
DiplayClock(DisplayArr[DisplyMode]>。
i=0。
}
Sound_Long_Count=Music_Sound_Long1[i]。
/*****/
Period=Music_Sound_Tone1[i]。
TL1=(65536-Period>&0xff。
TH1=(65536-Period>>>8。
DiplayClock(DisplayArr[DisplyMode]>。
i++。
if(RingFlag==1>
{
TR1=1。
TR0=1。
}
while(Sound_Long_Count!
=0>
{
DiplayClock(DisplayArr[DisplyMode]>。
ModeButten(>。
DownButten(>。
UpButten(>。
DiplayClock(DisplayArr[DisplyMode]>。
if(RingFlag==0>
{
Sound_Long_Count=0。
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 实现 音乐 闹钟 程序代码