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

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

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

  1. }
  2. ucDisplayDriveStep++;
  3. if(ucDisplayDriveStep>8)//扫描完8个数码管后,重新从第一个开始扫描
  4. {
  5. ucDisplayDriveStep=1;
  6. }
  7. }
  8. //数码管的74HC595驱动函数
  9. void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01)
  10. {
  11. unsigned char i;
  12. unsigned char ucTempData;
  13. dig_hc595_sh_dr=0;
  14. dig_hc595_st_dr=0;
  15. ucTempData=ucDigStatusTemp16_09;//先送高8位
  16. for(i=0;i<8;i++)
  17. {
  18. if(ucTempData>=0x80)dig_hc595_ds_dr=1;
  19. else dig_hc595_ds_dr=0;
  20. dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  21. delay_short(1);
  22. dig_hc595_sh_dr=1;
  23. delay_short(1);
  24. ucTempData=ucTempData<1;
  25. }
  26. ucTempData=ucDigStatusTemp08_01;//再先送低8位
  27. for(i=0;i<8;i++)
  28. {
  29. if(ucTempData>=0x80)dig_hc595_ds_dr=1;
  30. else dig_hc595_ds_dr=0;
  31. dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  32. delay_short(1);
  33. dig_hc595_sh_dr=1;
  34. delay_short(1);
  35. ucTempData=ucTempData<1;
  36. }
  37. dig_hc595_st_dr=0;//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
  38. delay_short(1);
  39. dig_hc595_st_dr=1;
  40. delay_short(1);
  41. dig_hc595_sh_dr=0; //拉低,抗干扰就增强
  42. dig_hc595_st_dr=0;
  43. dig_hc595_ds_dr=0;
  44. }
  45. //LED灯的74HC595驱动函数
  46. void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01)
  47. {
  48. unsigned char i;
  49. unsigned char ucTempData;
  50. hc595_sh_dr=0;
  51. hc595_st_dr=0;
  52. ucTempData=ucLedStatusTemp16_09;//先送高8位
  53. for(i=0;i<8;i++)
  54. {
  55. if(ucTempData>=0x80)hc595_ds_dr=1;
  56. else hc595_ds_dr=0;
  57. hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  58. delay_short(1);
  59. hc595_sh_dr=1;
  60. delay_short(1);
  61. ucTempData=ucTempData<1;
  62. }
  63. ucTempData=ucLedStatusTemp08_01;//再先送低8位
  64. for(i=0;i<8;i++)
  65. {
  66. if(ucTempData>=0x80)hc595_ds_dr=1;
  67. else hc595_ds_dr=0;
  68. hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  69. delay_short(1);
  70. hc595_sh_dr=1;
  71. delay_short(1);
  72. ucTempData=ucTempData<1;
  73. }
  74. hc595_st_dr=0;//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
  75. delay_short(1);
  76. hc595_st_dr=1;
  77. delay_short(1);
  78. hc595_sh_dr=0; //拉低,抗干扰就增强
  79. hc595_st_dr=0;
  80. hc595_ds_dr=0;
  81. }
  82. void T0_time(void) interrupt 1 //定时中断
  83. {
  84. TF0=0;//清除中断标志
  85. TR0=0; //关中断
  86. if(ucVoiceLock==0) //原子锁判断
  87. {
  88. if(uiVoiceCnt!=0)
  89. {
  90. uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫
  91. beep_dr=0;//蜂鸣器是PNP三极管控制,低电平就开始鸣叫。
  92. }
  93. else
  94. {
  95. ; //此处多加一个空指令,想维持跟if括号语句的数量对称,都是两条指令。不加也可以。
  96. beep_dr=1;//蜂鸣器是PNP三极管控制,高电平就停止鸣叫。
  97. }
  98. }
  99. if(ucDs1302Error>0) //EEPROM出错
  100. {
  101. if(ucDs1302Lock==0)//原子锁判断
  102. {
  103. uiDs1302Cnt++;//间歇性蜂鸣器报警的计时器
  104. }
  105. }
  106. if(ucDpyTimeLock==0) //原子锁判断
  107. {
  108. uiDpyTimeCnt++;//数码管的闪烁计时器
  109. }
  110. key_scan(); //按键扫描函数
  111. display_drive();//数码管字模的驱动函数
  112. TH0=0xfe; //重装初始值(65535-500)=65035=0xfe0b
  113. TL0=0x0b;
  114. TR0=1;//开中断
  115. }
  116. void delay_short(unsigned int uiDelayShort)
  117. {
  118. unsigned int i;
  119. for(i=0;i
  120. {
  121. ; //一个分号相当于执行一条空语句
  122. }
  123. }
  124. void delay_long(unsigned int uiDelayLong)
  125. {
  126. unsigned int i;
  127. unsigned int j;
  128. for(i=0;i
  129. {
  130. for(j=0;j<500;j++)//内嵌循环的空指令数量
  131. {
  132. ; //一个分号相当于执行一条空语句
  133. }
  134. }
  135. }
  136. void initial_myself(void)//第一区 初始化单片机
  137. {
  138. key_gnd_dr=0; //模拟独立按键的地GND,因此必须一直输出低电平
  139. beep_dr=1; //用PNP三极管控制蜂鸣器,输出高电平时不叫。
  140. hc595_drive(0x00,0x00);//关闭所有经过另外两个74HC595驱动的LED灯
  141. TMOD=0x01;//设置定时器0为工作方式1
  142. TH0=0xfe; //重装初始值(65535-500)=65035=0xfe0b
  143. TL0=0x0b;
  144. }
  145. void initial_peripheral(void) //第二区 初始化外围
  146. {
  147. ucDigDot8=0; //小数点全部不显示
  148. ucDigDot7=0;
  149. ucDigDot6=0;
  150. ucDigDot5=0;
  151. ucDigDot4=0;
  152. ucDigDot3=0;
  153. ucDigDot2=0;
  154. ucDigDot1=0;
  155. EA=1; //开总中断
  156. ET0=1; //允许定时中断
  157. TR0=1; //启动定时中断
  158. /* 注释七:
  159. * 检查ds1302芯片的备用电池电量是否用完了。
  160. * 在上电的时候,在一个特定的地址里把数据读出来,如果发现不等于0x5a,
  161. * 则是因为备用电

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

网站地图

Top