51数码时钟(调时闪烁,闹钟音乐两只老虎,闹钟时间互不影响)

#include <reg52.h>
#include "./delay/delay.h"
#define SEGPORT P0


sbit bit_select = P2^0;
sbit seg_select = P2^1;
sbit key1 = P1^0; //暂停和终止
sbit key2 = P1^1; 复位
sbit key3 = P1^2; 移位
sbit key4 = P1^3; //改时间
sbit key5 = P1^4; //调时间
sbit key6 = P1^5; //开关闹钟
sbit beep = P3^7;
sbit led= P3^6; //闹钟开启LED小灯便亮


unsigned char duanma[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char bitdata[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};


unsigned char code freq[][2]={ 
  0xD8,0xF7,//00440HZ 1   
  0xBD,0xF8,//00494HZ 2  
  0x87,0xF9,//00554HZ 3  
  0xE4,0xF9,//00587HZ 4    
  0x90,0xFA,//00659HZ 5     
  0x29,0xFB,//00740HZ 6     
  0xB1,0xFB,//00831HZ 7      
  0xEF,0xFB,//00880HZ `1
};


code unsigned char my_music[32] ={1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,4,3,1,5,6,5,4,3,1,1,5,1,1,5,1};
unsigned char High;
unsigned char Low;


unsigned char tempdata[8]; //当前时间数组
unsigned char clock_tempdata[8]; //闹钟时间数组
unsigned char tmp_i = 1; //数码管扫描到第几个
unsigned char flag1 = 0; //按键1:按一次取反(0或1)
unsigned char flag2 = 0; //按键5:按一次取反(0或1)调闹钟时间和看闹钟时间
unsigned char flag3 = 0; //按键6:按一次取反(0或1)开关闹钟




unsigned char shi = 0,fen = 0,miao = 0;
unsigned char clock_shi =0,clock_fen = 0,clock_miao = 0;




void display()
{
static unsigned char i = 0;
static unsigned char num = 0;

SEGPORT = 0x0;
seg_select = 1;
seg_select = 0;

SEGPORT = 0xff;
bit_select = 1;
bit_select = 0;


if(flag2 == 0)
{
if(i == tmp_i && flag1 == 1)
{
SEGPORT = bitdata[i];  //位选
bit_select = 1;
bit_select = 0;
if(num < 35)
{
SEGPORT = 0x00;    
seg_select = 1;
seg_select = 0;
num++;
}
else if(70 > num)
{
SEGPORT = tempdata[i];    
seg_select = 1;
seg_select = 0;
num++;
}
if(70 == num)
{
num = 0;
}
}
else
{

SEGPORT = tempdata[i];
seg_select = 1;
seg_select = 0;

SEGPORT = bitdata[i];
bit_select = 1;
bit_select = 0;
}
i++;
if(8 == i)
{
i = 0;
}
}
else
{
if(i == tmp_i && flag2 == 1)
{
SEGPORT = bitdata[i];  //位选
bit_select = 1;
bit_select = 0;
if(num < 35)
{
SEGPORT = 0x00;    
seg_select = 1;
seg_select = 0;
num++;
}
else if(70 > num)
{
SEGPORT = clock_tempdata[i];    
seg_select = 1;
seg_select = 0;
num++;
}
if(70 == num)
{
num = 0;
}
}
else
{

SEGPORT = clock_tempdata[i];
seg_select = 1;
seg_select = 0;

SEGPORT = bitdata[i];
bit_select = 1;
bit_select = 0;
}
i++;
if(8 == i)
{
i = 0;
}


}
}


//--------------------------------------------------------------------------------------------------------------------------------------
void change_time()
{
    tempdata[0] = duanma[shi / 10];
tempdata[1] = duanma[shi % 10];
tempdata[2] = 0x40;
tempdata[3] = duanma[fen / 10];
tempdata[4] = duanma[fen % 10];
tempdata[5] = 0x40;
tempdata[6] = duanma[miao / 10];
tempdata[7] = duanma[miao % 10];
}


void timer0_init ()
{
EA = 1;
TMOD |= 0x01;
TH0 = (65536 - 2000) / 256;
TL0 = (65536 - 2000) % 256;
ET0 = 1;
TR0 = 1;
}


void timer0_isr() interrupt 1
{
static unsigned char i = 0;
static unsigned char k = 0;
TH0 = (65536 - 2000) / 256;
TL0 = (65536 - 2000) % 256;
k++;
display();
if(k == 10)
{
k = 0;
i++;
}

if( 50 == i)
{
i = 0;
miao++;
if(60 == miao)
{
miao = 0;
fen++;
if(60 == fen)
{
fen = 0;
shi++;
if(24 == shi)
{
shi = 0;
fen = 0;
miao = 0;
}
}

}
}
change_time();

}


void timer1_init(void)
{
 EA = 1;
 TMOD |= 0x10;
 TH1 = 0;
 TL1 = 0;
 ET1 = 1;
 TR1 = 0;
}


void timer1_isr() interrupt 3
{


TH1 = High;
TL1 = Low;
beep = ~beep;
}




void main()
{
unsigned char i = 0;
  unsigned char num = 0;

timer0_init();
timer1_init();

while(1)
{
//-----------------------------------------------------------------------------------------------------------------------------------
if(0 == key1)   //按键1:时间暂停和开始,以及改时间
{
delay_ms(10);
   if(0 == key1)
{
   delay_ms(10);
if(0 == key1)
{
   while(!key1);
delay_ms(10);
while(!key1);

if(flag1 == 0)
{
flag1 = 1;
}
else
{
flag1 = 0;
}
}

}
}
//-----------------------------------------------------------------------------------------------------------------------------------
if(0 == key2) //按键2:复位
{
delay_ms(10);
   if(0 == key2)
{
   delay_ms(10);
if(0 == key2)
{
   while(!key1);
delay_ms(10);
while(!key1);


miao = 0;
fen = 0;
shi = 0;
change_time();
}

}
}
//-----------------------------------------------------------------------------------------------------------------------------------
if(0 == key3 && (1==flag1 || 1 == flag2)) //按键3:往右移位
{
delay_ms(10);
   if(0 == key3)
{
   delay_ms(10);
if(0 == key3)
{
   while(!key3);
delay_ms(10);
while(!key3);
if(tmp_i == 1 || tmp_i == 4)
{
tmp_i = tmp_i + 2;
}
else
{
tmp_i++;
}

if(tmp_i == 8)
{
tmp_i = 0;
}
}
}
}
//-----------------------------------------------------------------------------------------------------------------------------------
if(0 == key4 && 1==flag1 && 0 == flag2)    //按键4改时钟时间
{
delay_ms(10);
   if(0 == key4)
{
   delay_ms(10);
if(0 == key4)
{
   while(!key4);
delay_ms(10);
while(!key4);
switch(tmp_i)
{


case 1:
{
shi = (shi + 1) % 24;
tempdata[0] = duanma[shi / 10];
break;
}
case 3:
{
fen = (fen + 10) % 60;
break;
}
case 4:
{
fen = (fen + 1) % 60;
if(fen % 10 == 0)
{
fen = fen - 10;
}
break;
}
case 6:
{
miao = (miao + 10) % 60;
break;
}
case 7:
{
miao = (miao + 1) % 60;
if(miao % 10 == 0)
{
miao = miao - 10;
}
break;
}
default:break;
}
change_time();
}
}
}
//-----------------------------------------------------------------------------------------------------------------------------------
if(0 == key4 && 0==flag1 && 1 == flag2)    //按键4:时间加
{
delay_ms(10);
   if(0 == key4)
{
   delay_ms(10);
if(0 == key4)
{
   while(!key4);
delay_ms(10);
while(!key4);
switch(tmp_i)
{


case 1:
{
clock_shi = (clock_shi + 1) % 24;
clock_tempdata[0] = duanma[clock_shi / 10];
break;
}
case 3:
{
clock_fen = (clock_fen + 10) % 60;
break;
}
case 4:
{
clock_fen = (clock_fen + 1) % 60;
if(clock_fen % 10 == 0)
{
clock_fen = clock_fen - 10;
}
break;
}
case 6:
{
clock_miao = (clock_miao + 10) % 60;
break;
}
case 7:
{
clock_miao = (clock_miao + 1) % 60;
if(clock_miao % 10 == 0)
{
clock_miao = clock_miao - 10;
}
break;
}
default:break;
}
clock_tempdata[0] = duanma[clock_shi / 10];
clock_tempdata[1] = duanma[clock_shi % 10];
clock_tempdata[2] = 0x40;
clock_tempdata[3] = duanma[clock_fen / 10];
clock_tempdata[4] = duanma[clock_fen % 10];
clock_tempdata[5] = 0x40;
clock_tempdata[6] = duanma[clock_miao / 10];
clock_tempdata[7] = duanma[clock_miao % 10];
}
}
}
//-----------------------------------------------------------------------------------------------------------------------------------
if(0 == key5) //按键5调闹钟时间
{
delay_ms(10);
   if(0 == key5)
{
   delay_ms(10);
if(0 == key5)
{
   while(!key5);
delay_ms(10);
while(!key5);
if(flag2 == 0)
{
flag2 = 1;

clock_tempdata[0] = duanma[clock_shi / 10];
clock_tempdata[1] = duanma[clock_shi % 10];
clock_tempdata[2] = 0x40;
clock_tempdata[3] = duanma[clock_fen / 10];
clock_tempdata[4] = duanma[clock_fen % 10];
clock_tempdata[5] = 0x40;
clock_tempdata[6] = duanma[clock_miao / 10];
clock_tempdata[7] = duanma[clock_miao % 10];
}
else
{
flag2 = 0;
}
}

}
}
//-----------------------------------------------------------------------------------------------------------------------------------
if(0 == key6) //按键6:开启闹钟
{
delay_ms(10);
if(0 == key6)
{
delay_ms(10);
if(0 == key6)
{
while(!key6);
delay_ms(10);
while(!key6);
if(flag3 == 0)
{
led = 0;
flag3 = 1;
}
else
{
led = 1;
flag3 = 0;
}
}
}
}
//-----------------------------------------------------------------------------------------------------------------------------------
if(shi == clock_shi && fen == clock_fen && miao == clock_miao && flag3 == 1) //闹钟开启
{
while(flag3 == 1)
{
for(i = 0;i < 32 && flag3 == 1;i++)
{
num = my_music[i];
High = freq[num - 1][1];
Low = freq[num - 1][0];
TR1 = 1;
delay_ms(200);
delay_ms(200);
TR1 = 0;
delay_ms(20);


if(0 == key6) //按键6关闭闹钟
{
delay_ms(10);
if(0 == key6)
{
delay_ms(10);
if(0 == key6)
{
while(!key6);
delay_ms(10);
while(!key6);
if(flag3 == 0)
{
led = 0;
flag3 = 1;
}
else
{
led = 1;
flag3 = 0;
}
}
}
}
}

}
}

}

}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值