微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第47节:操作AT24C02利用定时器延时改善数码管的闪烁

第47节:操作AT24C02利用定时器延时改善数码管的闪烁

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

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

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

网站地图

Top