p10按键报时,p11调节小时,p12调节分钟,p13+p10键盘锁。
带正点报时。全部用蜂鸣器输出cw提示。
led一秒闪烁一次。
#include<at89x51.h>
unsigned char a;//分的10位
unsigned int q;//for循环
unsigned char r=0;//毫秒
unsigned char s=0;//秒
unsigned char m=0;//分
unsigned char h=8;//时
void timer0_int(void)interrupt 1
{
th0=0x3c;
tl0=0xb0;
r++;
if(r==10)
{s++;r=0;p2_1=~p2_1;
if(s==60){m++;s=0;
if(m==60){h++;m=0;
if(h==24){h=0;
}//小时if
}//fenzhong if
}//miao if
}//haomiao if.
}//中断结束
//发达的子程序
void da()
{
p2_3=1;
for(q=0;q<18000;q++);
p2_3=0;
for(q=0;q<6000;q++);
}
//发嘀的子程序
void di()
{
p2_3=1;
for(q=0;q<6000;q++);
p2_3=0;
for(q=0;q<6000;q++);
}
void talk()//cw报时子程序
{
a=h/10;//xiashi的十位
switch(a)
{
case 0:da();da();da();da();da();break;
case 1:di();da();da();da();da();break;
case 2:di();di();da();da();da();break;
case 3:di();di();di();da();da();break;
case 4:di();di();di();di();da();break;
case 5:di();di();di();di();di();break;
case 6:da();di();di();di();di();break;
case 7:da();da();di();di();di();break;
case 8:da();da();da();di();di();break;
case 9:da();da();da();da();di();break;
}
for(q=0;q<33000;q++);
a=h%10;//xiaoshi的ge位
switch(a)
{
case 0:da();da();da();da();da();break;
case 1:di();da();da();da();da();break;
case 2:di();di();da();da();da();break;
case 3:di();di();di();da();da();break;
case 4:di();di();di();di();da();break;
case 5:di();di();di();di();di();break;
case 6:da();di();di();di();di();break;
case 7:da();da();di();di();di();break;
case 8:da();da();da();di();di();break;
case 9:da();da();da();da();di();break;
}
for(q=0;q<33000;q++);
a=m/10;//分的十位
switch(a)
{
case 0:da();da();da();da();da();break;
case 1:di();da();da();da();da();break;
case 2:di();di();da();da();da();break;
case 3:di();di();di();da();da();break;
case 4:di();di();di();di();da();break;
case 5:di();di();di();di();di();break;
case 6:da();di();di();di();di();break;
case 7:da();da();di();di();di();break;
case 8:da();da();da();di();di();break;
case 9:da();da();da();da();di();break;
}
for(q=0;q<33000;q++);
a=m%10;
switch(a)
{
case 0:da();da();da();da();da();break;
case 1:di();da();da();da();da();break;
case 2:di();di();da();da();da();break;
case 3:di();di();di();da();da();break;
case 4:di();di();di();di();da();break;
case 5:di();di();di();di();di();break;
case 6:da();di();di();di();di();break;
case 7:da();da();di();di();di();break;
case 8:da();da();da();di();di();break;
case 9:da();da();da();da();di();break;
}
for(q=0;q<33000;q++);
}
//以下是主程序
void main()
{
tmod=0x01;
th0=0x3c;
tl0=0xb0;//50000,乘2u秒=0.1秒
ea=1;
et0=1;
tr0=1;
p2=0x00;
while(1)
{
if(m==0&&s==0)//正点报时
{
talk();
}//正点报时
if(p1_0==0)//按键报时
{
talk();
}
if(p1_1==0)//调整小时
{
while(p1_1==0)
{
h++;
da();
for(q=0;q<18000;q++);
if(h==24)h=0;
}
talk();
}
if(p1_2==0)//调整分钟
{
while(p1_2==0)
{
m++;s=0;r=0;
da();
for(q=0;q<18000;q++);
if(m==60)m=0;
}
talk();
}
while(p1_3==0)//同时按p13,p10键盘锁,静音
{
if(p1_0==0)
{
da();da();da();
for(q=0;q<22000;q++);
di();di();da();di();
for(q=0;q<22000;q++);
di();di();da();di();//发off
while(1)
{
if(p1_3==0&&p1_0==0)break;//同时按p13,p10推出键盘锁,静音
}
da();da(); da();
for(q=0;q<22000;q++);
da();di();
}
}
}//while1结束
}//主程序结宿