模吧

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

5869查看 | 26回复

[开源教程] 最简单的数码管应用——数码管时钟

[复制链接]
发表于 2016-12-4 19:25:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 我是天才 于 2016-12-4 21:15 编辑

萝莉大神给大家分享了数码管的原理即驱动,前人栽树,后人乘凉,那么楼主就发表一个时钟教程吧
            数码管时钟主要分为三部分,第一部分是数码管的轮流显示,以显示时间;第二部分是按键设置时间;第三部分是如何精准走时
   萝莉大神已经教大家按键选择和数码管显示了,所以前两部分就比较容易了,现在只需解决如何精准走时,楼主选择的是利用单片机自带的定时计数器,它的大致原理类似与一边洗衣服一边烧水,等到水开了,水壶就会响,提醒你该灌水了,同样,定时计数器每到一定的时间会提醒单片机时间到了,单片机会先放下手中的工作处理中断事件,处理后继续执行以前的工作。这只是粗略的说说,由于高三时间紧张,就暂时不在此具体解释原理了,希望萝莉大神在以后的教程中会提到,在此先谢过了,哈哈

   成品展示:                                          //  在帖子后面奉上开源程序文件//
   


    最简单的数码管应用——数码管时钟 开源,显示时间,我是天才,简单的 作者:我是天才 4125 插件测试版,显得比较乱
最简单的数码管应用——数码管时钟 开源,显示时间,我是天才,简单的 作者:我是天才 5988 精简版,体积小了许多
最简单的数码管应用——数码管时钟 开源,显示时间,我是天才,简单的 作者:我是天才 9742 改装版,钟表笔筒,瞬间逼格大升
最简单的数码管应用——数码管时钟 开源,显示时间,我是天才,简单的 作者:我是天才 7085 升级版,高三时间紧,所以做卷子一定要速战速决,于是有了升级版,带倒计时,让你的做题变得更高效

