电子闹钟

         电子闹钟的主要原理就是,首先让单片机上八个数码管显示出相应的时间,能对时间的时分秒进行调整,到了自己设定的时间后,让蜂鸣器发出声响。由于是让数码管同时亮起,需要用到动态扫描的知识,为了避免数码管中出现较暗的情况,所以采用了定时器计数的方式让数码管正常显示,同时也用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++)
		{
			; 
		}
	}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值