找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7275|回复: 0
收起左侧

基于单片机多位LED数码管的数字钟设计报告

[复制链接]
ID:329821 发表于 2018-5-19 12:52 | 显示全部楼层 |阅读模式
基于多位LED数码管的数字钟设计
【中文摘要】设计的主要内容就是结合软件Keil和Proteus来仿真一个由单片机AT89C51芯片和多位LED数码管为核心的单片机数字时钟,从而锻炼出学习、设计、开发软、硬件的能力。设计已完成的数宇钟的基本功能:正常走时(年、月、日、时、分、秒)、校正时间和秒表功能。且操作简单、运行稳定。


1前言
     数字钟具有走时准确,一钟多用等特点,在生活中已经得到广泛的应用。虽然现在市场上已有现成的电子钟集成电路芯片,价格便宜、使用也方便。但是,人们对电子产品的应用要求越来越高,数字钟不但可以显示当前的时问,而且可以显示期、农历、以及星期等,给人们的生活带来了方便。
    时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢。二是指系统的标准定时时钟,即定时时间,它通常有两种实现方法:一是用软件实现,即用单片机内部的可编程定时/计数器来实现,但误差很大;二是用专门的时钟芯片实现,在对时间精度要求很高的情况下,通常采用这种方法。
本文主要介绍用单片机内部的定时/计数器来实现多功能时钟的方法,设计由单片机AT89C51芯片和和多位LED数码管为核心,辅以必要的电路等,构成的一个单片机数字时钟。
2设计方案
2.1设计思路
    数字钟的功能就是显示秒、分和小时,其算法是60秒为1分钟,60分钟为1小时,一天为24小时。因此需要秒计数器到59秒的时候,再加1秒时,秒计数器清0,分钟计数器加1;秒计数器加到59秒,分钟计数器到59分时,再加1秒时,秒计数器和分计数器同时清0,小时计数器加1;当小时计数器为23小时,分计数器为59分,秒为59秒的时候,再加1秒时,秒计数器、分计数器和小时计数器同时清零。数字钟的核心就是要产生秒信号,这里利用单片机的定时器TO产生。定时器TO有4种工作方式,可以采用中断方式和查询方式编程。
此数字时钟由主模块(AT89C51)、显示模块(多位LED数码管)、控制模块和计时运算模块四大部分组成。其中控制模块和计时运算模块主要对年月日、时分秒的数值显示和调整进行操作,并且秒计算到60时,自动清零并向分进1;分计算到60时,自动清零并向时进1;时计算到24时,自动清零。这样,就形成了循环计时,显示模块主要用来显示当前计数值。AT89C51是整个设计的核心,主要用来产生定时中断,传输数据和控制各个部件工作。   
数字钟格式:XX.XX.XX ,从左向右分别为时/年、分/月、秒/日。时分秒完成由秒01一直加1至59,再恢复00;分加1,由00至01,一直加1至59,再恢复00;时加1,时由00加至23后秒分时全部清零;该钟使用TO做定时中断。
时钟校正:走时过程中直接调整且不影响走时准确性。按下相应次数功能键S1进入相应数位的调整;按下S2按键加,相应数位加1;按下S3按键减,相应数位减1。
秒表功能:按下功能键S1对应次数,进入秒表计时功能;按下S2按键加,开始计时;按下S3按键减,暂停计时;暂停计时时,按下S2按键加,继续计时;按下S4按键,退出。
年月显示:按住S4按键不放,显示年月日。
2.2模块功能说明
(1)单片机AT89C51简介,如下图1
图1  AT89C51引脚图
VCC:供电电压。
    GND:接地。
    P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接口。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
    ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理在外部执行状态ALE禁止,置位无效。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
  /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
    ①TMOD定时器/计数器方式寄存器
定时器方式控制寄存器TMOD在特殊功能寄存器中,字节地址为89H,无位地址。
  ②TCON定时器/计数器控制寄存器
