找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3363|回复: 1
打印 上一主题 下一主题
收起左侧

自己做的电子钟,代码加电路图都有

[复制链接]
跳转到指定楼层
楼主

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code duanxuan[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0xff};
uchar tt=0;
uchar month=10,day=1,sec=0,min=0,hour=0,b;
uint year=2016;
sbit key0=P1^0;  //复位键
sbit key1=P1^1;  //秒加1键
sbit key2=P1^2;  //分加1键
sbit key3=P1^3;  //时加1键
sbit key4=P1^4;  //日加1键
sbit key5=P1^5;  //月加1键
sbit key6=P1^6;  //年加1键
//******************延时函数****************
void delay(uint k)
{
  uchar j;
  while((k--)!=0)
  {
  for (j=0;j<250;j++);
  }
}
//*****************显示函数*****************
void disPlay()
{
P3=0x80;                 //秒和日的个位显示
P0=duanxuan[sec%10];     //显示秒的个位
P2=duanxuan[day%10];     //显示日的个位
delay(1);
P3=0x40;                 //秒和日的十位显示
P0=duanxuan[sec/10];     //显示秒的十位
P2=duanxuan[day/10];     //显示日的十位
delay(1);
P3=0x20;                 //时钟显示“-”,日期显示月的个位
P0=duanxuan[10];         //调数组元素,显示“-”
P2=duanxuan[month%10];   //显示月的个位
delay(1);
P3=0x10;                 //分的个位显示和月的十位显示
P0=duanxuan[min%10];     //显示分的个位
P2=duanxuan[month/10];   //显示月的十位
delay(1);
P3=0x08;                 //分的十位显示和年的个位显示
P0=duanxuan[min/10];     //显示分的十位
P2=duanxuan[year%10];    //显示年的个位
delay(1);
P3=0x04;                 //时钟显示“-”,日期显示年的十位
P0=duanxuan[10];         //显示“-”
P2=duanxuan[year/10%10]; //显示年的十位
delay(1);
P3=0x02;                 //小时的个位和年的百位显示
P0=duanxuan[hour%10];    //显示秒的个位
P2=duanxuan[year/100%10];//显示年的百位
delay(1);
P3=0x01;                 //小时的十位和年的千位显示
P0=duanxuan[hour/10];    //显示分的十位
P2=duanxuan[year/1000];  //显示年的个位
delay(1);
}
//**************************闰年判断******************
void runnian()
{
  if((year%4==0)&&(year%100!=0)||(year%400)==0)   //判断是否为闰年
  {
     if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))  //每月31天的月份
     {b=32;}
     if((month==4)||(month==6)||(month==9)||(month==11))                                       //每月30天的月份
     {b=31;}
     if((month==2))      //如是闰年,2月为29天
      {b=30;}   
  }
else
    {
     if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))  //每月31天的月份
     {b=32;}
     if((month==4)||(month==6)||(month==9)||(month==11))                                       //每月30天的月份
     {b=31;}
     if((month==2))      //如不是闰年,2月为28天
      {b=29;}   
    }
}
/**************************按键调整时间函数*****************/
void keyscan()      //按键控制函数
{
  if (key0==0)
    {
     delay(30);     //去抖动
     if (key0==0)
      {
       sec=0; min=0; hour=0; year=2014;
       month=10; day=1;    //复位键被按下,恢复初始值
      }  
     }
  if (key1==0)      //判断“秒”的调整键是否被按下
    {
     delay(30);     //去抖动
     if (key1==0)
      {
       sec++;       //是“秒”的按键被按下,每按键一次加1
       if (sec==60) //若秒的变量sec加到60,则sec清零
         {
          sec=0;
          }
     }
}
   if (key2==0)     ////判断“分”的调整键是否被按下
    {
     delay(30);     //去抖动
     if (key2==0)
      {
       min++;       //是“分”的按键被按下,每按键一次加1
       if (min==60) //若秒的变量min加到60,则min清零
         {
          min=0;
          }
     }
}
   if (key3==0)     ////判断“时”的调整键是否被按下
    {
     delay(30);     //去抖动
     if (key3==0)
      {
       hour++;       //是“时”的按键被按下,每按键一次加1
       if (hour==24) //若时的变量hour加到24,则hour清零
         {
          hour=0;
          }
     }
}
   if (key4==0)     ////判断“日”的调整键是否被按下
    {
     delay(30);     //去抖动
     if (key4==0)
      {
       day++;       //是“日”的按键被按下,每按键一次加1
       if (day==32) //若日的变量day加到32,则day=1
         {
          day=1;
          }
     }
}
   if (key5==0)     //判断“月”的调整键是否被按下
    {
     delay(30);     //去抖动
     if (key5==0)
      {
       month++;       //是“月”的按键被按下,每按键一次加1
       if (month==13) //若月的变量month加到13,则month=1
         {
           month=1;
          }
     }
}
   if (key6==0)       //判断“年”的调整键是否被按下
    {
     delay(30);     //去抖动
     if (key6==0)
      {
       year++;       //是“年”的按键被按下,每按键一次加1
       if (year==2500) //若年的变量year加到2500,则year=2016
         {
          year=2016;
          }
      }
     }
}
//*************************主函数******************
void main()
{
  TMOD=0x10;  //初始化
  ET0=1;      //开定时器T0中断
  TR0=1;      //启动定时器T0
  TH0=(65536-50000) /256;  //赋定时50ms初值
  TL0=(65536-50000) %256;
  EA=1;       //开中断总开关
  while(1)
   {
    keyscan();
    }
}
//***************定时器T0中断函数*****************
void time1() interrupt 1
{
  TH0=(65536-50000) /256;  //赋定时50ms初值
  TL0=(65536-50000) %256;
   disPlay();              //调用显示函数
   tt++;                   //计中断次数,中断20次为1s
   if (tt=20)
    {
      tt=0;               //如计满1s,tt清零
      sec++;              //秒加1
      if (sec==60)        //如计满60s,变量sec清0
       {
        sec=0;
        min++;            //分加1
          if (min==60)    //如计满60min,变量min清0
          {
           min=0;
           hour++;        //时加1
             if (hour==24)//如计满24小时,变量hour清0
               {
                 hour=0;
                 day++;   //日加1
                 runnian();//调用闰年函数,确定每月的天数
                 if (day==b)  //根据每天的天数值b,判断是否要月加1
                  {
                    day=1;
                    month++;  //月加1
                   if (month==13) //如计满12个月,变量month清零
                    {
                      month=1;
                      year++;     //年加1
                     }
                   }
                }
          }  

        }
    }
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:127929 发表于 2016-6-24 08:26 来自手机 | 只看该作者
楼主    程序是不是有错,运行不了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表