level 6
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit timeup=P3^0;
sbit stop=P3^6;
sbit BEEP=P3^1;
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
uchar DSY_COUa[]={0,0,0,0,0,0,0,0,0,0};
uchar DSY_COUb[]={0,0,0,0,0,0,0,0,0,0,0,0};
uchar code DSY_INDEX[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
uchar code SONG_TONG[]={212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,159,169,190,119,119,126,159,142,159,0};
uchar code SONG_LONG[]={9 ,3 ,12 ,12 ,12 ,24 ,9 ,3 ,12 ,12 ,12 ,24 ,9 ,3 ,12 ,12 ,12 ,12 ,12 ,9 ,3 ,12 ,12 ,12 ,24 ,0};
uchar num=0,seca=0,secb=0,mina=0,minb=0,houa=0,houb=0,ret1=0,cout=0;
uchar secas=0,secbs=0,minas=0,minbs=0,houas=0,houbs=0;
uint timc=0;
/*****************延时函数*****************/
void delay(uint ms)
{
uchar i;
while(ms--) for(i=0;i<120;i++);
}
void delaytin(uint ms)
{
uchar u;
while(ms--) for(u=0;u<120;u++){if(timeup==0) break;};
}
/*****************时间显示*****************/
void showa()
{
uchar i;
for(i=0;i<8;i++)
{
P2=DSY_INDEX[i];
P0=DSY_CODE[DSY_COUa[i]];
delay(2);
}
}
/*****************定时器显示****************/
void showb()
{
uchar i;
for(i=0;i<8;i++)
{
P2=DSY_INDEX[i];
P0=DSY_CODE[DSY_COUb[i]];
delay(2);
}
DSY_COUb[0]=secas;
DSY_COUb[1]=secbs;
DSY_COUb[3]=minas;
DSY_COUb[4]=minbs;
DSY_COUb[6]=houas;
DSY_COUb[7]=houbs;
DSY_COUb[2]=11;
DSY_COUb[5]=11;
}
/*****************计时函数*****************/
void TIMEc()
{
seca=timc%10;
if(seca==0)
{
seca=0;secb++;
if(secb==6)
{
secb=0;mina++;
if(mina==10)
{
mina=0;minb++;
if(minb==6)
{
minb=0;houa++;
if(houa==10) {houa=0,houb++;}
if(houa==4&&houb==2) houa=houb=0;
}
}
}
}
DSY_COUa[0]=seca;
DSY_COUa[1]=secb;
DSY_COUa[3]=mina;
DSY_COUa[4]=minb;
DSY_COUa[6]=houa;
DSY_COUa[7]=houb;
DSY_COUa[2]=11;
DSY_COUa[5]=11;
}
/*****************时间设置函数*****************/
void timeset()
{
uchar z,y;
switch(ret1)
{
case 0:TR0=1;break;
case 1:z=DSY_COUa[0];y=DSY_COUa[1];
while(ret1==1)
{
if(timeup==1)
{
DSY_COUa[0]=10;
DSY_COUa[1]=10;
delaytin(200);
DSY_COUa[0]=seca;
DSY_COUa[1]=secb;
delaytin(200);
}
if(timeup==0)
{
TR0=0;
while(~timeup);
z=(z+1)%10;
if(z==0) y=(y+1)%6;
seca=z;
secb=y;
timc=z;
}
}
break;
case 2:z=DSY_COUa[3];y=DSY_COUa[4];
while(ret1==2)
{
if(timeup==1)
{
DSY_COUa[3]=10;
DSY_COUa[4]=10;
delaytin(200);
DSY_COUa[3]=mina;
DSY_COUa[4]=minb;
delaytin(200);
}
if(timeup==0)
{
TR0=0;
while(~timeup);
z=(z+1)%10;
if(z==0) y=(y+1)%6;
mina=z;
minb=y;
}
}
break;
case 3:z=DSY_COUa[6];y=DSY_COUa[7];
while(ret1==3)
{
if(timeup==1)
{
DSY_COUa[6]=10;
DSY_COUa[7]=10;
delaytin(200);
DSY_COUa[6]=houa;
DSY_COUa[7]=houb;
delaytin(200);
}
if(timeup==0)
{
TR0=0;
while(~timeup);
z=(z+1)%10;
if(z==0) y=(y+1)%3;
if(y==2&&z==4) z=y=0;
houa=z;
houb=y;
}
}
break;
case 4:TR0=1;z=DSY_COUb[0];y=DSY_COUb[1];
while(ret1==4)
{
if(timeup==1)
{
DSY_COUb[0]=10;
DSY_COUb[1]=10;
delaytin(600);
DSY_COUb[0]=z;
DSY_COUb[1]=y;
delaytin(600);
}
if(timeup==0)
{
while(~timeup);
z=(z+1)%10;
if(z==0) y=(y+1)%6;
secas=z;
secbs=y;
}
}
break;
case 5:TR0=1;z=DSY_COUb[3];y=DSY_COUb[4];
while(ret1==5)
{
if(timeup==1)
{
DSY_COUb[3]=10;
DSY_COUb[4]=10;
delaytin(600);
DSY_COUb[3]=z;
DSY_COUb[4]=y;
delaytin(600);
}
if(timeup==0)
{
while(~timeup);
z=(z+1)%10;
if(z==0) y=(y+1)%6;
minas=z;
minbs=y;
}
}
break;
case 6:TR0=1;z=DSY_COUb[6];y=DSY_COUb[7];
while(ret1==6)
{
if(timeup==1)
{
TR0=0;
DSY_COUb[6]=10;
DSY_COUb[7]=10;
delaytin(600);
DSY_COUb[6]=z;
DSY_COUb[7]=y;
delaytin(600);
}
if(timeup==0)
{
while(~timeup);
z=(z+1)%10;
if(z==0) y=(y+1)%3;
if(y==2&&z==4) z=y=0;
houas=z;
houbs=y;
}
}
break;
}
}
void musiplay()
{
uint i=0,j,k;
while(SONG_LONG[i]!=0||SONG_TONG[i]!=0)
{
for(j=0;j<SONG_LONG[i]*20;j++)
{
BEEP=~BEEP;if(stop==0) return;
for(k=0;k<SONG_TONG[i]/3;k++);
}
delay(10);
i++;
}
}
/****************定时响应******************/
void timering()
{
if(DSY_COUa[0]==DSY_COUb[0])
if(DSY_COUa[1]==DSY_COUb[1])
if(DSY_COUa[3]==DSY_COUb[3])
if(DSY_COUa[4]==DSY_COUb[4])
if(DSY_COUa[6]==DSY_COUb[6])
if(DSY_COUa[7]==DSY_COUb[7])
musiplay();
}
/*****************主函数*****************/
void main()
{
P2=0xfe;
TMOD=0x00;
EA=1;
ET0=1;
TH0=(8192-5000)/32;
TL0=(8192-5000)%32;
ET1=1;
TR1=1;
TH1=(8192-5000)/32;
TL1=(8192-5000)%32;
EX0=1;
IT0=1;
PT0=1;
while(1)
{
timeset();
timering();
}
}
void timer1() interrupt 0
{
ret1=(ret1+1)%7;
}
void counttime2() interrupt 1
{
TH0=(8192-5000)/32;
TL0=(8192-5000)%32;
if(++num!=200) return;
timc=(timc+1)%10;
TIMEc();
}
void counttime1() interrupt 3
{
TH1=(8192-5000)/32;
TL1=(8192-5000)%32;
if(++cout==2)
{
switch(ret1)
{
case 0:showa();break;
case 1:showa();break;
case 2:showa();break;
case 3:showa();break;
case 4:showb();break;
case 5:showb();break;
case 6:showb();break;
}
cout=0;
}
}
2014年03月05日 14点03分