电子闹钟的主要原理就是,首先让单片机上八个数码管显示出相应的时间,能对时间的时分秒进行调整,到了自己设定的时间后,让蜂鸣器发出声响。由于是让数码管同时亮起,需要用到动态扫描的知识,为了避免数码管中出现较暗的情况,所以采用了定时器计数的方式让数码管正常显示,同时也用p1口接独立按键来设置闹钟的开始暂停以及修改时间,下面是实现程序代码(自己的单片机为38译码器):
#include <reg51.h>
#define dataport P2
#define sbitchoice P0 //位选
sbit open = P1^0;
sbit close = P1^1;
sbit stop = P1^2;
sbit Addhour = P1^3;
sbit Addmin = P1^4;
sbit Addsec = P1^5;
sbit beel = P0^7;
unsigned char code LED1[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07} ; //0-7 位选
unsigned char code LED2[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40} ; //0-9
unsigned char sec ;
unsigned char min ;
unsigned char hour = 0 ;
unsigned char temp[8] ;
void Delay10ms() //@12.000MHz
{
unsigned char i, j;
i = 117;
j = 184;
do
{
while (--j);
} while (--i);
}
void delay(unsigned char i) ;
void timer_0() ;
void main()
{
unsigned char i ;
unsigned char j ;
unsigned char count = 500 ;
timer_0() ;
while(1)
{
if(!stop)
{
Delay10ms();
if(!stop)
{
while(!stop);
TR0 = 0;
}
}
if(!close)
{
Delay10ms();
if(!close)
{
while(!close);
hour = 0;
min = 0;
sec = 0;
TR0 = 0;
}
}
if(!open)
{
Delay10ms();
if(!open)
{
while(!open);
TR0 = 1;
}
}
if(!Addhour)
{
Delay10ms();
if(!Addhour)
{
while(!Addhour);
hour++;
if(hour == 24)
{
hour = 0 ;
}
}
}
if(!Addmin)
{
Delay10ms();
if(!Addmin)
{
while(!Addmin);
min++;
if(min == 60)
{
min = 0 ;
hour++ ;
}
}
}
if(!Addsec)
{
Delay10ms();
if(!Addsec)
{
while(!Addsec);
sec++;
if(sec == 60)
{
sec = 0 ;
min++ ;
}
}
}
temp[0] = hour/10 ;
temp[1] = hour%10 ;
temp[2] = 10 ;
temp[3] = min/10 ;
temp[4] = min%10 ;
temp[5] = 10 ;
temp[6] = sec/10 ;
temp[7] = sec%10 ;
for(i=0;i<8;i++)
{
sbitchoice = LED1[i] ;
j = temp[i] ;
dataport = LED2[j] ;
delay(1) ;
}
if(temp[0] == 0 &&temp[1] == 0&&temp[3] == 0&&temp[4] == 0&&temp[6] == 2&&temp[7] == 0)
{
while(count--) //让蜂鸣器响
{
beel = ~beel;
delay(1) ;
temp[0] = hour/10 ;
temp[1] = hour%10 ;
temp[2] = 10 ;
temp[3] = min/10 ;
temp[4] = min%10 ;
temp[5] = 10 ;
temp[6] = sec/10 ;
temp[7] = sec%10 ;
for(i=0;i<8;i++)
{
sbitchoice = LED1[i] ;
j = temp[i] ;
dataport = LED2[j] ;
delay(1) ;
}
}
}
}
}
void timer_0()
{
TMOD = 0X01 ;
TH0 = 0X3C ;
TL0 = 0XB0 ;
EA =1 ;
ET0 = 1 ;
TR0 = 1 ;
}
void time_0_ins(void) interrupt 1
{
unsigned char i ;
TH0 = 0X3C ;
TL0 = 0XB0 ;
i++;
if(i == 20)
{
sec++ ;
i = 0 ;
}
if(sec == 60)
{
min++ ;
sec = 0 ;
}
if(min == 60)
{
min = 0 ;
hour ++ ;
}
if(hour == 24 )
{
hour = 0 ;
}
}
void delay(unsigned char i)
{
unsigned char j,k ;
for(j=0;j<150;j++)
{
for(k=0;k<i;k++)
{
;
}
}
}