找回密码
 立即注册

QQ登录

只需一步,快速开始

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

蓝桥杯单片机定时器进阶-数字钟PROTEUS仿真程序

[复制链接]
跳转到指定楼层
楼主
■在蓝桥杯单片机综合训练平台上,利用定时器T0、数码管模块和2个独立按键(J5的2-3短接),设计一个秒表,具有清零、暂停、启动功能。
1.显示格式为:分-秒.0.05秒(即50ms)08-26-18表示: 8分26秒900毫秒
2.独立按键S4为:暂停/启动
独立按键S5为:清零
按键均为按下有效。

已完成仿真与调试。

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


单片机源程序如下:
  1. #include "reg52.h"  

  2. sbit HC138_A = P2^5;        
  3. sbit HC138_B = P2^6;        
  4. sbit HC138_C = P2^7;        

  5.       
  6. sbit S5 = P3^2;        
  7. sbit S4 = P3^3;        


  8. //共阳4位数码管的段码数组
  9. unsigned char code SMG_NoDot[18] =
  10.     {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
  11.      0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
  12.      0xbf,0x7f};

  13.                  

  14. char minute=0;
  15. char second=0;        
  16. char ms=0;                 
  17. void DisplaySMG_Dynamic();     
  18. void Delay(unsigned int time);         

  19. void DelaySMG(unsigned int time)
  20. {
  21.     while(time--);
  22. }

  23. void Delay(unsigned int time)
  24. {
  25.     while(time--);
  26. }

  27. void Init74HC138(unsigned char n)
  28. {
  29.     switch(n)
  30.     {
  31.         case 4:
  32.             HC138_A = 0;
  33.             HC138_B = 0;
  34.             HC138_C = 1;
  35.             break;
  36.         case 5:
  37.             HC138_A = 1;
  38.             HC138_B = 0;
  39.             HC138_C = 1;
  40.             break;
  41.         case 6:
  42.             HC138_A = 0;
  43.             HC138_B = 1;
  44.             HC138_C = 1;
  45.             break;
  46.         case 7:
  47.             HC138_A = 1;
  48.             HC138_B = 1;
  49.             HC138_C = 1;
  50.             break;
  51.         case 8:
  52.             HC138_A = 0;
  53.             HC138_B = 0;
  54.             HC138_C = 0;
  55.             break;
  56.     }
  57. }

  58. void DispaySMG_Bit(unsigned char value, unsigned char pos)
  59. {
  60.           Init74HC138(7);
  61.     P0 = 0xff;
  62.     Init74HC138(6);
  63.     P0 = (0x01 << pos);
  64.     Init74HC138(7);
  65.     P0 = value;
  66. }

  67. void DisplaySMG_Dynamic()
  68. {
  69.     DispaySMG_Bit(SMG_NoDot[minute/10],0);
  70.     DelaySMG(30);
  71.     DispaySMG_Bit(SMG_NoDot[minute%10],1);
  72.     DelaySMG(30);
  73.     DispaySMG_Bit(SMG_NoDot[16],2);
  74.     DelaySMG(30);
  75.     DispaySMG_Bit(SMG_NoDot[second/10],3);
  76.     DelaySMG(30);
  77.     DispaySMG_Bit(SMG_NoDot[second%10],4);
  78.     DelaySMG(30);
  79.     DispaySMG_Bit(SMG_NoDot[16],5);
  80.     DelaySMG(30);
  81.    
  82.     DispaySMG_Bit(SMG_NoDot[ms/10],6);
  83.     DelaySMG(30);
  84.     DispaySMG_Bit(SMG_NoDot[ms%10],7);
  85.     DelaySMG(30);
  86. }
  87. void InitTimer0()
  88. {
  89.         TMOD = 0X01;
  90.         TH0=(65535-50000)/256;
  91.         TL0=(65535-50000)%256;

  92.         ET0=1;
  93.         EA=1;
  94.         TR0=1;           
  95. }


  96. void ServiceTimer0() interrupt 1
  97. {
  98.     TH0=(65535-50000)/256;
  99.           TL0=(65535-50000)%256;
  100.           ms++;
  101.          if(ms ==20)
  102.          {
  103.                  second++;
  104.                  ms=0;
  105.              if(second==60)
  106.                  {
  107.                    minute++;
  108.                    second=0;
  109.                  }
  110.                  if(minute==60)
  111.                  {
  112.                    minute=0;
  113.                  }
  114.          
  115.          }
  116.          
  117. }

  118. void ScanKeys()
  119. {
  120.       
  121.         if(S5 == 0)
  122.         {
  123.                 Delay(100);
  124.                 if(S5 == 0)
  125.                 {
  126.                   minute=0;
  127.                                                 second=0;
  128.                                                 ms=0;
  129.                        while(S5 ==0)
  130.                                            {
  131.                                                      DisplaySMG_Dynamic();
  132.                                            }
  133.                 }
  134.         }
  135.         if(S4 == 0)
  136.         {
  137.                 Delay(100);
  138.                 if(S4 == 0)
  139.                 {
  140.                        TR0=~TR0;
  141.                                            while(S4 ==0)
  142.                                            {
  143.                                                      DisplaySMG_Dynamic();
  144.                                            }
  145.                         
  146.                 }
  147.         }
  148. }
  149.                           
  150. main()
  151. {
  152.           InitTimer0();
  153.     while(1)
  154.     {
  155.         DisplaySMG_Dynamic();
  156.        ScanKeys();
  157.     }
  158. }
复制代码

Keil代码与Proteus7.5版本的仿真dsn文件下载(其他版本打开会出错):
11 定时器进阶-数字钟(更新后).7z (320.89 KB, 下载次数: 13)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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