6.简易电子钟数码管动态扫描(使用定时器)有调时功能

2019-04-15 16:43发布

  1. /*
  2.  ***********************************************************************************************
  3.  * Cool51
  4.  * 51开发板例程
  5.  *
  6.  *
  7.  * 文件名称:“main.c”
  8.  * 摘 要:电子表
  9.  * 作 者:Rays_ele
  10.  *
  11.  * 当前版本:1.0
  12.  * 完成日期:2011/04/27
  13.  * 版权所有:Rays - Copyright (C) 2011
  14.  *
  15.  ***********************************************************************************************
  16.  */

  17. /*包含必要的头文件*/
  18. #include<reg52.h>//开发51单片机必须包含51单片机的头文件,该文件定义了51单片机内部寄存器的地址
  19. /*常用宏定义*/
  20. #define uchar unsigned char
  21. #define uint unsigned int
  22. /*程序接口定义*/
  23. //数码管的段码在原理图上已经和P0口相接,即P0.0对应数码管的a段,P0.1对于b段,依此类推,简单表示如下
  24. #define LED P0
  25. //LED_a-------P0.0
  26. //LED_b-------P0.1
  27. //LED_c-------P0.2
  28. //LED_d-------P0.3
  29. //LED_e-------P0.4
  30. //LED_f-------P0.5
  31. //LED_g-------P0.6
  32. //LED_s-------P0.7
  33. //下面是数码管的位定义,也就是数码管的公共端,具体电路讲解见Cool51原理图,该引脚为低电平即选通该位数码管
  34. sbit LED_1=P2^0;//LED_1-------P2.0
  35. sbit LED_2=P2^1;//LED_2-------P2.1
  36. sbit LED_3=P2^2;//LED_3-------P2.2
  37. sbit LED_4=P2^3;//LED_4-------P2.3
  38. //定义一个key 用来切换显示状态
  39. sbit key=P2^7;
  40. //定义两个,一个调节小时,一个调节分钟
  41. sbit Hour_adjust=P2^5;
  42. sbit Minute_adjust=P2^4;
  43. /*全局变量定义部分*/
  44. unsigned char code LED_Code[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF};//共阳码
  45. // 0 1 2 3 4 5 6 7 8 9 灭 -
  46. unsigned char Hour,Minute,Second,Clock_Dot; //分别定义小时,,,闪点
  47. uchar status=0; //定义一个变量代表状态,为0则显示分和秒,为1则显示时和分
  48. /*
  49. +---------------------------------------------------------------------------------------+
  50. |函数名称: Delay_ms |
  51. |---------------------------------------------------------------------------------------|
  52. |函数原型: void Delay_ms(uint ms) |
  53. |函数功能: 普通延时函数 |
  54. |入口参数: 延时时间,单位毫秒 |
  55. +---------------------------------------------------------------------------------------+
  56. */
  57. void Delay_ms(uint ms)
  58. {
  59.    uchar t;
  60.    while(ms--)
  61.    {
  62.    t=120;
  63.    while(t--);
  64.    }
  65. }
  66. /*
  67. +---------------------------------------------------------------------------------------+
  68. |函数名称: ShuMaGuan |
  69. |---------------------------------------------------------------------------------------|
  70. |函数原型: void ShuMaGuan(uint dat) |
  71. |函数功能: 数码管扫描显示程序,随意显示一个9999以内数据大小 |
  72. |入口参数: 要显示的0000-9999之间的数据,数据是多少,就显示多少 |
  73. +---------------------------------------------------------------------------------------+
  74. */
  75. void ShuMaGuan(uchar h,uchar l,uchar dot)
  76. {
  77.    LED=LED_Code[h/10];//将dat的千位取出来,用千位数来索引LED_Code的对应段码,再将段码送到对应段码口上
  78.    LED_1=0;     //段码送出去后,再选通千位数码管的公共端,此时对应千位数码管会显示
  79.    Delay_ms(3);             //将显示延时一段时间,视觉暂留
  80.    LED_1=1;
  81.    LED=LED_Code[h%10];
  82.    if(dot)            //如果dot为真,则表的中间两个点显示,假则不显示
  83.    LED&=0x7f;
  84.    LED_2=0;
  85.    Delay_ms(3);
  86.    LED_2=1;
  87.    LED=LED_Code[l/10];
  88.    LED_3=0;
  89.    Delay_ms(3);
  90.    LED_3=1;
  91.    LED=LED_Code[l%10];
  92.    LED_4=0;
  93.    Delay_ms(3);
  94.    LED_4=1;
  95. }

  96. /*
  97. +---------------------------------------------------------------------------------------+
  98. |函数名称: main |
  99. |---------------------------------------------------------------------------------------|
  100. |函数原型: void main(void) |
  101. |函数功能: 数码管扫描显示程序,随意显示一个9999以内数据大小 |
  102. |入口参数:|
  103. +---------------------------------------------------------------------------------------+
  104. */
  105. void main(void)
  106. {
  107.     EA = 1;                //允许CPU中断
  108.     ET0 = 1;             //定时器0中断打开
  109.     TMOD = 0x1;            //设定时器0为模式1,16位模式
  110.     TH0=0x4c;
  111.     TL0=0x00; //11.0592 溢出时间50000us=50ms
  112.     TR0 = 1; //启动定时器
  113.     Clock_Dot=0;        //时钟刚开始秒点不亮
  114.     status=1; //默认显示分和秒
  115.     /**/

  116.    while(1)
  117.    {
  118.    if(status==1)
  119.    ShuMaGuan(Minute,Second,Clock_Dot);
  120.    if(status==0)
  121.    ShuMaGuan(Hour,Minute,0);
  122.     //扫描一个按键程序,按键用来切换显示状态
  123.     if(key==0) //如果有按键按下
  124.      {
  125.      while(key==0);
  126.      status=!status;
  127.      }
  128.     //调时程序
  129.      if(Hour_adjust==0)
  130.      {
  131.          if(Hour++==23)
  132.          Hour=0;
  133.          while(Hour_adjust==0);
  134.         }
  135.      if(Minute_adjust==0)
  136.      {
  137.          if(Minute++==59)
  138.          Minute=0;
  139.          while(Minute_adjust==0);
  140.         }    
  141.    }
  142. }
  143. //定时器0中断外理中调用数码管显示程序
  144. /*
  145. +---------------------------------------------------------------------------------------+
  146. |函数名称