基于stc15f2k60s2芯片单片机编程(闹铃)

  1. 用定时器中断写时钟加调节
    1)关闭蜂鸣器、继电器等无关外设;
    2)设备初始化时钟为 23 时 59 分 50 秒,闹钟提醒时间 0 时 0 分 0 秒。
    A.时间显示格式
    2 3 - 5 9 - 5 0
    23 时 间隔 59 分 间隔 50 秒

B.按键功能
1) 按键 S7 定义为“时钟设置”按键,通过该按键可切换选择待调整的时、分、 秒,
当前选择的显示单元以 1 秒为间隔亮灭,时、分、秒的调整需注意数据边界
属性。

2) 按键 S6 定义为“闹钟设置”按键,通过该按键可进入闹钟时间设置功能,数码
管显示当前设定的闹钟时间。

3) 按键 S5 定义为“加”按键,在“时钟设置”或“闹钟设置”状态下,每次按下该按 键
当前选择的单元(时、分或秒)增加 1 个单位。 4) 按键 S4 定义为“减”按键,在“时钟设置”或“闹钟设置”状态下,每次按下该按
键当前选择的单元(时、分或秒)减少 1 个单位。

#include 
#include 
unsigned char code abile[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//¹²Ñô¼«Êý×é
unsigned char display[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsigned char code nao[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char miao=50,fen=59,shi=23,m,n,p,a,nmiao=0,nfen=0,nshi=0;
void Delay1ms();
void duanxuan();
void weixuan();
void Timer0Init();
void Timer1Init();
void naolin();
void shizhongshezhi();
void naozhongshezhi();
void Timer1Init();
 void jia();
void jian();
sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;
int qq;
void main()
{
	P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF;

while(1)
{
	Timer0Init();//ʱÖÓ
 Timer1Init();
	weixuan();
	duanxuan();
	shizhongshezhi();
	naolin();//ÄÖÁå
	naozhongshezhi();
	jia();
	jian();
}

}
void naolin()
{
if(miao==nmiao&&fen==nfen&&shi==nshi)//Èç¹ûʱÖÓʱ¼äºÍÄÖÁåʱ¼äÒ»Ñù£¬·äÃùÆ÷¹¤×÷
{
   P2=0XA0;P0=0Xff;P2=0X1F;//                     ¿ª·äÃùÆ÷
}
else
{
P2=0XA0;P0=0X00;P2=0X1F;//                         ¹Ø·äÃùÆ÷
}
}
void duanxuan()
{
 display[2]=0xbf;//                                ʱ·ÖÃëÖмäµÄºáÏß
	 display[5]=0xbf;
	
	if(p==0){
	if((qq>1000)&&(m==1))//                          ¿ØÖÆʱÖÓµÄʱ·ÖÃë
	{	
		display[7]=0xff;
	  display[6]=0xff;
	}
	else
	{
	display[7]=abile[miao%10];
	display[6]=abile[miao/10];
	}
	if(qq>1000&&m==2)
	{display[4]=0xff;
 display[3]=0xff;}
	else
	{display[4]=abile[fen%10];
 display[3]=abile[fen/10];}
	
 if(qq>1000&&m==3)
 {
  display[1]=0xff;
 display[0]=0xff;}
 else
 {display[1]=abile[shi%10];
 display[0]=abile[shi/10];}}

 if(p==1)//                                       ¿ØÖÆÄÖÖÓµÄʱ·ÖÃë                              
	 {
 if((qq>1000)&&(a==1))
	{	
		display[7]=0xff;
	  display[6]=0xff;
	}
	else
	{
	display[7]=abile[nmiao%10];
	display[6]=abile[nmiao/10];
	}
	if((qq>1000)&&(a==2))
	{display[4]=0xff;
 display[3]=0xff;}
	else
	{display[4]=abile[nfen%10];
 display[3]=abile[nfen/10];}
	
 if((qq>1000)&&(a==3))
 {
  display[1]=0xff;
 display[0]=0xff;}
 else
 {display[1]=abile[nshi%10];
 display[0]=abile[nshi/10];}}
}
void weixuan()//                                      ÊýÂë¹Üλѡ£¨8¸öÈ«Ñ¡£©
{
	unsigned char i;	
	P2=(P2&0x1f)|0xc0;
		P0=(1<<i);
			P2=0x1f;
			P2=(P2&0x1f)|0xe0;
			P0=display[i];
		  i++;
Delay1ms();
if(i==8) i=0;	
}
void shumaguan() interrupt 1//           µ±°´¼üS7û°´Ê±m=0£¬´Ëʱ ÿÃë¼ÓÒ»¡£Èç¹û°´¼ü°´Ï£¬Ôò²»¼Ó
	{
unsigned int i;
	if(m==0)
	i++;
	if(i==1000)
	{
		i=0;
		miao++;
	}
		if(miao==60) 
		{
			miao=0;
      fen++;
		}
if (fen==60)
{	
	   fen=0;
		shi++;
}
		if(shi==24)
		{
			shi=0;
		}

		}
void Timer0Init()		//1ºÁÃë[email protected]
{
	AUXR |= 0x80;	
	TMOD &= 0xF0;		
	TL0 = 0xCD;	
	TH0 = 0xD4;		
	TF0 = 0;		
	TR0 = 1;		
	EA=1;
	ET0=1;
}

void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}

void shizhongshezhi()//                  m¿ØÖÆÑ¡Ôñʱ·ÖÃ룬°´Ò»´ÎS7£¬m¼ÓÒ»£¬µ±¼Óµ½4ʱ
{
if(S7==0)
{
Delay1ms();
if(S7==0)
{
	p=0;
  m++;
	if(m==4)
	  m=0;
	while(!S7);
}
}
}

void naozhongshezhi()//               ±äÁ¿a¿ØÖÆÄÖÖÓʱ·ÖÃ룬±äÁ¿pÖ»ÓÐ0ºÍ1£¬µ±ÎªÒ»
{
if(S6==0)
{
Delay1ms();
if(S6==0)
{
    a++;
	if(a==4)
	  a=0;
	
	p=1;
while(!S6);
}
}
 }

void jia()
 {
	
 if(S5==0)
 {
	 Delay1ms();

if(S5==0)
{
if(m==1)miao+=1;if(miao>59)miao=0;
if(m==2)fen+=1;if(fen>59)fen=0;
if(m==3)shi+=1;if(shi>23)shi=0;
	
if(a==1)nmiao+=1;if(nmiao>59)nmiao=0;
if(a==2)nfen+=1;if(nfen>59)nfen=0;
if(a==3)nshi+=1;if(nshi>23)nshi=0;	
while(!S5);
}
 } 
 }
 void jian()
 {
 if(S4==0)
 {
	 Delay1ms();

if(S4==0)
{
if(m==1)miao--;if(miao>99)miao=59;
if(m==2)fen--;if(fen>99)fen=59;
if(m==3)shi--;if(shi>99)shi=23;
	
	
if(a==1)nmiao--;if(nmiao>99)nmiao=59;
if(a==2)nfen--;if(nfen>99)nfen=59;
if(a==3)nshi--;if(nshi>99)nshi=23;	
while(!S4);
}
 
 }
 }
 
 void Timer1Init(void)		//[email protected]
{
	AUXR |= 0x40;		//?????1T??
	TMOD &= 0x0F;		//???????
	TL1 = 0xCD;		//??????
	TH1 = 0xD4;		//??????
	TF1 = 0;		//??TF1??
	TR1 = 1;
	ET1=1;
	EA=1;
} 

void shan() interrupt 3
{
	qq++;
	if(qq==2000)qq=0;
}

你可能感兴趣的:(基于stc15f2k60s2芯片单片机编程(闹铃))