找回密码
 立即注册

QQ登录

只需一步,快速开始

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

数码管+单片机定时器,做了个时钟,在设置时间的时候,怎样让分钟闪烁?

[复制链接]
ID:161933 发表于 2017-5-27 20:59 | 显示全部楼层 |阅读模式
用数码管+定时器,做了个时钟,在设置时间的时候,怎样让 分钟 小时 实现闪烁的效果?,现在也能设置时间,就是没有闪烁 的效果,不知道 调整到哪一位了。请教,大家有什么好办法。感谢。


IMG_20170527_155035.jpg





  1. /*******************************************************************************
  2. * 实 验 名                 : 动态数码管显示时钟
  3. * 使用的IO             : 数码管使用:段数据:P0,位选:P2.2,P2.3,P2.4
  4. * 实验效果       : 数码管显示76543210。
  5. * 注    意                 :
  6. *******************************************************************************/
  7. #include<regA51.h>
  8. #define GPIO_DIG P0                        //数码段数据
  9. sbit LSA=P2^2;                                        //位选控制口
  10. sbit LSB=P2^3;
  11. sbit LSC=P2^4;
  12. sbit K1=P3^0;                                                //选择调时位
  13. sbit K2=P3^1;                                                //+1
  14. sbit K3=P3^2;                                                //K3暂停,进入调时状态

  15. unsigned int Time;                        //用来计时间的值
  16. unsigned char SetPlace;                //设置修改位
  17. unsigned char hour=10,minute=59,second=55;

  18. unsigned char code DIG_CODE[17]={
  19. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  20. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  21. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码

  22. void Delay1ms(unsigned int c)   //误差 0us
  23. {
  24.     unsigned char a,b;
  25.         for (; c>0; c--)
  26.         {
  27.                 for(b=199;b>0;b--)
  28.                 {
  29.                         for(a=1;a>0;a--);
  30.                 }
  31.         }
  32. }

  33. /*******************************************************************************
  34. * 函 数 名         : TimerConfiguration()
  35. * 函数功能                   : 配置定时器值
  36. * 输    入         : 无
  37. * 输    出         : 无
  38. *******************************************************************************/                  

  39. void TimerConfiguration()
  40. {
  41.     TMOD = 0x02;         //选择工作方式2,自动赋初值
  42.     TH0 = 0x06;                 //设置初始值 250 us
  43.     TL0 = 0x06;
  44.     EA = 1;                         //打开总中断
  45.     ET0 = 1;                 //打开定时器0中断
  46.     TR0 = 1;                 //启动定时器0
  47. }
  48. /*******************************************************************************
  49. * 函 数 名         : Timer0()
  50. * 函数功能                   : 定时器0中断函数
  51. * 输    入         : 无
  52. * 输    出         : 无
  53. *******************************************************************************/                  

  54. void Timer0() interrupt 1
  55. {
  56.                 Time++;
  57. }
  58. /*******************************************************************************
  59. * 函 数 名         : Int0Configuration()
  60. * 函数功能                   : 配置外部中断0
  61. * 输    入         : 无
  62. * 输    出         : 无
  63. *******************************************************************************/                  

  64. void Int0Configuration()
  65. {
  66.         //设置INT0
  67.         IT0=1;//跳变沿出发方式(下降沿)
  68.         EX0=1;//打开INT0的中断允许。
  69.         EA=1;//打开总中断        
  70. }
  71. /*******************************************************************************
  72. * 函 数 名         : Int0() interrupt 0
  73. * 函数功能                   : 外部中断0的中断函数
  74. * 输    入         : 无
  75. * 输    出         : 无
  76. *******************************************************************************/                  

  77. void Int0() interrupt 0                 
  78. {        if(K3==0)
  79.         Delay1ms(10);
  80.         if(K3==0)
  81.         {
  82.                 TR0=~TR0;
  83.                 SetPlace=1;
  84.         }
  85. }

  86. void DigDisplay()
  87. {
  88.         unsigned char i;
  89.         unsigned int j;
  90.         for(i=0;i<8;i++)
  91.         {
  92.                 switch(i)         //位选,选择点亮的数码管,
  93.                 {
  94.                         case(0):
  95.                                 {LSA=0;LSB=0;LSC=0;
  96.                                  GPIO_DIG=DIG_CODE[second%10];
  97.                                  j=10;                                                 //扫描间隔时间设定
  98.                                  while(j--);        
  99.                                  GPIO_DIG=0x00;//消隐
  100.                                 } break;//显示第0位
  101.                         case(1):
  102.                                 {LSA=1;LSB=0;LSC=0;
  103.                                  GPIO_DIG=DIG_CODE[second/10];
  104.                                  j=10;                                                 //扫描间隔时间设定
  105.                                  while(j--);        
  106.                                  GPIO_DIG=0x00;//消隐
  107.                                 } break;//显示第1位
  108.                         case(2):
  109.                                 {LSA=0;LSB=1;LSC=0;
  110.                                  GPIO_DIG=0X40;
  111.                                 j=10;                                                 //扫描间隔时间设定
  112.                                 while(j--);        
  113.                                 GPIO_DIG=0x00;//消隐
  114.                                 }break;//显示第2位
  115.                         case(3):
  116.                                 {LSA=1;LSB=1;LSC=0;
  117.                                   GPIO_DIG=DIG_CODE[minute%10];
  118.                                  j=10;                                                 //扫描间隔时间设定
  119.                                  while(j--);        
  120.                                  GPIO_DIG=0x00;//消隐
  121.         }break;//显示第3位
  122.                         case(4):
  123.                                 {LSA=0;LSB=0;LSC=1;
  124.                                   GPIO_DIG=DIG_CODE[minute/10];
  125.                                  j=10;                                                 //扫描间隔时间设定
  126.                                  while(j--);        
  127.                                  GPIO_DIG=0x00;//消隐
  128.                                 }break;//显示第4位
  129.                         case(5):
  130.                                 {LSA=1;LSB=0;LSC=1;
  131.                                   GPIO_DIG=0X40;
  132.                                  j=10;                                                 //扫描间隔时间设定
  133.                                  while(j--);        
  134.                                  GPIO_DIG=0x00;//消隐
  135.                                 }break;//显示第5位
  136.                         case(6):
  137.                                 {LSA=0;LSB=1;LSC=1;
  138.                                   GPIO_DIG=DIG_CODE[hour%10];
  139.                                  j=10;                                                 //扫描间隔时间设定
  140.                                  while(j--);        
  141.                                  GPIO_DIG=0x00;//消隐
  142.                                 }break;//显示第5位
  143.                         case(7):
  144.                                 {LSA=1;LSB=1;LSC=1;
  145.                                   GPIO_DIG=DIG_CODE[hour/10];
  146.                                  j=10;                                                 //扫描间隔时间设定
  147.                                  while(j--);        
  148.                                  GPIO_DIG=0x00;//消隐
  149.                                 }break;//显示第5位
  150.                 }
  151.         }
  152. }

  153. void main(void)
  154. {
  155.         unsigned char i;
  156.         TimerConfiguration();
  157.         Int0Configuration();
  158.         while(1)
  159.         {        /*计时函数*/
  160.                 if(Time>=3997)                                         //一秒钟,改变数值
  161.                 {
  162.                         Time=0;
  163.                         second++;
  164.                         if(second==60)
  165.                         {
  166.                                 second=0;
  167.                                 minute++;
  168.                                 if(minute==60)
  169.                                 {
  170.                                         minute=0;
  171.                                         hour++;
  172.                                         if(hour==24)
  173.                                         {
  174.                                                 hour=0;        
  175.                                         }
  176.                                 }                                
  177.                         }                                       
  178.                 }        
  179.             //--显示时钟--//
  180.                 DigDisplay();

  181.                 if(TR0==0)
  182.                 {        if(K1==0)                        //检测按键K1是否按下
  183.                         {
  184.                                 Delay1ms(10);        //消除抖动
  185.                                 if(K1==0)
  186.                                 {  
  187.                                         SetPlace++;
  188.                                         Delay1ms(100);
  189.                                         if(SetPlace>=3)
  190.                                                 SetPlace=0;                                       
  191.                                 }
  192.                                 while((i<50)&&(K1==0))         //检测按键K1是否松开
  193.                                 {
  194.                                         Delay1ms(1);
  195.                                         i++;
  196.                                 }
  197.                                 i=0;                        
  198.                         }
  199.                         switch(SetPlace)
  200.                                 {case 0 :
  201.                                         {
  202.                                          if(K2==0)                //检测按键K2是否按下
  203.                                                 {
  204.                                                 Delay1ms(10);        //消除抖动
  205.                                                 if(K2==0)
  206.                                                         {
  207.                                                         second++;
  208.                                                         Delay1ms(100);
  209.                                                         if(second>=60)
  210.                                                         second=0;
  211.                                                         }
  212.                                                 }
  213.                                                 DigDisplay();
  214.                                          }break;
  215.                                 case 1 :
  216.                                         {
  217.                                          if(K2==0)                //检测按键K2是否按下
  218.                                                 {
  219.                                                 Delay1ms(10);        //消除抖动
  220.                                                 if(K2==0)
  221.                                                         {
  222.                                                         minute++;
  223.                                                         Delay1ms(100);
  224.                                                         if(minute>=60)
  225.                                                         minute=0;
  226.                                                         }
  227.                                                 }
  228.                                         DigDisplay();
  229.                                         }break;
  230.                                 case 2 :
  231.                                         {
  232.                                          if(K2==0)                //检测按键K2是否按下
  233.                                                 {                                                                                                                                                                                                        
  234.                                                 Delay1ms(10);        //消除抖动
  235.                                                 if(K2==0)
  236.                                                         {
  237.                                                         hour++;
  238.                                                         Delay1ms(100);
  239.                                                         if(hour>=24)
  240.                                                         hour=0;
  241.                                                         }
  242.                                                 }
  243.                                                 DigDisplay();
  244.                                          }break;
  245.                                 }
  246.                 }
  247.         }
  248. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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