微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第89节:用单片机内部定时器做一个时钟

第89节:用单片机内部定时器做一个时钟

时间:11-22 来源:互联网 点击:

  1. gned char ucWd1Part3Update=0; //在窗口1中,局部3的更新显示标志
  2. unsigned char ucWd2Part1Update=0;//在窗口2中,局部1的更新显示标志
  3. unsigned char ucWd2Part2Update=0; //在窗口2中,局部2的更新显示标志
  4. unsigned char ucWd2Part3Update=0; //在窗口2中,局部3的更新显示标志
  5. unsigned charucYear=15; //用来显示和设置的时间变量
  6. unsigned charucMonth=1;
  7. unsigned charucDate=1;
  8. unsigned charucHour=12;
  9. unsigned charucMinute=0;
  10. unsigned charucSecond=0;
  11. unsigned int uiTimerCnt=0; //计时器的时基
  12. unsigned charucTimerYear=15; //在定时器内部时基产生的时间变量
  13. unsigned charucTimerMonth=1;
  14. unsigned charucTimerDate=1;
  15. unsigned charucTimerHour=12;
  16. unsigned charucTimerMinute=0;
  17. unsigned charucTimerSecond=0;
  18. unsigned charucTimerDateMax=31; //当前月份的最大天数
  19. unsigned charucTimerUpdate=0; //定时器每1秒钟所产生的标志
  20. unsigned charucTimerStart=1;//是否打开定时器内部时间的标志,在本程序相当于原子锁的作用。
  21. unsigned char ucTemp1=0;//中间过渡变量
  22. unsigned char ucTemp2=0;//中间过渡变量
  23. unsigned char ucTemp4=0;//中间过渡变量
  24. unsigned char ucTemp5=0;//中间过渡变量
  25. unsigned char ucTemp7=0;//中间过渡变量
  26. unsigned char ucTemp8=0;//中间过渡变量
  27. unsigned char ucDelayTimerLock=0; //原子锁
  28. unsigned intuiDelayTimer=0;
  29. unsigned char ucDpyTimeLock=0; //原子锁
  30. unsigned intuiDpyTimeCnt=0;//数码管的闪烁计时器,放在定时中断里不断累加
  31. //根据原理图得出的共阴数码管字模表
  32. code unsigned char dig_table[]=
  33. {
  34. 0x3f,//0 序号0
  35. 0x06,//1 序号1
  36. 0x5b,//2 序号2
  37. 0x4f,//3 序号3
  38. 0x66,//4 序号4
  39. 0x6d,//5 序号5
  40. 0x7d,//6 序号6
  41. 0x07,//7 序号7
  42. 0x7f,//8 序号8
  43. 0x6f,//9 序号9
  44. 0x00,//无 序号10
  45. 0x40,//- 序号11
  46. 0x73,//P 序号12
  47. };
  48. void main()
  49. {
  50. initial_myself();
  51. delay_long(100);
  52. initial_peripheral();
  53. while(1)
  54. {
  55. key_service(); //按键服务的应用程序
  56. timer_sampling(); //定时器采样程序,内部每秒钟采集更新一次
  57. display_service(); //显示的窗口菜单服务程序
  58. }
  59. }
  60. /* 注释二:
  61. * 系统不用时时刻刻采集定时器的内部数据,每隔1秒钟的时间更新采集一次就可以了。
  62. * 这个1秒钟的时间是根据定时器内部ucTimerUpdate变量来判断。
  63. */
  64. void timer_sampling(void) //采样定时器的程序,内部每秒钟采集更新一次
  65. {
  66. if(ucPart==0)//当系统不是处于设置日期和时间的情况下
  67. {
  68. if(ucTimerUpdate==1)//每隔1秒钟时间就更新采集一次定时器的时间数据
  69. {
  70. ucTimerUpdate=0;//及时清零,避免一直更新。
  71. ucYear=ucTimerYear; //读取定时器内部的年
  72. ucMonth=ucTimerMonth; //读取定时器内部的月
  73. ucDate=ucTimerDate;//读取定时器内部的日
  74. ucHour=ucTimerHour; //读取定时器内部的时
  75. ucMinute=ucTimerMinute;//读取定时器内部的分
  76. ucSecond=ucTimerSecond;//读取定时器内部的秒
  77. ucWd2Update=1; //窗口2更新显示时间
  78. }
  79. }
  80. }
  81. /* 注释三:
  82. * 根据年份和月份来获取当前这个月的最大天数。每个月份的天数最大取值不同,有的最大28日,
  83. * 有的最大29日,有的最大30,有的最大31。
  84. */
  85. unsigned char get_date(unsigned char ucYearTemp,unsigned char ucMonthTemp)
  86. {
  87. unsigned char ucDayResult;
  88. unsigned int uiYearTemp;
  89. unsigned int uiYearYu;
  90. ucDayResult=31; //默认最大是31天,以下根据不同的年份和月份来决定是否需要修正这个值
  91. switch(ucMonthTemp)//根据不同的月份来获取当前月份天数的最大值
  92. {
  93. case 2://二月份要计算是否是闰年
  94. uiYearTemp=2000+ucYearTemp;
  95. uiYearYu=uiYearTemp%4;
  96. if(uiYearYu==0) //闰年
  97. {
  98. ucDayResult=29;
  99. }
  100. else
  101. {
  102. ucDayResult=28;
  103. }
  104. break;
  105. case 4:
  106. case 6:
  107. case 9:
  108. case 11:
  109. ucDayResult=30;
  110. break;
  111. }
  112. return ucDayResult;
  113. }
  114. //日调整 每个月份的日最大取值不同,有的最大28日,有的最大29日,有的最大30,有的最大31
  115. unsigned char date_adjust(unsigned char ucYearTemp,unsigned char ucMonthTemp,unsigned char ucDateTemp) //日调整
  116. {
  117. unsigned char ucDayResult;
  118. unsigned int uiYearTemp;
  119. unsigned int uiYearYu;
  120. ucDayResult=ucDateTemp;
  121. switch(ucMonthTemp)//根据不同的月份来修正不同的日最大值
  122. {
  123. case 2://二月份要计算是否是闰年
  124. uiYearTemp=2000+ucY

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top