找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机八位数码管显示的数字钟代码及仿真

[复制链接]
跳转到指定楼层
楼主
数字钟设计:
(1)硬件部分主要分以下电路模块:显示电路用8个共阴数码管分别显示
(2)星期(年份),小时、分钟(月份)和秒(日)
(3)通过动态扫描进行显示

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg51.h>
  2. typedef unsigned int u16;
  3. typedef unsigned char u8;
  4. unsigned char code smgduan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};          //显示0~F的值
  5. unsigned char Time;                                                                                     //用来存放定时时间

  6. //--声明全局函数--//
  7. void DigDisplay();                                                                           //动态显示函数
  8. void DigDisplay1();                                                                          //动态显示函数
  9. void Timer0Cofig(void);
  10. void delay(u16 i);
  11. u8 m,f,s;
  12. u8 nian=19,yue=3,ri=17;
  13. sbit K4=P1^3;
  14. sbit K3=P1^2;
  15. sbit K2=P1^1;
  16. sbit K1=P1^0;
  17. u8 x;                                                                                        //切换显示界面
  18. u8 x1;                                                                                       //暂停时间,进入调时
  19. void main(void)
  20. {               
  21.         P2=0X00;
  22.         Timer0Cofig();
  23.         P1=0XFF;
  24.         while(1)
  25.         {
  26.       if(!K4)                                                                                     //切换显示界面
  27.           {
  28.           delay(10);
  29.           if(!K4)
  30.           x=!x;
  31.           while(!K4);                                                                            //等待按键松开
  32.           }
  33.      if(!K1)
  34.           {
  35.           delay(10);
  36.           if(!K1)
  37.           {
  38.           TR0=!TR0;
  39.           x1=!x1;
  40.           }
  41.           while(!K1);                                                                             //等待按键松开
  42.           }
  43.            if(!K2&&x1)
  44.           {
  45.           delay(10);
  46.           if(!K2&&x1)
  47.           f++;
  48.           while(!K2&&x1);                                                                         //等待按键松开
  49.           }
  50.            if(!K3&&x1)
  51.           {
  52.           delay(10);
  53.           if(!K3&&x1)
  54.           s++;
  55.           while(!K3&&x1);                                                                         //等待按键松开
  56.           }
  57.                 if(m==60)                                                                             //秒进位
  58.                 {
  59.                 m=0;
  60.                 f++;
  61.                 }
  62.                 if(f==60)                                                                             //分钟进位
  63.                 {
  64.                 f=0;
  65.                 s++;
  66.                 }
  67.                 if(s==24)                                                                             //小时进位
  68.                 {
  69.                 s=0;
  70.                 ri++;
  71.                 }
  72.                 if(!x)
  73.                 DigDisplay();
  74.                 if(x)
  75.                 DigDisplay1();                                               
  76.    }
  77. }
  78. void delay(u16 i)
  79. {
  80.         while(i--);       
  81. }
  82. void DigDisplay()                                                                            //显示秒分时函数
  83. {
  84.    u16 i,i1;                                                                                 //显示秒
  85.    i=m%10;
  86.    i1=(m/10)%10;
  87.    P2=0X80;
  88.    P0=smgduan[i];
  89.    delay(1);                                                                                 //间隔一段时间扫描
  90.    P2=0X40;
  91.    P0=smgduan[i1];
  92.    delay(1);                                                                                 //间隔一段时间扫描
  93.    P2=0X20;                                                                                         //分隔符
  94.    P0=0xBF;
  95.    delay(1);
  96. //////////////////////////////显示分钟
  97.    i=f%10;
  98.    i1=(f/10)%10;
  99.    P2=0X10;
  100.    P0=smgduan[i];
  101.    delay(1);                                                                                 //间隔一段时间扫描
  102.    P2=0X08;
  103.    P0=smgduan[i1];
  104.    delay(1);                                                                                 //间隔一段时间扫描
  105.    P2=0X04;          
  106.    P0=0xBF;
  107.    delay(1);
  108.    //////////////////////////////显示小时
  109.    i=s%10;
  110.    i1=(s/10)%10;
  111.    P2=0X02;
  112.    P0=smgduan[i];
  113.    delay(1);                                                                                 //间隔一段时间扫描
  114.    P2=0X01;
  115.    P0=smgduan[i1];
  116.    delay(1);
  117. ///////////////////////////////
  118.         delay(80);                                                                               //间隔一段时间扫描       
  119. }
  120. void DigDisplay1()                                                                           //显示年月日函数
  121. {
  122.    u16 i,i1;                                                                                 //显示日
  123.    i=ri%10;
  124.    i1=(ri/10)%10;
  125.    P2=0X80;
  126.    P0=smgduan[i];
  127.    delay(1);                                                                                 //间隔一段时间扫描
  128.    P2=0X40;
  129.    P0=smgduan[i1];
  130.    delay(1);                                                                                 //间隔一段时间扫描
  131.    P2=0X20;                                                                                        
  132.    P0=0xBF;
  133.    delay(1);
  134. //////////////////////////////显示月
  135.    i=yue%10;
  136.    i1=(yue/10)%10;
  137.    P2=0X10;
  138.    P0=smgduan[i];
  139.    delay(1);                                                                                 //间隔一段时间扫描
  140.    P2=0X08;
  141.    P0=smgduan[i1];
  142.    delay(1);                                                                                 //间隔一段时间扫描
  143.    P2=0X04;       
  144.    P0=0xBF;
  145.    delay(1);
  146.    //////////////////////////////显示年
  147.    i=nian%10;
  148.    i1=(nian/10)%10;
  149.    P2=0X02;
  150.    P0=smgduan[i];
  151.    delay(1);                                                                                //间隔一段时间扫描
  152.    P2=0X01;
  153.    P0=smgduan[i1];
  154.    delay(1);
  155. ///////////////////////////////
  156.         delay(80);                                                                              //间隔一段时间扫描       
  157. }
  158. void Timer0Cofig(void)
  159. {
  160.         TMOD = 0x01;     //定时器0选择工作方式1
  161.     TH0  = 0x3C;         //设置初始值,定时50MS
  162.     TL0  = 0xB0;
  163.     EA   = 1;             //打开总中断
  164.     ET0  = 1;                 //打开定时器0中断
  165.     TR0  = 1;                 //启动定时器0       
  166. }
  167. void Timer0() interrupt 1
  168. {
  169.         TH0 = 0x3C;             //设置初始值
  170.         TL0 = 0xB0;
  171.         Time++;
  172.         if(Time == 20)
  173.         {
  174.                 m++;
  175.                 Time = 0;
  176.         }
  177. }
复制代码

所有资料51hei提供下载:
数字钟.zip (73.9 KB, 下载次数: 117)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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