微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第48节:利用DS1302做一个实时时钟

第48节:利用DS1302做一个实时时钟

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

  1. //临时中间变量
  2. unsigned char ucDisplayDriveStep=1;//动态扫描数码管的步骤变量
  3. unsigned char ucWd=2;//本程序的核心变量,窗口显示变量。类似于一级菜单的变量。代表显示不同的窗口。
  4. unsigned char ucPart=0;//本程序的核心变量,局部显示变量。类似于二级菜单的变量。代表显示不同的局部。
  5. unsigned char ucWd1Update=0; //窗口1更新显示标志
  6. unsigned char ucWd2Update=1; //窗口2更新显示标志
  7. unsigned char ucWd1Part1Update=0;//在窗口1中,局部1的更新显示标志
  8. unsigned char ucWd1Part2Update=0; //在窗口1中,局部2的更新显示标志
  9. unsigned char ucWd1Part3Update=0; //在窗口1中,局部3的更新显示标志
  10. unsigned char ucWd2Part1Update=0;//在窗口2中,局部1的更新显示标志
  11. unsigned char ucWd2Part2Update=0; //在窗口2中,局部2的更新显示标志
  12. unsigned char ucWd2Part3Update=0; //在窗口2中,局部3的更新显示标志
  13. unsigned charucYear=0; //原始数据
  14. unsigned charucMonth=0;
  15. unsigned charucDate=0;
  16. unsigned charucHour=0;
  17. unsigned charucMinute=0;
  18. unsigned charucSecond=0;
  19. unsigned charucYearBCD=0; //BCD码的数据
  20. unsigned charucMonthBCD=0;
  21. unsigned charucDateBCD=0;
  22. unsigned charucHourBCD=0;
  23. unsigned charucMinuteBCD=0;
  24. unsigned charucSecondBCD=0;
  25. unsigned char ucTemp1=0;//中间过渡变量
  26. unsigned char ucTemp2=0;//中间过渡变量
  27. unsigned char ucTemp4=0;//中间过渡变量
  28. unsigned char ucTemp5=0;//中间过渡变量
  29. unsigned char ucTemp7=0;//中间过渡变量
  30. unsigned char ucTemp8=0;//中间过渡变量
  31. unsigned char ucDelayTimerLock=0; //原子锁
  32. unsigned intuiDelayTimer=0;
  33. unsigned char ucCheckDs1302=0;//检查Ds1302芯片是否正常
  34. unsigned char ucDs1302Error=0; //Ds1302芯片的备用电池是否用完了的报警标志
  35. unsigned char ucDs1302Lock=0;//原子锁
  36. unsigned intuiDs1302Cnt=0; //间歇性蜂鸣器报警的计时器
  37. unsigned char ucDpyTimeLock=0; //原子锁
  38. unsigned intuiDpyTimeCnt=0;//数码管的闪烁计时器,放在定时中断里不断累加
  39. //根据原理图得出的共阴数码管字模表
  40. code unsigned char dig_table[]=
  41. {
  42. 0x3f,//0 序号0
  43. 0x06,//1 序号1
  44. 0x5b,//2 序号2
  45. 0x4f,//3 序号3
  46. 0x66,//4 序号4
  47. 0x6d,//5 序号5
  48. 0x7d,//6 序号6
  49. 0x07,//7 序号7
  50. 0x7f,//8 序号8
  51. 0x6f,//9 序号9
  52. 0x00,//无 序号10
  53. 0x40,//- 序号11
  54. 0x73,//P 序号12
  55. };
  56. void main()
  57. {
  58. initial_myself();
  59. delay_long(100);
  60. initial_peripheral();
  61. while(1)
  62. {
  63. key_service(); //按键服务的应用程序
  64. ds1302_sampling(); //ds1302采样程序,内部每秒钟采集更新一次
  65. display_service(); //显示的窗口菜单服务程序
  66. ds1302_alarm_service(); //ds1302出错报警
  67. }
  68. }
  69. /* 注释一:
  70. * 系统不用时时刻刻采集ds1302的内部数据,每隔一段时间更新采集一次就可以了。
  71. * 这个间隔时间应该小于或者等于1秒钟的时间,否则在数码管上看不到每秒钟的时间变化。
  72. */
  73. void ds1302_sampling(void) //ds1302采样程序,内部每秒钟采集更新一次
  74. {
  75. if(ucPart==0)//当系统不是处于设置日期和时间的情况下
  76. {
  77. ++uiSampingCnt;//累计主循环次数的时间
  78. if(uiSampingCnt>const_ds1302_sampling_time)//每隔一段时间就更新采集一次Ds1302数据
  79. {
  80. uiSampingCnt=0;
  81. ucYearBCD=Read1302(READ_YEAR); //读取年
  82. ucMonthBCD=Read1302(READ_MONTH); //读取月
  83. ucDateBCD=Read1302(READ_DATE); //读取日
  84. ucHourBCD=Read1302(READ_HOUR); //读取时
  85. ucMinuteBCD=Read1302(READ_MINUTE); //读取分
  86. ucSecondBCD=Read1302(READ_SECOND); //读取秒
  87. ucYear=bcd_to_number(ucYearBCD);//BCD转原始数值
  88. ucMonth=bcd_to_number(ucMonthBCD);//BCD转原始数值
  89. ucDate=bcd_to_number(ucDateBCD);//BCD转原始数值
  90. ucHour=bcd_to_number(ucHourBCD);//BCD转原始数值
  91. ucMinute=bcd_to_number(ucMinuteBCD);//BCD转原始数值
  92. ucSecond=bcd_to_number(ucSecondBCD);//BCD转原始数值
  93. ucWd2Update=1; //窗口2更新显示时间
  94. }
  95. }
  96. }
  97. //修改ds1302时间的驱动 ,注意,此处写入的是BCD码,
  98. void Write1302 ( unsigned char addr, unsigned char dat )
  99. {
  100. unsigned char i,temp; //单片机驱动DS1302属于SPI通讯方式,根据我的经验,不用关闭中断
  101. DS1302_CE_dr=0; //CE引脚为低,数据传送中止
  102. dela

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

网站地图

Top