TCON在特殊功能寄存器中,字节地址为88H,位地址(由低位到高位)为88H--8FH,由于有位地址,十分便于进行位操作。
③定时器/计数器的初始化
由于定时器/计数器的功能是由软件编程确定的,所以一般在使用定时/计数器前都要对其进行初始化,使其按设定的功能工作.初始货的步骤一般如下:
  • 确定工作方式(即对TMOD赋值),预置定时或计数的初值。
2、根据需要开放定时器/计数器的中断(直接对IE位赋值)。
3、启动定时器/计数器。
(2)多位LED数码管7SEG-MPX6-CA简介如下2
           图2  7SEG-MPX6-CA数码管模型图
    7SEG-MPX6-CA是7段6位共阳级数码管,DP为小数点,位码(1-6)应轮流通高电位,段码控制数码管的显示:0-e,1-d,2-p,3-c,4-g,5-b,6-f,7-a.共阳极LED数码管,它是将发光二极管的阳极(正极)短接后作为公共阳极.当驱动信号为低电平才能发光。
本实验采用动态显示,即节省了I/O口,又能降低能耗。
显示过程注意消影。
(3)其余件如下3
    BUTTON             PNP
   POWER       GROUND          RES
             图3  所需用到的其余元件
2.3系统总体原理图如下4
                    图4  基于多位LED数码管的数字钟总图
2.4电路图的接法设计
鉴于仿真的单片机数字时钟的美观性,取消各模块间的可见连线,利用Proteus中的Edit Wire Style 按钮来连接各个端口。
单片机P1端口接按键S输入;单片机P0端口接段码驱动到数码管;单片机P2端口接位码驱动到数码管。
2.5按键功能说明
  1、功能键--根据按下的次数,分别调节时间和年月,按位调节,同时调整位闪烁,按下11次后进入秒表,期间可以按退出键退出功能调节或秒表。
  2、数字加---进入时间或年月调节时,按此键闪烁位数字加一,秒表模式下为秒表开始键。
  3、数字减---进入时间或年月调节时,按此键闪烁位数字减一,秒表模式下为秒表暂停键。
  4、退出键---进入时间或年月调节时,按此键保存调节并退出,没进入时间或年月调节时按此键显示年月。
3 程序流程图
3.1时钟显示程序流程图如下图5
    图5 时钟显示程序流程图
3.2外部中断处理流程图如下图6
     图6  外部中断处理流程图



3.3函数模块及功能
(1)Void Time0() interrupt 1
     定时器0中断服务程序,供时钟主程序使用
(2)Void Time1() interrupt 3
     定时器1中断服务程序,供秒表使用
(3)Void yanshi(uint z)
     延时程序,供动态扫描与按键去抖
(4)Void xianshi()
     动态扫描程序
(5)Void shizhong()
     时钟主程序
(6)Void key1()
     按键1检测,按的次数不同进入不同调节功能
(7)Void key2()
     按键2检测,数字加或秒表计时
(8)Void key3()
     按键3检测,数字减或秒表暂停
(9)Void key4()
     按键4检测,按住不放显示年月,退出功能
(10)Void nyr()
     年月日调节
(11)Void miaobiao()
     秒表,精确到1%秒
(12)Void init()
     初始化设置中断
