52单片机 时钟 音乐 秒表 程序.docx

上传人:b****7 文档编号:25475885 上传时间:2023-06-09 格式:DOCX 页数:21 大小:17.83KB
下载 相关 举报
52单片机 时钟 音乐 秒表 程序.docx_第1页
第1页 / 共21页
52单片机 时钟 音乐 秒表 程序.docx_第2页
第2页 / 共21页
52单片机 时钟 音乐 秒表 程序.docx_第3页
第3页 / 共21页
52单片机 时钟 音乐 秒表 程序.docx_第4页
第4页 / 共21页
52单片机 时钟 音乐 秒表 程序.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

52单片机 时钟 音乐 秒表 程序.docx

《52单片机 时钟 音乐 秒表 程序.docx》由会员分享,可在线阅读,更多相关《52单片机 时钟 音乐 秒表 程序.docx(21页珍藏版)》请在冰豆网上搜索。

52单片机 时钟 音乐 秒表 程序.docx

52单片机时钟音乐秒表程序

#include

#defineuintunsignedint

#defineucharunsignedchar

#definebit(x)(1<

unsignedinta[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x80};

unsignedcharc=-1;//调时间用的

unsignedcharb[12]={0};

unsignedchard[6]={0,0,5,1,9,1};//调闹钟用的

unsignedcharf=0;

unsignedchare[4]={0};

ucharu=0;//音乐用

ucharCount;//同上

#include

#definewr_second0x80

#definewr_minute0x82

#definewr_hour0x84

#definerd_second0x81

#definerd_minute0x83

#definerd_hour0x85

//

#definewr_day0x86

#definerd_day0x87

#definewr_month0x88

#definerd_month0x89

#definewr_year0x8c

#definerd_year0x8d

//

#definewrite_protect0x8e

sbitCLK=P1^0;//实时时钟时钟线引脚

sbitDIO=P1^1;//实时时钟数据线引脚

sbitRST=P1^2;//实时时钟复位线引脚

sbitACC0=ACC^0;

sbitACC7=ACC^7;

//

sbitreturn0=P3^3;

sbitleft=P3^4;

sbitstop=P3^5;

sbitup=P1^6;

sbityinyue=P1^7;

sbitfiction=P3^2;

sbitSpeak=P1^4;//风频器nb

//

uchars,m,h,day,mon,year;

ucharq=0;//中断用

ucharclock=0;

voiddelay(unsignedms)

