• 51单片机基础(C语言):定时器时钟


     1.使用定时器 1 和LCD1602设计一个简易数字时钟。

    main.c

    1. #include
    2. #include "Delay.h"
    3. #include "LCD1602.h"
    4. #include "Timer0.h"
    5. unsigned char Sec=55,Min=59,Hour=23;
    6. void main()
    7. {
    8. LCD_Init();
    9. Timer0Init();
    10. LCD_ShowString(1,1,"Clock:"); //上电显示静态字符串
    11. LCD_ShowString(2,1," : :");
    12. while(1)
    13. {
    14. LCD_ShowNum(2,1,Hour,2); //显示时分秒
    15. LCD_ShowNum(2,4,Min,2);
    16. LCD_ShowNum(2,7,Sec,2);
    17. }
    18. }
    19. void Timer0_Routine() interrupt 1
    20. {
    21. static unsigned int T0Count;
    22. TL0 = 0x18; //设置定时初值
    23. TH0 = 0xFC; //设置定时初值
    24. T0Count++;
    25. if(T0Count>=1000) //定时器分频,1s
    26. {
    27. T0Count=0;
    28. Sec++; //1秒到,Sec自增
    29. if(Sec>=60)
    30. {
    31. Sec=0; //60秒到,Sec清0,Min自增
    32. Min++;
    33. if(Min>=60)
    34. {
    35. Min=0; //60分钟到,Min清0,Hour自增
    36. Hour++;
    37. if(Hour>=24)
    38. {
    39. Hour=0; //24小时到,Hour清0
    40. }
    41. }
    42. }
    43. }
    44. }

    Timer0.c

    1. #include
    2. /**
    3. * @brief 定时器0初始化,1毫秒@12.000MHz
    4. * @param 无
    5. * @retval 无
    6. */
    7. void Timer0Init(void)
    8. {
    9. TMOD &= 0xF0; //设置定时器模式
    10. TMOD |= 0x01; //设置定时器模式
    11. TL0 = 0x18; //设置定时初值
    12. TH0 = 0xFC; //设置定时初值
    13. TF0 = 0; //清除TF0标志
    14. TR0 = 1; //定时器0开始计时
    15. ET0=1;
    16. EA=1;
    17. PT0=0;
    18. }
    19. /*定时器中断函数模板
    20. void Timer0_Routine() interrupt 1
    21. {
    22. static unsigned int T0Count;
    23. TL0 = 0x18; //设置定时初值
    24. TH0 = 0xFC; //设置定时初值
    25. T0Count++;
    26. if(T0Count>=1000)
    27. {
    28. T0Count=0;
    29. }
    30. }
    31. */

    Timer0.h

    1. #ifndef __TIMER0_H__
    2. #define __TIMER0_H__
    3. void Timer0Init(void);
    4. #endif

    2. 使用定时器 0 和数码管设计一个数字时钟。

    1.动态数码管显示,点亮一瞬间,显示00—00—00

    2.定时器中断,每隔一秒秒钟加一,过六十,分钟加一,到达24:00:00,变为00:00:00

    比如 00—00—01    00—01—00

    3.完成以上两个任务,就完成了与第一个题一样的效果了,

    现在加入第三个模块,独立按键模块,我们规定如下:

    1.独立按键一:按下按键,暂停,再按下,启动,(刚开始是暂停的)

    2.独立按键二:暂停情况,修改时钟个位,个位加一,个位加到10,十位进一,加到24,变为0;

    3.独立按键三:暂停情况,修改分钟个位,个位加一,个位加到10,十位进一,加到60,都变0;

    4.独立按键四:暂停情况,修改秒钟个位,个位加一,个位加到10,十位进一,加到60,变为0;

    下面为现象:

    定时器时钟仿真

    代码如下:模块化编程,一共用了4个模块,在我模块化编程大全里面有,直接调用即可,分别是

    延迟模块,独立按键模块,定时器中断模块,动态数码管模块。

    这里我们写main.c的代码:

    1. #include
    2. #include "Nixie.h"
    3. #include "Timer0.h"
    4. #include "Key.h"
    5. #define uint unsigned int
    6. #define uchar unsigned char
    7. uchar keynumber,Mode;
    8. uint hour_ge=0,hour_shi=0,minute_ge=0, minute_shi=0,second_ge,second_shi;//6个数码管刚好对应每一位
    9. void main()
    10. {
    11. Timer0Init();
    12. while(1)
    13. {
    14. keynumber= Key();
    15. if(keynumber)
    16. {
    17. if(keynumber==1)
    18. {
    19. Mode++;
    20. if(Mode>=2)
    21. {
    22. Mode=0;
    23. }
    24. }
    25. if(keynumber==2)
    26. {
    27. if(Mode==0)
    28. {
    29. hour_ge++;
    30. if(hour_ge>=10)
    31. {
    32. hour_ge=0;
    33. hour_shi++;
    34. }
    35. if(hour_shi==2&&hour_ge==4)
    36. {
    37. hour_shi=0;
    38. hour_ge=0;
    39. }
    40. }
    41. }
    42. if(keynumber==3)
    43. {
    44. if(Mode==0)
    45. {
    46. minute_ge++;
    47. if(minute_ge>=10)
    48. {
    49. minute_ge=0;
    50. minute_shi++;
    51. }
    52. if(minute_shi==6&&minute_ge==0)
    53. {
    54. minute_shi=0;
    55. minute_ge=0;
    56. }
    57. }
    58. }
    59. if(keynumber==4)
    60. {
    61. if(Mode==0)
    62. {
    63. second_ge++;
    64. if(second_ge>=10)
    65. {
    66. second_ge=0;
    67. second_shi++;
    68. }
    69. if(second_shi==6&&second_ge==0)
    70. {
    71. second_shi=0;
    72. second_ge=0;
    73. }
    74. }
    75. }
    76. }
    77. Nixie(1,hour_shi);
    78. Nixie(2,hour_ge);
    79. Nixie(3,10);
    80. Nixie(4,minute_shi);
    81. Nixie(5,minute_ge);
    82. Nixie(6,10);
    83. Nixie(7,second_shi);
    84. Nixie(8,second_ge);
    85. }
    86. }
    87. void Timer0_Routine() interrupt 1
    88. {
    89. static unsigned int T0Count;
    90. TL0 = 0x18; //设置定时初值
    91. TH0 = 0xFC; //设置定时初值
    92. T0Count++;
    93. if(T0Count>=100) //定时器分频,1s
    94. {
    95. T0Count=0;
    96. if(Mode==1)
    97. {
    98. second_ge++; //1秒到,second_ge自增
    99. if(second_ge>=10)
    100. {
    101. second_ge=0; //10秒到,second_ge清0,second_shi自增
    102. second_shi++;;
    103. if(second_shi==6)
    104. {
    105. second_shi=0; //60秒钟到,second_shi清0,minute_ge自增
    106. minute_ge++;
    107. if(minute_ge==10)
    108. {
    109. minute_ge=0;
    110. minute_shi++;
    111. if(minute_shi==6)
    112. {
    113. minute_shi=0;
    114. hour_ge++;
    115. if(hour_ge==10)
    116. {
    117. hour_ge=0;
    118. hour_shi++;
    119. }
    120. if(hour_shi==2&&hour_ge==4)
    121. {
    122. hour_shi=0;
    123. hour_ge=0;
    124. }
    125. }
    126. }
    127. }
    128. }
    129. }
    130. }
    131. }

  • 相关阅读:
    HashMap总结
    Hyperledger Fabric 使用 CouchDB 和复杂智能合约开发
    数据结构--快速排序
    《最新出炉》系列初窥篇-Python+Playwright自动化测试-21-处理鼠标拖拽-番外篇
    过去5年,PolarDB云原生数据库是如何进行性能优化的?
    python requests 配置重试次数
    XSCTF联合招新【真是阳间题】(MSIC+Crypto)
    docker镜像导出保存为tar和tar包导入成docker镜像
    记录一次Bitbucket鉴权的坑
    2024三掌柜赠书活动第十三期:API安全技术与实战
  • 原文地址:https://blog.csdn.net/weixin_64484421/article/details/136059898