单片机电子钟

 

 

 

 

 

 

 

 

#include <AT89X52.h>   //头文件
#define uchar unsigned char
#define uint unsigned int
sbit start=P3^2; //按键定义
sbit stop=P3^3 ;  //时钟暂停
sbit jia1=P2^0;   //小时调整按键定义
sbit jia2=P2^1;   //分调整按键定义
sbit jian1=P2^2; //闹钟按键分调整
sbit jian2=P2^3;   // 闹钟时按键调整
sbit dian=P1^1;
sbit  ff=P1^0;  //闹铃端口输出

uchar num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8 ,0x80,0x90 };//数码管字码显示
uchar num1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78 ,0x00,0x10 };
uchar num2[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8 ,0x80,0x90 };
uchar  disp[]={0,0,0,0,0,0,0,0,0,0,0,0};
uchar  sss=0;
uchar  ssss=0;
uchar  shi,fen,miao,shi1,fen1,miao1;
void   display();   //显示函数声明
void   delay(uint d); //延时函数声明
void   scan();  //按键扫描函数声明
void   baojing(); //整点报时函数声明
void   display1(); //闹铃调整显示函数声明
void   naoling();  //闹铃主函数声明
void   dddd();  //闹铃振动频率函数声明

///**************************************主程序     ****************************
 main()
 {
TMOD=0X10;  //选定时器T1     T1 0001 T0 0   工作方式1
TH1=0X3C;//充初值65535----50000us+15536=   0.05S
TL1=0XB0;
EA=1 ;
ET1=1;
dian=0;
ff=0;
shi=11;
fen=59;
miao=50;
P2=0XfF;
shi1=13;
fen1=3;
miao1=0;
while(1)
 { scan();  //调用按键扫描子程序
    display();//调用时间显示子程序
 baojing();//调用整点报时子程序
 naoling();//调用闹铃子程序
 
 }
 }
 
//********************************定时器中断处理程序   *****************************
 void  ddd()  interrupt  3
 {
TH1=0X3C;          //充初值65535----50000us+15536=   0.05S
TL1=0XB0;
sss=sss+1;
if(sss>=20)
{dian=~dian;
}
            // 计数单元加一
if(sss>=20 )   //判断中断是否够20次 (1s)

                
  sss=0;    //清计数单元,为下一次计数做准备
 miao=miao+1;
}
if(miao>=60)
{
miao=0;
fen=fen+1;
}
if(fen>=60)
{fen=0;
shi=shi+1;
}
if(shi>=24)
  {shi=0;
   }
 disp[0]=num[shi/10]; // 时十位显示 
 disp[1]=num[shi%10]; //  时个位
 disp[2]=num[fen/10]; //  分十位
 disp[3]=num[fen%10]; //   分个位
 disp[4]=num[miao/10];//   秒十位
 disp[5]=num[miao%10];// 秒个位
 disp[6]=num2[shi1/10]; // 时十位显示 
 disp[7]=num2[shi1%10]; //  时个位
 disp[8]=num2[fen1/10]; //  分十位
 disp[9]=num2[fen1%10]; //   分个位
 disp[10]=num2[miao1/10];//   秒十位
 disp[11]=num2[miao1%10];// 秒个位

 }
//************闹铃频率子程序  *****************************************************
void  dddd() 
{uchar i;
for(i=0;i<125;i++)
     ff=~ff;
}

 

//*********************************显示子程序   *********************************** 

void  display() 
{P0=disp[0];   //送字型码
 P2=0x7f;   //送数码管位码
 delay(1);


 P0=disp[1];
 P2=0xbf;
 delay(1);

 P0=disp[2];
 P2=0xdf;
 delay(1);

 P0=disp[3];
 P2=0xef;
 delay(1);
 
 }
    //**********************************延时  程序  ******************************
 void delay(uint d)
{uchar i;
while(d--)
{for(i=0;i<125;i++)
  {;}
 }
 }     
 //******************按键扫描*********************************************************
            
void  scan()
{if (start==0)
  {delay(100);
  if(start==0)
   TR1=1;
   P1=0X7f ; 
   }   
else if (stop==0)
  {delay(100);
   if(stop==0)
   TR1=0;
 P1=0XFF;                 
 }
else  if(jia1==0)//按下时加一                   
{delay(100);
  if(jia1==0)
   shi=shi+1;
   display();
  
  }
else  if(jia2==0)//按下分加一                       
{delay(100);
  if(jia2==0)
   fen=fen+1;
   display();

}
 }
 //***************  整点报时    ***********************************************
 void baojing()   
 {
 if (fen==0&&miao==0)
      P1_0=0;
  if (miao==1)
      P1_0=1;
  }
 
 void  naoling ()  //闹铃子程序
 {while(jian1==0)
    { delay(100);
  if(jian1==0)
  fen1=fen1+1;
  P1_2=0;
  display1();
  delay(1000);
   }
  while(jian2==0)
    { delay(100);
  if(jian2==0)
  shi1=shi1+1;
    display1();
 delay(1000);
 
  }
   if(shi==shi1&&fen==fen1)
 {  dddd();
    if(miao>10)
  P1_0=1;
  }
 
}
//******************  闹铃调整显示程序  *************************************

void  display1()  
{ P0=disp[6];
 P2=0x7f;
delay(1);

P0=disp[7];
P2=0xbf;
delay(1);

 P0=disp[8];
 P2=0xdf;
 delay(1);
 
P0=disp[9];
P2=0xef;
 delay(1);
}

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值