微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第88节:单片机靠关键字快速截取有效数据串

第88节:单片机靠关键字快速截取有效数据串

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

  1. gned char ucTempData;
  2. dig_hc595_sh_dr=0;
  3. dig_hc595_st_dr=0;
  4. ucTempData=ucDigStatusTemp16_09;//先送高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. ucTempData=ucDigStatusTemp08_01;//再先送低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. dig_hc595_st_dr=0;//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
  27. delay_short(1);
  28. dig_hc595_st_dr=1;
  29. delay_short(1);
  30. dig_hc595_sh_dr=0; //拉低,抗干扰就增强
  31. dig_hc595_st_dr=0;
  32. dig_hc595_ds_dr=0;
  33. }
  34. //LED灯的74HC595驱动函数
  35. void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01)
  36. {
  37. unsigned char i;
  38. unsigned char ucTempData;
  39. hc595_sh_dr=0;
  40. hc595_st_dr=0;
  41. ucTempData=ucLedStatusTemp16_09;//先送高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. ucTempData=ucLedStatusTemp08_01;//再先送低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. hc595_st_dr=0;//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
  64. delay_short(1);
  65. hc595_st_dr=1;
  66. delay_short(1);
  67. hc595_sh_dr=0; //拉低,抗干扰就增强
  68. hc595_st_dr=0;
  69. hc595_ds_dr=0;
  70. }
  71. void T0_time() interrupt 1
  72. {
  73. TF0=0;//清除中断标志
  74. TR0=0; //关中断
  75. display_drive();//数码管字模的驱动函数
  76. TH0=0xfe; //重装初始值(65535-500)=65035=0xfe0b
  77. TL0=0x0b;
  78. TR0=1;//开中断
  79. }
  80. void delay_short(unsigned int uiDelayShort)
  81. {
  82. unsigned int i;
  83. for(i=0;i
  84. {
  85. ; //一个分号相当于执行一条空语句
  86. }
  87. }
  88. void delay_long(unsigned int uiDelayLong)
  89. {
  90. unsigned int i;
  91. unsigned int j;
  92. for(i=0;i
  93. {
  94. for(j=0;j<500;j++)//内嵌循环的空指令数量
  95. {
  96. ; //一个分号相当于执行一条空语句
  97. }
  98. }
  99. }
  100. void initial_myself()//第一区 初始化单片机
  101. {
  102. beep_dr=1; //用PNP三极管控制蜂鸣器,输出高电平时不叫。
  103. led_dr=0;//关闭独立LED灯
  104. hc595_drive(0x00,0x00);//关闭所有经过另外两个74HC595驱动的LED灯
  105. TMOD=0x01;//设置定时器0为工作方式1
  106. TH0=0xfe; //重装初始值(65535-500)=65035=0xfe0b
  107. TL0=0x0b;
  108. //配置串口
  109. SCON=0x50;
  110. TMOD=0X21;
  111. /* 注释三:
  112. * 为了保证串口中断接收的数据不丢失,必须设置IP = 0x10,相当于把串口中断设置为最高优先级,
  113. * 这个时候,串口中断可以打断任何其他的中断服务函数实现嵌套,
  114. */
  115. IP =0x10;//把串口中断设置为最高优先级,必须的。
  116. TH1=TL1=-(11059200L/12/32/9600);//串口波特率为9600。
  117. TR1=1;
  118. }
  119. void initial_peripheral() //第二区 初始化外围
  120. {
  121. ucDigDot8=0; //初始化小数点全部不显示
  122. ucDigDot7=0;
  123. ucDigDot6=0;
  124. ucDigDot5=0;
  125. ucDigDot4=0;
  126. ucDigDot3=0;
  127. ucDigDot2=0;
  128. ucDigDot1=0;
  129. EA=1; //开总中断
  130. ES=1; //允许串口中断
  131. ET0=1; //允许定时中断
  132. TR0=1; //启动定时中断
  133. }

总结陈词:

前面我在第48节里讲过用ds1302做的时钟程序,但是后来很多网友建议,为了方便初学者学习编程思路,我应该用单片机定时器做一个时钟程序。因此,我决定下一节讲这方面的内容。欲知详情,请听下回分解----用单片机内部定时器做一个时钟。

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

网站地图

Top