找回密码
 立即注册

QQ登录

只需一步,快速开始

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

可调单片机数字时钟的设计

[复制链接]
跳转到指定楼层
楼主
软件设计:
#include<reg51.h>
#define ulong unsigned long
char tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管数字码
char tab_dp[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x70,0x10};//共阳数码管数字码(带小数点)
#define LED P0    //P0为数码管的段选
#define LIGHT P1  //P1为时分秒位的指示灯
#define WS P2  //P2为数码管的位选
sbit time_change=P3^0;  //P3^0为“调时”按键
sbit time_choose=P3^1;  //P3^1为“选择时分秒”按键
sbit time_inc=P3^2;  //P3^2为“增加”按键
sbit time_red=P3^3;         //P3^3为“减小”按键
sbit time_ok=P3^4;  //P3^4为“完成”按键
ulong t;
ulong sec,min,hour,sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi; //定义秒,分,时,秒的个位,十位,分的个位,十位,时的个位,十位
int choose_n;  //按下“选择时分秒”按键的次数
int flag;    //定义“调时”按键的标志位
void init();
void display();
void delay(int);
void time_modify();
void main()
{
     init();
     while(1)
     {
         TR0=1;
         display();
         time_modify();
     }
}
void init()
{
     WS=t=LIGHT=choose_n=0;
     sec_ge=sec_shi,min_ge,min_shi,hour_ge,hour_shi=sec=min=hour=flag=0;
     TMOD=0x01;        //定义定时器0工作与方式1
     TH0=(65536-5536)/256;    //定时器赋初值
     TL0=(65536-5536)%256;
     EA=1;    //开总中断和T0中断
     ET0=1;
}
//--------延时子函数-------------------//
void delay(int x)
{
     int i,j;
     for(i=x;i>0l;i--)
     for(j=255;j>0;j--);
}
//-------------显示子函数---------------//
void display()
{
     int i=0;
     if(TF0==1)    //如果定时器溢出
     {
         TF0=0;    //清中断标志位
         t++;
         if(t==10)
         {
             t=0;
             sec++;    //秒加1
                         if(sec==60)  //如果秒为60,则清零,分加1
             {
                sec=0;
                min++;
             }
             if(min==60)    //如果分为60,则清零,时加1
             {
                 min=0;
                 hour++;
             }
             if(hour==24)    //如果时为24,则清零
             {
                hour=0;
             }
         }
     }
     sec_ge=sec%10;    //秒的个位和十位
     sec_shi=sec/10;
     min_ge=min%10;    //分的个位和十位
     min_shi=min/10;
     hour_ge=hour%10;  //时的个位和十位
     hour_shi=hour/10;
     WS=0x20;    //循环扫描
     LED=tab[sec_ge];
     delay(1);
     WS=0x10;
     LED=tab[sec_shi];
     delay(1);
     WS=0x08;
     LED=tab_dp[min_ge];
     delay(1);
     WS=0x04;
     LED=tab[min_shi];
     delay(1);
     WS=0x02;
     LED=tab_dp[hour_ge];
     delay(1);
     WS=0x01;
     LED=tab[hour_shi];
     delay(1);
}
//----------------调时子程序----------------------//
void time_modify()
{
     if(time_change==0)    //如果“调时”按键按下
     {
         delay(5);      //延时去抖
         if(time_change==0)
         {
             flag=1;    //标志位置1
             while(flag)    //当标志位为1时才能进行时间调整
             {
                 TR0=0;  //定时器停止
                 display();  //显示停止时的时间
                 if(time_ok==0)  //如果“完成”按键按下
                 {
                      delay(15);    //延时去抖
                      if(time_ok==0)
                      {
                          flag=0;  //标志位清零
                      }
                 }
                 if(time_choose==0)  //如果“时分秒选择”按键按下
                 {
                     delay(30);  //延时去抖
                     if(time_choose==0)
                     {
                          ++choose_n;  //按下的次数增加
                           if(choose_n==4)  //如果次数达到4次
                           {
                               choose_n=1;  //次数清零
                           }
                           if(choose_n==1)  //如果次数为1,秒指示灯亮
                           {
                               LIGHT=0x03;
                           }
                           else if(choose_n==2) //如果次数为2,分指示灯亮
                           {
                               LIGHT=0x0c;
                           }
                           else if(choose_n==3)  //如果次数为3,时指示灯亮
                           {
                               LIGHT=0x30;
                           }
                     }
                }
                if(time_inc==0)      //如果“增加”按键按下
                {
                    delay(30);    //延时去抖
                    if(time_inc==0)
                    {
                        switch(choose_n)  //分支结构,根据choose_n的值来判断哪一位加1
                        {
                            case 1:    //如果choose_n为1,秒加1,到60清零
                            {
                                 sec++;
                                 if(sec==60)
                                 sec=0;
                                 break;
                            }
                            case 2:      //如果choose_n为2,分加1,到60清零
                            {
                                min++;
                                if(min==60)
                                min=0;
                                break;
                             }
                             case 3:    //如果choose_n为3,时加1,到24清零
                            {
                                hour++;
                                if(hour==24)
                                hour=0;
                                break;
                            }
                            default:break;
                            }
                     }
                }  
                            if(time_red==0)      //如果“减小”按键按下
                {
                    delay(30);    //延时去抖
                    if(time_red==0)
                    {
                        switch(choose_n)  //分支结构,根据choose_n的值来判断哪一位加1
                        {
                            case 1:    //如果choose_n为1,秒减1,到0清零
                            {
                                 sec--;
                                 if(sec==0)
                                 sec=60;
                                 break;
                            }
                            case 2:      //如果choose_n为2,分减1,到0清零
                            {
                                min--;
                                if(min==0)
                                min=60;
                                break;
                            }
                            case 3:    //如果choose_n为3,时减1,到0清零
                            {
                                 hour--;
                                 if(hour==0)
                                 hour=24;
                                 break;
                            }
                            default:break;
                        }
                    }
                }
            }
       }
   }
}
硬件设计:


捕获.PNG (42.08 KB, 下载次数: 66)

可调数字时钟的设计

可调数字时钟的设计

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:317383 发表于 2020-3-21 21:16 | 只看该作者
感觉不错
回复

使用道具 举报

板凳
ID:738471 发表于 2020-4-26 14:09 | 只看该作者
要是想加一个定时器应该怎么办大佬
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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