这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 数字钟

共1条 1/1 1 跳转至

数字钟

助工
2014-10-08 21:12:24     打赏

课程设计做了个数字钟,带日历和闹钟。


/*********************************************************************
* 功能:能显示时间,月,日,星期,整点报时,闹钟设定,同时能够调整, *
*   0号键切换时间,年份,闹钟显示;1号键切换设定值,2号键为加1键,*
*   3号键为减1键,4号键为闹钟开启与关闭        *     
* 日期:2009年5月29日             *
*********************************************************************/
#include <reg52.h>
#include "jianpan.h"
#define uchar unsigned char 
#define uint unsigned int
uchar sec,min,h,mon,day,week; //秒,分,时,月,日,星期
uchar nz_sec,nz_min,nz_h;     //闹钟的时,分,秒
uchar set_1,set_2;       //切换模式标志
uchar count;
uchar a;
uint year;
uchar key;
uchar tt=0;
sbit led0=P1^0;     //调整时间标志信号
sbit led1=P1^1;     //调整日期标志信号
sbit led2=P1^2;     //调整闹钟标志信号
sbit led3=P1^3;     //闹钟开启关闭标志信号
sbit beep=P0^7; //蜂鸣器       
uchar disp[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9};   //段选
uchar disbit[]={0xff,0xef,0xcf,0xbf,0x9f,0x8f};        //位选
uchar buffer[]={0x00,0x00,0x00,0x00,0x00,0x00};     //显示缓冲区
uchar table1[]={31,29,31,30,31,30,31,31,30,31,30,31}; //闰年
uchar table2[]={31,28,31,30,31,30,31,31,30,31,30,31};   //非闰年
void init();
void display();
void key0();
void key1();
uchar add1(uchar m);
uchar dec1(uchar n);
void set_time();
void set_data();
void set_nz();
void zdbaoshi();
void naozhong();
/*********主函数************/
void main()
{
init();         //初始化
while(1)
{
   key=keyscan();    //调用键盘值
     key0();           //切换时间,年份,闹钟
   key1();           //调整时间,日期,闹钟
   set_time();       //设置时间
   set_data();       //设置日期
   set_nz();         //设置闹钟
   zdbaoshi();   //整点报时
   naozhong();   //闹钟
}
}
/**********初始化函数**************/
void init()
{
TMOD=0x011;     //用定时器1和2
TH0=0x4c;     //定时器1设为50ms
TL0=0x00;
TH1=(65536-1000)/256; //定时器2设为1ms
TL1=(65536-1000)%256;
ET0=1;
ET1=1;
EA=1;
TR0=1;
TR1=1;
sec=50;min=59;h=11;
nz_sec=0;nz_min=1;nz_h=12;
year=2009;mon=5;day=29;week=5;
}
/*********切换显示函数*************/
void key0()
{
   if(key==0)
{
set_2=0;
    set_1++;
while(key==0)    //等待按键释放
{
   key=keyscan();
   if(key!=0)
   break;


if(set_1==6)
set_1=0;   

/*************调整函数*************/
void key1()
{
if(key==1)
{
set_2++;
while(key==1)    //等待按键释放
{
   key=keyscan();
   if(key!=1)
   break;

}
if(set_2==3)
set_2=0;

/**********加1函数****************/
uchar add1(uchar m)
{
if(key==2)
{
m++;
while(key==2)   //等待按键释放
{
   key=keyscan();
   if(key!=2)
   break;

}
return(m);
}
/***********减1函数*************/
uchar dec1(uchar n)
{
if(key==3)
{
   n--;
while(key==3)    //等待按键释放
   {
    key=keyscan();
    if(key!=3)
    break;
   } 
}
return(n);
}
/*********设置时间函数***********/
void set_time()
{
if(set_1==1)
{
   if(set_2==0)     //设置秒
   { 
    sec=add1(sec);
    if(sec==60)
    sec=0;
    sec=dec1(sec);
    if(sec>=60)
    sec=59;
   }
   if(set_2==1)     //设置分
   {
    min=add1(min);
    if(min==60)
    min=0;
    min=dec1(min);
    if(min>=60)
    min=59;
   }
   if(set_2==2)     //设置小时
   {
    h=add1(h);
    if(h==24)
    h=0;
    h=dec1(h);
    if(h>=24)
    h=23;
   }
}
}
/*************设置日期函数**************/
void set_data()
{
if(set_1==3)
{
   if(set_2==0)     //设置星期
   {
    week=add1(week);
    if(week==8)
    week=1;
    week=dec1(week);
    if(week>=8)
    week=7;
   }
   if(set_2==1)     //设置天
   {
    day=add1(day);
    if(day==32)
    day=0;
    day=dec1(day);
    if(day>=32)
    day=31;
   }
   if(set_2==2)     //设置月
   {
    mon=add1(mon);
    if(mon==13)
    mon=1;
    mon=dec1(mon);
    if(mon>=13)
    mon=12;
   } 

}
/************设置闹钟函数**************/
void set_nz()
{
if(set_1==5)
{
    if(set_2==0)     //设置闹钟秒
   {
    nz_sec=add1(nz_sec);
    if(nz_sec==60)
    nz_sec=0;
    nz_sec=dec1(nz_sec);
    if(nz_sec>=60)
    nz_sec=59;
   }
   if(set_2==1)     //设置闹钟分
   {
    nz_min=add1(nz_min);
    if(nz_min==60)
    nz_min=0;
    nz_min=dec1(nz_min);
    if(nz_min>=60)
    nz_min=59;
   }
   if(set_2==2)     //设置闹钟小时
   {
    nz_h=add1(nz_h);
    if(nz_h==24)
    nz_h=0;
    nz_h=dec1(nz_h);
    if(nz_h>=24)
    nz_h=23;
   }
}
}
/**************整点报时函数****************/
void zdbaoshi()
{
if(min==0&&(sec==0)&&set_1==0)
{
   beep=0;

}
/*************闹钟函数********************/
void naozhong()

if(key==4)       //闹钟开启关闭
{
tt++;
    while(key==4)    //等待按键释放
{
   key=keyscan();
   if(key!=4)
   break;


if(tt==2) tt=0;
   if(tt==0) led3=1; 
if(tt==1)
{
   led3=0;
if(nz_h==h&&nz_min==min&&nz_sec==sec)

   while(sec<10&&key!=4)
   {
   key=keyscan();
     beep=0;
   }

}
}
/***************中断函数T0*************/
void timer0() interrupt 1

TH0=0x4c;
TL0=0x00;
count++;
if(count==20)
{
   count=0;
   sec++;
   if(sec==60)
   {   
    sec=0;
    min++;
    if(min==60)
    {
     min=0;
     h++;
     if(h==24)
     {
      h=0;
      week++;
      day++;
      if(week==8)
      {
       week=1;
      }
      if(year%4==0&&year%100!=0||year%400==0)    //闰年
      {
       if(day==table1[mon]+1)
       {
        day=1;
        mon++;
        if(mon==13)
        {
        mon=1;
         year++;
        }
       }
       else
      {
       if(day==table2[mon]+1)    //非闰年
       {
        day=1;
        mon++;
        if(mon==13)
        {
        mon=1;
         year++;
        }
       }
      }
      }
     }
    }
   }
}
}
/*********中断T1显示函数**************/
void timer1() interrupt 3
{
   TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
    if(set_1==0||set_1==1)     //时间显示
{   
   if(set_1==0)
{ led0=1;led1=1;led2=1; }
   if(set_1==1)
    {
     TR0=0;       //关定时器
    switch(set_2) 
    {
     case 0: led0=1;led2=0;break;
     case 1: led2=1;led1=0;break;
     case 2: led1=1;led0=0;break;
    }
    }    
   buffer[0]=sec%10;
   buffer[1]=sec/10;
   buffer[2]=min%10;
   buffer[3]=min/10;
   buffer[4]=h%10;
   buffer[5]=h/10;
   P0=disp[buffer[a]]&disbit[a];

   if(set_1==2||set_1==3)     //日期显示
{
   TR0=1;        //开定时器
    if(set_1==2)
      { led0=1;led1=1;led2=1; }
   if(set_1==3)
   { 
     switch(set_2) 
    {
     case 0: led0=1;led2=0;break;
     case 1: led2=1;led1=0;break;
     case 2: led1=1;led0=0;break;
    }
   }        
   buffer[0]=week%10;
   buffer[1]=week/10;
   buffer[2]=day%10;
   buffer[3]=day/10;
   buffer[4]=mon%10;
   buffer[5]=mon/10;
   P0=disp[buffer[a]]&disbit[a];

   if(set_1==4||set_1==5||set_1==6)     //闹钟显示
{   
   if(set_1==4)
   { led0=1;led1=1;led2=1; }
    if(set_1==5)
    {
     switch(set_2) 
    {
     case 0: led0=1;led2=0;break;
     case 1: led2=1;led1=0;break;
     case 2: led1=1;led0=0;break;
    }
    }
   buffer[0]=nz_sec%10;
   buffer[1]=nz_sec/10;
   buffer[2]=nz_min%10;
   buffer[3]=nz_min/10;
   buffer[4]=nz_h%10;
   buffer[5]=nz_h/10;
   P0=disp[buffer[a]]&disbit[a];

   a++;
   if(a==6)
   a=0;
}


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]