//下面奉上精简版程序//                   /*楼主也是单片机小白,有点自恋地发了教程,由于高三时间紧,教程讲解的也不太详细,如有错误,欢迎大家指出,

  • #include<reg51.h>
  • #define uchar unsigned char
  • #define uint unsigned int
  • sbit Key1=P3^7;                  //按键1
  • sbit Key2=P3^6;                  //按键2
  • sbit Key3=P3^5;                  //按键3
  • sbit L1=P2^7;                   //小时的十位                       数码管的段选接在P0口
  • sbit L2=P2^6;                   //小时的个位
  • sbit L3=P2^5;                   //闪灯,每秒闪一次
  • sbit L4=P2^4;                   //分钟的十位
  • sbit L5=P2^3;                   //分钟的个位
  • uchar non;                         //        计时,每到60秒清零,表示1分钟时间到
  • uchar a;                        //        分钟的个位
  • uchar b;                        //        分钟的十位
  • uchar c;                        //        小时的个位
  • uchar d;                        //        小时的十位
  • uint  time;                        //        每次中断1ms,time+1,time到1000清零,表示1秒时间到
  • uchar turn;                        //        数码管轮流显示
  • uchar Key1_old;                //        记录按键1数据
  • uchar Key2_old;                //        记录按键2数据
  • uchar Key3_old;           //        记录按键3数据
  • uchar set;                   //        设置时间
  • uchar action1;           //        按键1动作
  • uchar action2;           //        按键2动作
  • uchar action3;           //        按键3动作
  • uchar select;           //        每过10ms进行一次按键选择
  • void Delay1ms()                //@12.000MHz
  • {
  •         unsigned char i, j;
  •         i = 12;
  •         j = 169;
  •         do
  •         {
  •                 while (--j);
  •         } while (--i);
  • }
  • void delay_n_ms(uint n)                  //定义n毫秒延时
  • {
  •    while(n)
  •    {
  •    Delay1ms();
  •    n=n-1;
  •    }
  • }
  • uchar code led[]={0xC0,0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};    //数组
  •    //数组序号         0      1      2      3     4     5      6       7      8     9     10
  •    //实际显示         0      0      1      2     3     4      5       6      7     8     9
  •                                        
  • main()
  • {
  • a=1;
  • b=1;                                //初始化
  • c=1;
  • d=1;
  • turn=0;
  • time=0;
  • set=0;
  • select=0;
  • non=1;
  • Key1_old=1;
  • Key2_old=1;
  • Key3_old=1;
  •           TMOD=0x11;                                          //开启中断0
  •         TH0=(65536-1000)/256;                //赋初值
  •         TL0=(65536-1000)%256;                //赋初值
  •         EA=1;
  •         ET0=1;
  •         TR0=1;
  • while(1)
  • {
  • delay_n_ms(1);                           //系统周期1ms
  • select=select+1;
  • turn=turn+1;
  •      if(turn>4)
  •       {
  •        turn=1;
  •       }
  •         
  • if(set==0)                                 //如果set=0,进行走时
  • {
  •           if(non>59)
  •           {
  •           non=0;
  •           a=a+1;
  •           }
  •            if(a>10)
  •            {
  •            a=1;
  •            b=b+1;
  •            }
  •              if(b>6)
  •                  {
  •                  b=1;
  •                  c=c+1;
  •                  }
  •                    if(d<3)
  •                    {
  •                      if(c>10)
  •                          {
  •                          d=d+1;
  •                          c=1;
  •                          }
  •                    }
  •                        if(d==3)
  •                            {
  •                            if(c>4)
  •                              {
  •                                  c=1;
  •                                  d=1;
  •                                  }
  •                            }
  •         
  •           if(time<400)                           //闪灯
  •                  {
  •                   L3=0;
  •                  }
  •                  else{L3=1;}
  • }
  • if(select>10)                        //每10ms进行一次按键选择
  • {
  • select=0;
  •     if(Key1==1)                  //按键1按下
  • {
  • if(Key1_old==0)
  • {action1=1;}}
  • Key1_old=Key1;
  • if(Key2==1)                 //按键2按下
  • {
  • if(Key2_old==0)
  • {action2=1;}}
  • Key2_old=Key2;
  • if(Key3==1)                 //按键3按下
  • {
  • if(Key3_old==0)
  • {action3=1;}}
  • Key3_old=Key3;
  • if(action1==1)
  •   {
  •   action1=0;
  •   set=set+1;
  •   if(set>2)
  •     {
  •         set=0;
  •         }
  •   }
  • if(set==1)                                 //设置分钟
  • {
  •    L3=1;non=1;
  • if(action2==1)                                  //加
  •    {
  •              action2=0;
  •           a=a+1;
  •           if(a>10)
  •            {
  •            a=1;b=b+1;
  •            }
  •               if(b>6)
  •                   {
  •                   b=1;
  •                   }
  •    }
  • if(action3==1)                                //减
  •     {
  •         action3=0;
  •         a=a-1;
  •           if(a<1)
  •            {
  •            b=b-1;a=10;
  •              if(b<1)
  •                    {
  •                    b=6;
  •                    }
  •            }
  •         }
  • }
  •   if(set==2)                           //设置小时
  •   {        
  •       L3=1;non=1;
  •   if(action2==1)                        //加
  •     { action2=0;
  •         c=c+1;
  •           if(d<3)
  •           {
  •           if(c>10)
  •             {
  •                 d=d+1;
  •                 c=1;
  •                 }
  •           }
  •           if(d==3)
  •             {
  •                 if(c>4)
  •                   {
  •                   c=1;
  •                   d=1;
  •                   }
  •                 }
  •         }
  •         if(action3==1)                        //减
  •         { action3=0;
  •         c=c-1;
  •         if(d==1)
  •           {
  •           if(c<1)
  •             {
  •                 d=3;
  •                 c=4;
  •                 } }
  •           if(d==3)
  •                {
  •                    if(c<1)
  •                      {
  •                          d=2;
  •                          c=10;
  •                          }
  •                    }
  •                 if(d==2)
  •                 {
  •                 if(c<1)
  •                   {
  •                   d=1;
  •                   c=10;
  •                   }
  •                 }
  •         }
  •   }
  •         
  • }
  • if(turn==1)                                           //轮流显示
  • {
  • L1=1;L2=0;L4=0;L5=0;
  • P0=led[a];
  • }
  • if(turn==2)
  • {
  • L1=0;L2=1;L4=0;L5=0;
  • P0=led;
  • }
  • if(turn==3)
  • {
  • L1=0;L2=0;L4=1;L5=0;
  • P0=led[c];
  • }
  • if(turn==4)
  • {
  • L1=0;L2=0;L4=0;L5=1;
  • P0=led[d];
  • }
  • }
  • }
  • void T0_time() interrupt 1                         //计时器中断,每次中断1ms
  • {
  •           TH0=(65536-1000)/256;                          //赋初值
  •         TL0=(65536-1000)%256;                          //赋初值
  •         time=time+1;
  •                 if(time>998)        
  •              {
  •                   time=1;
  •               non=non+1;                   //non加一
  •                  }
  • }


        