4 设计总结
这次对数字钟的设计,经过认真地查找资料、编写程序以及调试程序,结果达到验证无误。从开始设计到仿真实现,再到论文文章的完成,每走一步对我来说都是新的尝试与挑战。从单片机模块数字钟的设计过程中我找到了一些单片机开发的规律:先了解所有元件的具体内容,从而画出其电路图,使数字钟从简易变成多功能的方式,虽没有做闹铃功能的多功能数字钟,却知晓了其方法。从而更好地让自己踏入单片机应用领域的第一步。
【参考文献】
[1]赵文博,刘文涛.单片机语言C51程序设计[M].人民邮电出版社,2006
[2]石从刚.MCS-51单片机原理与应用实验实训教程[M].北京航空航天大学出版社,2007
[3]张靖武.单片机系统的PROTEUS设计与仿真[M].电子工业出版社,2009
[4]李精华.基于数字钟设计的单片机课程项目开发[J].桂林航天工业高等专科学校学报,2010
附录:
程序代码及说明
  1. #include <AT89X51.H>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. /*********************************
  5.                             定义变量和数码表
  6. *********************************/
  7. uchar code shuma[]={
  8. 0x14,0xd7,0x4c,0x45,0x87,
  9. 0x25,0x24,0x57,0x04,0x05};//数码表
  10. uchar code fenge[]={
  11. 0x10,0xD3,0x48,0x41,0x83,
  12. 0x21,0x20,0x53,0x00,0x01};
  13. //带点的数码表
  14. uchar code weixuan []={
  15. 0x7f,0xBf,0xDf,0xEf,0xf7,0xfb,0xff};
  16. //位选控制表
  17. uchar t,tt,a,b,c,d,e,f,x,y,id,fen
  18. ,miao,hm,mm,ff,shi,ri,yue,nian;
  19. sbit s1=P1^0;//
  20. 菜单键,按下的次数进入不同的调节功能
  21. sbit s2=P1^1;//数字加键、秒表开始键
  22. sbit s3=P1^2;//数字减键、秒表暂停键
  23. sbit s4=P1^3;
  24. //显示年月日,菜单退出键
  25. /**********************************
  26.                             定时器0中断服务程序
  27.                             供时钟主程序使用
  28. **********************************/
  29. void Time0()interrupt 1
  30. { TH0=(65536-49990)/256;
  31. //装初值,使定时器0每50毫秒产生一次中断
  32.   TL0=(65536-49990)%256;
  33. //装初值,使定时器0每50毫秒产生一次中断
  34.               t++;//中断次数
  35.               if(t==21)
  36. //在调节时间或年月时把t控制在20以内
  37. //避免中断次数不受控
  38.               {  t=0; }
  39. }
  40. /************************************
  41.                             定时器1中断服务程序
  42.                                           供秒表使用
  43. ************************************/
  44. void Time1() interrupt 3
  45. { TH1=(65536-1001)/256;
  46. //装初值,使定时器1每1毫秒产生一次中断
  47.    TL1=(65536-1001)%256;
  48. //装初值,使定时器1每1毫秒产生一次中断
  49. tt++;
  50. if(tt==11)
  51. tt=0; }
  52. /************************************
  53.                                           延时程序
  54.                             供动态扫描和按键去抖用
  55. 如果是实物的话,x的值设为3就可以了
  56. ************************************/
  57. void yanshi(uint z)
  58. { for (x=25;x>0;x--)
  59.   for (y=z;y>0;y--); }
  60. /************************************
  61.                                动态扫描程序
  62. ************************************/
  63. void xianshi ()
  64. { P0=0xff;//消影
  65.   P2=weixuan[0];//第一位数码管
  66.   if(t<=10)//数码管闪烁
  67. { if(id==1)//调节小时十位时闪烁
  68.   { P2=weixuan[6]; }
  69.               if(id==5)//调节年十位时闪烁
  70.               { P2=weixuan[6]; }
  71. }
  72. P0=shuma[a];//显示数码
  73. yanshi(5);
  74. //提高亮度,使每一位数码管一样亮
  75. P0=0xff;//消影
  76. P2=weixuan[1];//第二位数码管
  77. if(t<=10)//数码管闪烁
  78. { if(id==2)//调节小时个位时闪烁
  79. { P2=weixuan[6]; }
  80. if(id==6)//调节年十位时闪烁
  81. { P2=weixuan[6]; }
  82. }
  83. P0=fenge[b];//显示数码
  84. yanshi(5);
  85. //提高亮度,使每一位数码管一样亮
  86. P0=0xff;//消影
  87. P2=weixuan[2];//第三位数码管
  88. if(t<=10)//数码管闪烁
  89. {if(id==3)
  90. //调节分十位时闪烁
  91. { P2=weixuan[6]; }
  92.    if(id==7)//调节月十位时闪烁
  93.    { P2=weixuan[6]; }
  94. }
  95. P0=shuma[c];//显示数码
  96. yanshi(5);
  97. //提高亮度,使每一位数码管一样亮
  98. P0=0xff;//消影
  99. P2=weixuan[3];//第四位数码管
  100. if(t<=10)//数码管闪烁
  101. { if(id==4)//调节分个位时闪烁
  102.   { P2=weixuan[6]; }
  103.    if(id==8)//调节月个位时闪烁
  104.               { P2=weixuan[6]; }
  105. }
  106. P0=fenge[d];//显示数码
  107. yanshi(5);
  108. //提高亮度,使每一位数码管一样亮
  109. P0=0xff;//消影
  110. P2=weixuan[4];//第五位数码管
  111. if(t<=10)
  112. {if(id==9)//调节日十位时闪烁
  113. { P2=weixuan[6]; }
  114. }
  115. P0=shuma[e];//显示数码
  116. yanshi(5);
  117. //提高亮度,使每一位数码管一样亮
  118. P0=0xff;//消影
  119. P2=weixuan[5];//第六位数码管
  120. if(t<=10)
  121. { if(id==10)//调节日的个位时闪烁
  122. { P2=weixuan[6]; }
  123. }
  124. P0=shuma[f];//显示数码
  125. yanshi(5);
  126. //提高亮度,使每一位数码管一样亮
  127. }
  128. /************************************
  129.                                           时钟主程序
  130. ************************************/
  131. void shizhong()
  132. { if(t==20)
  133. //进入20次中断后秒加1,50ms*20=1s
  134. { t=0;
  135.    miao++; }
  136.    if(miao==60)//秒够60清零,分加1
  137.               { miao=0;
  138.               fen++; }
  139.               if(fen==60)//分够60清零,时加1
  140.               { fen=0;
  141.                  shi++; }
  142.                 if(shi==24)//时够24清零,日加1
  143.                 { ri++;
  144.                             shi=0; }
  145. }
  146. /************************************
  147.                                           按键1检测
  148. 按键检测,按的次数不同进入不同调节功能
  149. ************************************/
  150. void key1()
  151. { while(s1==0)
  152. { yanshi(300);//延时去抖
  153.    while(s1==0)
  154.   { id++;//根据ID值的不同进入各种功能
  155.               while(s1==0);//等待松开菜单键
  156.               yanshi(350);
  157.               while(s1==0); }
  158.               }
  159. }
  160. /************************************
  161.                                           按键2检测
  162.        按键检测,数字加或秒表开始
  163. ************************************/
  164. void key2()
  165. { while(s2==0)
  166. { yanshi(300);//延时去抖
  167.    while(s2==0)
  168.   { if(id==11)
  169. //只允许在秒表模式下开始
  170.    { TR1=1;//秒表开始 }
  171.               switch(id)//根据ID值调整不同的位
  172.               { case 1:a++;break;                                                                                   
  173.                 case 2:b++;break;                                                                                   
  174.                 case 3:c++;break;                                                                                   
  175.                 case 4:d++;break;
  176.                 case 5:a++;break;
  177.                 case 6:b++;break;
  178.                 case 7:c++;break;
  179.                 case 8:d++;break;
  180.                 case 9:e++;break;
  181.                 case 10:f++;break;
  182.                 }
  183.               if(id<=4)
  184. //使时分调节时数值限制在合理范围
  185.               { if(a==3)                                                                     
  186.                  a=0;
  187.                  if(a==2)
  188.                             { if(b>4)
  189.                                b=0;              }
  190.                  if(b==10)
  191.                             b=0;
  192.                  if(c==6)
  193.                             c=0;
  194.                  if(d==10)
  195.                             d=0;
  196.                             shi=a*10+b;                                                                     
  197.                             fen=c*10+d; }
  198.         if(id>=5,id<11)
  199. //使年月日调节时数值限制在合理范围
  200.               { if(a==10)
  201.                  a=0;
  202.                 if(b==10)
  203.                  b=0;                                                                                   
  204.                 if(c==2)
  205.                  c=0;
  206.                 if(c*10+d>12)
  207.                  d=0;
  208.                 if(e==4)
  209.                  e=0;
  210.                 if(e*10+f>31)
  211.                  f=0;
  212.                 nian=a*10+b;
  213.                 yue=c*10+d;
  214.                 ri=e*10+f; }
  215.                 miao=0;
  216.                 while(s2==0);
  217. //等待放开数字加键
  218.                 yanshi(350);
  219.                 while(s2==0); }
  220.                             }
  221. }
  222. /************************************
  223.                                           按键3检测
  224.               按键检测,数字减键、秒表暂停键
  225. ************************************/
  226. void key3()
  227. { while(s3==0)
  228. { yanshi(300);//延时去抖
  229.    while(s3==0)
  230.   { if(id==11)
  231. //只允许在秒表模式下暂停
  232.    { TR1=0;//秒表暂停 }
  233.               switch(id)
  234.               { case 1:a--;break;                                                                       
  235.                 case 2:b--;break;                                                                                   
  236.                 case 3:c--;break;                                                                                   
  237.                 case 4:d--;break;
  238.                 case 5:a--;break;                                                                     
  239.                 case 6:b--;break;                                                                                   
  240.                 case 7:c--;break;                                                                                   
  241.                 case 8:d--;break;
  242.                 case 9:e--;break;
  243.                 case 10:f--;break; }
  244.               if(id<=4)
  245. //使时分调节时数值限制在合理范围
  246.               { if(a==-1)
  247.                 a=2;
  248.               if(a==2)
  249.               { if(b>=5)
  250.                 b=0; }                                         
  251.               if(b==-1)
  252.                 b=9;
  253.               if(c==-1)
  254.                 c=5;
  255.               if(d==-1)
  256.                 d=9;
  257.               shi=a*10+b;
  258.               fen=c*10+d; }
  259.               if(id>4,id<11)
  260. //使年月日调节时数值限制在合理范围
  261.    { if(a==-1)
  262.                 a=9;
  263.               if(b==-1)
  264.                 b=9;
  265.               if(c==-1)
  266.                 c=1;
  267.               if(d==-1)
  268.                 d=9;
  269.               if(c*10+d>12)
  270.                 d=0;
  271.               if(e==-1)
  272.                 e=3;
  273.               if(f==-1)
  274.                 f=9;
  275.               if(e*10+f>31)
  276.                 f=0;            
  277.               nian=a*10+b;
  278.               yue=c*10+d;
  279.               ri=e*10+f;              }                                                                                   
  280.               miao=0;
  281.               while(s3==0);
  282. //等待放开数字减键
  283.               yanshi(350);
  284.               while(s3==0); }
  285.               }
  286. }
  287. /************************************
  288.                             按键4检测--退出菜单
  289. 按键检测,按住S4不放时显示年月日
  290.           退出功能键
  291. ************************************/
  292. void key4()
  293. { while(s4==0)
  294. { yanshi(300);//延时去抖
  295.               while(s4==0)
  296.   { id=12;//退出菜单
  297.               TR1=0;//关闭定时器1
  298.               hm=0;//退出秒表时初始化秒表
  299.               mm=0;//退出秒表时初始化秒表
  300.               ff=0;//退出秒表时初始化秒表
  301.               shizhong();
  302. //显示年月时让时钟继续走
  303.               a=nian/10;
  304.               b=nian%10;
  305.               c=yue/10;
  306.               d=yue%10;
  307.               e=ri/10;
  308.               f=ri%10;
  309.               xianshi(); }
  310.               }
  311. }
  312. /************************************
  313.                                           年月日调节
  314. ************************************/
  315. void nyr()
  316. { while(id==5)
  317. //按下菜单键5次时进入年月日调节
  318. { while(id<11)
  319.   { key1();//调节位检测
  320.               key2();//数值加检测
  321.               key3();//数值减检测
  322.     a=nian/10;
  323.               b=nian%10;
  324.               c=yue/10;
  325.               d=yue%10;
  326.               e=ri/10;
  327.               f=ri%10;
  328.               xianshi();
  329.               miao=0;
  330.               key4();//退出检测 }
  331.               }
  332. }
  333. /************************************
  334.                                                         秒表
  335.                                           精确到1%秒
  336. ************************************/
  337. void miaobiao()
  338. { while(id==11)
  339. //按下菜单键11次时进入秒表
  340. { shizhong();
  341. //进入秒表功能时让时钟继续走
  342.   key2();//秒表开始检测
  343.   if(tt==10)
  344.   {              tt=0;
  345.               hm++; }
  346.   if(hm==100)
  347.   { mm++;
  348.               hm=0; }
  349.   if(mm==60)
  350.   { mm=0;
  351.               ff++; }
  352.    key3();//秒表暂停检测
  353.               a=ff/10;
  354.               b=ff%10;
  355.               c=mm/10;
  356.               d=mm%10;
  357.               e=hm/10;
  358.               f=hm%10;                           
  359.               xianshi();
  360.               key4();//退出秒表检测 }

  361. /***********************************
  362.                                           初始化程序
  363. ************************************/
  364. void init()
  365. { t=0;//定时器0中断次数初始化
  366.   tt=0;//定时器1中断次数初始化
  367.   id=0;//调整位初始化
  368.   hm=0;//秒表初始化
  369.   mm=0;//秒表初始化
  370.   miao=0;//秒初始化
  371.   fen=53;//分初始化
  372.   shi=12;//时初始化
  373.   ri=5;//日初始化
  374.   yue=5;//月初始化
  375.   nian=9;//年初始化
  376.   EA=1;//开总中断
  377.   ET0=1;//开定时器0中断
  378.   ET1=1;//开定时器1中断
  379.   TMOD=0x11;//设置定时器为工作方式1
  380.   TH0=(65536-49380)/256;
  381. //装初值,使定时器0每50毫秒产生一次中断
  382.   TL0=(65536-49380)%256;
  383. //装初值,使定时器0每50毫秒产生一次中断
  384.   TH1=(65536-1001)/256;
  385. //装初值,使定时器1每1毫秒产生一次中断
  386.   TL1=(65536-1001)%256;
  387. //装初值,使定时器1每1毫秒产生一次中断
  388.   TR0=1;//开启定时器0
  389.   TR1=1;//开启定时器1 }
  390. /************************************
  391.                                                         主程序
  392. ************************************/
  393. void main()
  394. { init();//初始化
  395.   while(1)
  396. { shizhong();//时钟主程序
  397.    key1();//按键1检测
  398.    if(id!=0)
  399. //没有按下功能键时按键1按键2无效
  400.    { key2();//按键2检测
  401.               key3();//按键3检测 }
  402.               key4();//按键4检测
  403.               nyr();//年月日调节
  404.               miaobiao();//秒表
  405.               if(id==12)//S1按键功能初始化
  406.               id=0;//S1按键功能初始化
  407.               a=shi/10;
  408. //当没有按键按下时,显示时分秒
  409.               b=shi%10;//当无按键按下时,显示时分秒
  410.               c=fen/10;//当无按键按下时,显示时分秒
  411.               d=fen%10;//当无按键按下时,显示时分秒
  412.               e=miao/10;//当无按键按下时,显示时分秒
  413.               f=miao%10;//当无按键按下时,显示时分秒
  414.               xianshi();//动态扫描程序 }
  415. }
复制代码


完整的Word格式文档51黑下载地址:
课程论文——基于多位LED数码管的数字钟设计.doc (267.24 KB, 下载次数: 29)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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