{

unsignedi,j;

for(i=0;i

for(j=0;j<150;j++);

}

voidshow(intx,inty)

{

P2=~bit(x);

P0=a[y];

delay

(1);

}

//时间

////////////////////////////////////////////////////////////////////////////////////////////////////////

//写

voidDS1302_wr(ucharaddr,uchardat)//addr:

DS1302地址,dat要写的数据

{

unsignedchari,temp;

RST=0;

CLK=0;

RST=1;

//ACC=addr;

//地址,命令

for(i=8;i>0;i--)

{CLK=0;

temp=addr;

DIO=(bit)(temp&0x01);

addr=addr>>1;

CLK=1;

}

for(i=8;i>0;i--)

{

CLK=0;

temp=dat;

DIO=(bit)(temp&0x01);

dat>>=1;

CLK=1;

}

RST=0;

}

//读

unsignedcharDS1302_rd(unsignedcharaddr)

{

unsignedchari,temp,dat1,dat2;

RST=0;

CLK=0;

RST=1;

//地址,命令

for(i=8;i>0;i--)

{

CLK=0;

temp=addr;

DIO=(bit)(temp&0x01);

addr>>=1;

CLK=1;

}

for(i=8;i>0;i--)

{

ACC7=DIO;

CLK=1;

ACC>>=1;

CLK=0;

}

RST=0;

dat1=ACC;

dat2=dat1/16;

dat1=dat1%16;

dat1=dat1+dat2*10;

return(dat1);

}

voidintial(void)//ds1302初始化

{

DS1302_wr(write_protect,0x00);

//DS1302_wr(wr_second,0x56);

//DS1302_wr(wr_minute,0x34);

//DS1302_wr(wr_hour,0x12);

//DS1302_wr(wr_day,0x07);

//DS1302_wr(wr_month,0x12);

//DS1302_wr(wr_year,0x11);

//DS1302_wr(write_protect,0x80);

}

//////////////////////////////////////////////////////////////////////////////////////////////////////

voidshow_b()//时间日期数码管显示数

{

//uchari;

b[0]=s%10;

b[1]=s/10;

b[2]=m%10;

b[3]=m/10;

b[4]=h%10;

b[5]=h/10;

//

b[6]=day%10;

b[7]=day/10;

b[8]=mon%10;

b[9]=mon/10;

b[10]=year%10;

b[11]=year/10;

}

voidshow_time()//显示时间函数

{

show_b();

show(0,b[0]);

show(1,b[1]);

show(2,10);

show(3,b[2]);

show(4,b[3]);

show(5,10);

show(6,b[4]);

show(7,b[5]);

}

voidshow_day()//显示日期函数

{

show_b();

show(0,b[6]);

show(1,b[7]);

show(2,b[8]);

show(3,b[9]);

show(4,b[10]);

show(5,b[11]);

show(6,0);

show(7,2);

}

/////////////////////////////////////////////////////////////////////////////////////

voidddd(void)//从ds1302读出时、分、秒及日期

{

s=DS1302_rd(rd_second);

m=DS1302_rd(rd_minute);

h=DS1302_rd(rd_hour);

day=DS1302_rd(rd_day);

mon=DS1302_rd(rd_month);

year=DS1302_rd(rd_year);

}

//////////////////////////////////////////////////////////////////////////////////////

voidint_init(void)//开中断

{

EA=1;//全局中断开

EX0=1;//外部中断0开

EX1=1;//外部中断1开

IT0=1;//边沿触发,为0则为低电平触发

IT1=1;//边沿触发,为0则为低电平触发

ET1=1;//计数器1开

}

voidinit_time()//中断初始化

{

TMOD=0x10;

TR1=1;//TCON

}

/////////

/*voidint0_Key()interrupt0using1

{

u++;//q功能键转化

}*/

voidfictions()

{

if(fiction==0)

{

while(fiction==0);

q++;

}

}

voidint1_Key()interrupt2using2

{

clock=0;//关闹钟

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

voidclock_out()//闹钟程序

{

while(clock)

{

Speak=1;

delay

(1);

Speak=0;

delay

(1);

}

}

voidmove()//调小数点

{

if(left==0)

{

while(left==0);

c++;

if(c==7)c=-1;

}

}

voidmove_time()//调时间

{

move();

if(up==0)

{

uchara;

while(up==0);

switch(c)

{

//case-1:

break;

case0:

a=s%10+s/10*16;

a=a+0x01;

if(a>=96)

a=a-0x60;

DS1302_wr(wr_second,a);break;

case1:

a=s%10+s/10*16;

a=a+0x10;

if(a>=96)

a=a-0x60;

DS1302_wr(wr_second,a);break;

//case2:

break;

case3:

a=m%10+m/10*16;

a=a+0x01;

if(a>=96)

a=a-0x60;

DS1302_wr(wr_minute,a);break;

case4:

a=m%10+m/10*16;

a=a+0x10;

if(a>=96)

a=a-0x60;

DS1302_wr(wr_minute,a);break;

//case5:

break;

case6:

a=h%10+h/10*16;

a=a+0x01;

if(a>=36)

a=0x00;

DS1302_wr(wr_hour,a);break;

/*case7:

a=h%10+h/10*16;

a=a+0x10;

if((a&0xf0)>=32)

a=0x00+b[4];

DS1302_wr(wr_hour,a);break;*/

default:

break;

}

}

show_time();

}

voidmove_day()//调日期

{

move();

if(up==0)

{

uchara;

while(up==0);

switch(c)

{

//case-1:

break;

case0:

a=day%10+day/10*16;

a=a+0x01;

if(a>49)

a=0x01;

DS1302_wr(wr_day,a);break;

case1:

/*a=day%10+day/10*16;

a=a+0x10;

if(a>=65)

a=a-0x30;

DS1302_wr(wr_day,a);break;*/

c=c+1;

case2:

a=mon%10+mon/10*16;

a=a+0x01;

if(a>18)

a=0x01;

DS1302_wr(wr_month,a);break;

case3:

/*a=mon%10+mon/10*16;

a=a+0x10;

if(a>=34)

a=a-0x10;

DS1302_wr(wr_month,a);break;*/

c=c+1;

case4:

a=year%10+year/10*16;

a=a+0x01;

if(a>153)

a=0x00;

DS1302_wr(wr_year,a);break;

case5:

a=year%10+year/10*16;

a=a+0x10;

if(a>153)

a=a-0x90;

DS1302_wr(wr_year,a);break;

/*case7:

a=h%10+h/10*16;

a=a+0x10;

if((a&0xf0)>=32)

a=0x00+b[4];

DS1302_wr(wr_hour,a);break;*/

default:

break;

}

}

}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

voidshow_naozhong()

{

show(0,d[0]);

show(1,d[1]);

show(2,10);

show(3,d[2]);

show(4,d[3]);

show(5,10);

show(6,d[4]);

show(7,d[5]);

}

voidmove_naozhong()

{

move();

if(up==0)

{

while(up==0);

switch(c)

{

//case-1:

break;

case0:

d[0]++;

if(d[0]==10)d[0]=0;break;

case1:

d[1]++;

if(d[1]>=6)d[1]=0;break;

//case2:

break;

case3:

d[2]++;

if(d[2]==10)d[2]=0;break;

case4:

d[3]++;

if(d[3]>=6)d[3]=0;break;

//case5:

break;

case6:

d[4]++;

if(d[4]==10)

{

d[4]=0;

d[5]++;

}

break;

default:

break;

}

}

}

ucharcounter=0;

voidinit_inttime()interrupt3

{

TH1=0xfc;

TL1=0x0B;

counter++;

if(counter==10)

{

counter=0;

e[0]++;

if(e[0]==10)

{

e[0]=0;

e[1]++;

if(e[1]==10)

{

e[1]=0;

e[2]++;

if(e[2]==10)

{

e[2]=0;

e[3]++;

if(e[3]==6)

e[3]=0;

}

}

}

}

}

////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////

unsignedcharcodeSONG[]={//祝你平安

0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,

0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,

0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,

0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,

0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,

0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,

0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,

0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,

0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,

0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,

0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,

0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,

0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,

0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,

};

voidTime0_Init()

{

TMOD=0x01;

IE=0x82;

TH0=0xDC;

TL0=0x00;

}

voidTime0_Int()interrupt1

{

TH0=0xDC;

TL0=0x00;

Count++;//长度加1

}

voidDelay_xMs(uintx)

{

uinti,j;

for(i=0;i

{

for(j=0;j<3;j++);

}

}

voidPlay_Song(uchari)

{

ucharTemp1,Temp2;

uintAddr;

Count=0;//中断计数器清0

Addr=i;

while(u)

{

Temp1=SONG[Addr++];

if(Temp1==0xFF)//休止符

{

TR0=0;//停止计数

Delay_xMs(100);

}

elseif(Temp1==0x00)//歌曲结束符

{

u=0;

}

else

{

Temp2=SONG[Addr++];

TR0=1;

while

(1)

{

Speak=~Speak;

Delay_xMs(Temp1);

if(Temp2==Count)

{

Count=0;

break;

}

}

}

}

}

voidchange()

{

if(yinyue==0)

{

while(yinyue==0);

u++;

}

}

////////////////////////////////////////////////////////////////////////////////////////////////

voidmain()

{

intial();

int_init();

while

(1)

{

ddd();//显示时间

if(q%3==0)

{

show_time();

move_time();

}

if(q%3==1)//显示日期

{

show_day();

move_day();

}

if(q%3==2)//闹钟调试

{

show_naozhong();

move_naozhong();

}

if(u%2==1)//音乐功能

{

Time0_Init();//定时器0中断初始化

Play_Song(0);//为祝你平安

}

show(c,11);//小数点显示

fictions();//功能键扫描

change();

if(h==(d[5]*10+d[4])&&m==(d[3]*10+d[2])&&s==(d[1]*10+d[0]))clock=1;

clock_out();

}

}

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

当前位置:首页 > 高等教育 > 理学

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

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