发表于 2016-12-4 19:32:14 | 显示全部楼层
路过,666666
发表于 2016-12-4 21:09:19 | 显示全部楼层
感谢楼主分享                                          
发表于 2016-12-4 21:19:57 | 显示全部楼层
厉害了
发表于 2016-12-4 21:42:06 | 显示全部楼层
感谢楼主分享
发表于 2016-12-4 21:46:17 | 显示全部楼层
顶!!!
发表于 2016-12-4 22:09:35 | 显示全部楼层
拿分走人,感谢楼主的奉献~
发表于 2016-12-5 09:46:10 | 显示全部楼层
这个厉害了,可惜小白不会弄
发表于 2016-12-5 10:39:16 | 显示全部楼层
不错,做的挺好的。
发表于 2016-12-5 11:21:11 | 显示全部楼层
感谢楼主分享
发表于 2016-12-5 21:14:01 | 显示全部楼层
高三的学生!真了不起!
发表于 2016-12-5 23:32:33 | 显示全部楼层
好好好,学习了。
发表于 2016-12-6 07:52:51 | 显示全部楼层
有升级版的程序么?
发表于 2016-12-6 10:46:29 | 显示全部楼层
顶贴是一种美德
同样是学生,,为什么楼主这么吊最简单的数码管应用——数码管时钟 开源,显示时间,我是天才,简单的 作者:光湿恩惠 5130 最简单的数码管应用——数码管时钟 开源,显示时间,我是天才,简单的 作者:光湿恩惠 2552 最简单的数码管应用——数码管时钟 开源,显示时间,我是天才,简单的 作者:光湿恩惠 83
 楼主| 发表于 2016-12-6 12:12:39 | 显示全部楼层
aiicsu 发表于 2016-12-6 07:52
有升级版的程序么?

有,改天发上来,那个注释比较少
发表于 2016-12-8 21:27:53 | 显示全部楼层
感谢楼主分享   
发表于 2016-12-8 21:45:11 | 显示全部楼层
高三学生有时间搞单片机不易,加油!
 楼主| 发表于 2016-12-9 00:20:13 | 显示全部楼层
q2MxeW4fg6 发表于 2016-12-8 21:45
高三学生有时间搞单片机不易,加油!

谢谢,哈哈
发表于 2016-12-11 01:13:11 | 显示全部楼层
拿分走人,感谢楼主的奉献~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|关于模吧|APP下载|广告报价|小黑屋|手机版|企业会员|商城入驻|联系我们|模吧 ( 冀公网安备13080502000084号 )

© 2013-2020 Moz8.com 模吧,玩出精彩!