我是天才 发表于 2016-12-4 19:25:05

最简单的数码管应用——数码管时钟

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

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

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


    http://www.moz8.com/data/attachment/album/201612/04/184800l1rae9r6gg46eg7a.png插件测试版,显得比较乱
http://www.moz8.com/data/attachment/album/201612/04/184805scoboj2jm0mm4mhz.png精简版,体积小了许多
http://www.moz8.com/data/attachment/album/201612/04/184927kcww0k2t2wtnjmqw.png改装版,钟表笔筒,瞬间逼格大升
http://www.moz8.com/data/attachment/album/201612/04/184732svmhvdhjgdohdjom.png升级版,高三时间紧,所以做卷子一定要速战速决,于是有了升级版,带倒计时,让你的做题变得更高效

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


[*]
[*]#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;                        //      小时的十位
[*]uinttime;                        //      每次中断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;
[*] }
[*]
[*]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;
[*] }
[*]
[*]if(turn==4)
[*] {
[*] L1=0;L2=0;L4=0;L5=1;
[*] P0=led;
[*] }
[*]}
[*]}
[*]
[*]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加一
[*]               }
[*]}
[*]

      

zjy7870477 发表于 2016-12-4 19:32:14

路过,666666

炸香机 发表于 2016-12-4 21:09:19

感谢楼主分享                                          

迟伤 发表于 2016-12-4 21:19:57

厉害了

panlongdian 发表于 2016-12-4 21:42:06

感谢楼主分享

RNjY8hXV2D 发表于 2016-12-4 21:46:17

顶!!!

w294714570 发表于 2016-12-4 22:09:35

拿分走人,感谢楼主的奉献~

yaozicao 发表于 2016-12-5 09:46:10

这个厉害了,可惜小白不会弄

麒麟科技 发表于 2016-12-5 10:39:16

不错,做的挺好的。

3300178839 发表于 2016-12-5 11:07:09

楼主利害!!!!!!!!!!!!!!!!!!!!

wurenji 发表于 2016-12-5 11:21:11

感谢楼主分享

长寿烙铁 发表于 2016-12-5 21:14:01

高三的学生!真了不起!

tjcdq 发表于 2016-12-5 23:32:33

好好好,学习了。

aiicsu 发表于 2016-12-6 07:52:51

有升级版的程序么?

光湿恩惠 发表于 2016-12-6 10:46:29

顶贴是一种美德
同样是学生,,为什么楼主这么吊http://www.moz8.com//mobcent//app/data/phiz/default/23.pnghttp://www.moz8.com//mobcent//app/data/phiz/default/23.pnghttp://www.moz8.com//mobcent//app/data/phiz/default/23.png

我是天才 发表于 2016-12-6 12:12:39

aiicsu 发表于 2016-12-6 07:52
有升级版的程序么?

有,改天发上来,那个注释比较少

67670 发表于 2016-12-8 21:27:53

感谢楼主分享   

海浪淘沙 发表于 2016-12-8 21:45:11

高三学生有时间搞单片机不易,加油!

我是天才 发表于 2016-12-9 00:20:13

q2MxeW4fg6 发表于 2016-12-8 21:45
高三学生有时间搞单片机不易,加油!

谢谢,哈哈

Dk. 发表于 2016-12-11 01:13:11

拿分走人,感谢楼主的奉献~
页: [1] 2
查看完整版本: 最简单的数码管应用——数码管时钟