时钟四:实现闹钟

这篇博客详细介绍了如何利用延时函数在单片机上实现一个实用的闹钟功能,涵盖了从基本的时钟原理到具体编程实现的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

延时函数:

void delay_us(unsigned char t)
{
    while(--t);
}

void delay_ms(unsigned char t)
{
    while(t--)
		{
        delay_us(245);
			  delay_us(245);
    }
}

void delay_s(unsigned char t)
{
    while(t--)
    {
		    delay_ms(200);	
			  delay_ms(200);
			  delay_ms(200);
			  delay_ms(200);
			  delay_ms(200);
    }
}

主文件函数:
#include <reg52.h>
#include "./delay/delay.h"


#define PORTLEN P0
#define KEYPORT P1


sbit bit_select = P2^0;
sbit seg_select = P2^1;
sbit beem = P3^2;




unsigned char code SONG_TONE[]={239,239,212,189,159,159,189,159,159,142,126,120,120,159,120,120,142,159,189,142,159,189,239,212,189,159,142,159,189,212,239};
unsigned char code SONG_LONG[]={6,6,9,3,6,6,12,6,6,6,6,6,6,12,6,6,9,3,6,6,9,3,6,3,3,6,3,3,6,6,9};
unsigned char src[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char qrc[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char second1[8];
unsigned char shi = 0;
unsigned char fen = 0;
unsigned char miao = 0;
unsigned char Dshi = 3;
unsigned char Dfen = 1;
unsigned char Dmiao = 0;
unsigned char j = 7;
unsigned char k = 0;




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





void timer1_init(void)
{
 EA = 1;
 TMOD |= 0x10;
 TH1 = (65536 - 1000) / 256;
 TL1 = (65536 - 1000) % 256;
 ET1 = 1;
 TR1 = 1;
}


unsigned char key_scan(void)
{
 unsigned char keyvalue;
 KEYPORT = 0xf0;
 if(0xf0 != KEYPORT)
{
 delay_ms(10);
 if(0xf0 != KEYPORT)
{
 KEYPORT = 0xfe;
 if(0xfe != KEYPORT)
{
 keyvalue = KEYPORT;
 keyvalue &= 0xf0;
 keyvalue += 0x0e;
 while(0xfe != KEYPORT);
   delay_ms(10);
while(0xfe != KEYPORT);
 return keyvalue;
}
KEYPORT = 0xfd;
 if(0xfd != KEYPORT)
{
 keyvalue = KEYPORT;
 keyvalue &= 0xf0;
 keyvalue += 0x0d;
 while(0xfd != KEYPORT);
   delay_ms(10);
while(0xfd != KEYPORT);
 return keyvalue;
}
}
}
return 0xff;
}


unsigned char key_pro()
{
 unsigned char keynum;
 keynum = key_scan();
 switch(keynum)
 {
 case 0x7e:return 1;break;
 case 0xbe:return 2;break;
 case 0xde:return 3;break;
 case 0xee:return 4;break;
case 0x7d:return 5;break;
        case 0xbd:return 6;break;
        case 0xdd:return 7;break;
        case 0xed:return 8;break;
 default:return 0xff;break;
}
}

void PlayMusic(void)
{
unsigned char q=0;

 unsigned char m;
 unsigned char k;
while(SONG_LONG[q]!=0||SONG_TONE[q]!=0)
{
for(m=0;m<SONG_LONG[q]*20;m++)
{
beem=~beem;
for(k=0;k<SONG_TONE[q]/3;k++);
}
delay_ms(10);
q++;
}
}


void main()
{
    unsigned char key;
    timer1_init();  
       timer0_init();  
while(1)
{
  key = key_pro();
    if(1 == key)
  {
    while(1 != key);
        delay_ms(10);
        while(1 != key);
        TR0 = ~TR0;
  }

           if(2 == key)
{
while(2 != key);
delay_ms(10);
while(2 != key);
shi++;
second1[0] = src[shi / 10];
second1[1] = src[shi % 10];
second1[2] = 0x40;
if(24 == shi)
{
shi = 0;
}
}  
           if(3 == key)
{
while(3 != key);
delay_ms(10);
while(3 != key);
fen++;
second1[3] = src[fen / 10];
second1[4] = src[fen % 10];
second1[5] = 0x40;
if(60 == fen)
{
fen = 0;
}
}   
           if(4 == key)
{
while(4 != key);
delay_ms(10);
while(4 != key);
miao++;
second1[6] = src[miao / 10];
second1[7] = src[miao % 10];
if(60 == miao)
{
miao = 0;
}
}
           if(5 == key)
{
while(5 != key);
delay_ms(10);
while(5 != key);
second1[0] = src[Dshi / 10];
second1[1] = src[Dshi % 10];
second1[2] = 0x40;
second1[3] = src[Dfen / 10];
second1[4] = src[Dfen % 10];
second1[5] = 0x40;
second1[6] = src[Dmiao / 10];
second1[7] = src[Dmiao % 10];
}
           if(6 == key)
{
while(6 != key);
delay_ms(10);
while(6 != key);
Dshi++;
second1[0] = src[Dshi / 10];
second1[1] = src[Dshi % 10];
if(24 == Dshi)
{
Dshi = 0;
}
}
           if(7 == key)
{
while(7 != key);
delay_ms(10);
while(7 != key);
Dfen++;
second1[3] = src[Dfen / 10];
second1[4] = src[Dfen % 10];
if(24 == Dfen)
{
Dfen = 0;
}
}
           if(8 == key)
{
while(8 != key);
delay_ms(10);
while(8 != key);
Dmiao++;
second1[6] = src[Dmiao / 10];
second1[7] = src[Dmiao % 10];
if(24 == Dmiao)
{
Dmiao = 0;
}
}
           if((shi == Dshi) && (fen == Dfen) && (miao == Dmiao))
           {
  beem = 0;
PlayMusic();
      delay_ms(500);
}  
}
}
void display()
{
    static unsigned char i = 0;
 PORTLEN = 0x0;   //ÏûÖØÓ°
 seg_select = 1;
 seg_select = 0;

 PORTLEN = 0xff;
 bit_select = 1;
 bit_select = 0;

 PORTLEN = second1[i];
 seg_select = 1;
 seg_select = 0;

 PORTLEN = qrc[i];
 bit_select = 1;
 bit_select = 0;
 
 i++;
 if(8 == i)
{
 i = 0;
}

}



void timer0_isr() interrupt 1
{
 static unsigned char i = 0;
    TH0 = (65536 - 20000) / 256;
 TL0 = (65536 - 20000) % 256;  

 i++;
 if(50 == i)
{
 i = 0;
        miao++;
 if(60 == miao)
{   
 miao = 0;
 fen++;
 if(60 == fen)
{
 fen = 0;
 shi++;
 if(24 == shi)
{
 shi = 0;
}
}
}
    }
second1[0] = src[shi / 10];
second1[1] = src[shi % 10];
second1[2] = 0x40;
second1[3] = src[fen / 10];
second1[4] = src[fen % 10];
second1[5] = 0x40;
second1[6] = src[miao / 10];
second1[7] = src[miao % 10];
}




void timer1_isr() interrupt 3
{
    TH1 = (65536 - 1000) / 256;
 TL1 = (65536 - 1000) % 256;
 display();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值