微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第45节:主机的串口收发综合程序框架

第45节:主机的串口收发综合程序框架

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

  1. xf7);
  2. break;
  3. case 5://显示第5位
  4. ucDigShowTemp=dig_table[ucDigShow5];
  5. if(ucDigDot5==1)
  6. {
  7. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  8. }
  9. dig_hc595_drive(ucDigShowTemp,0xef);
  10. break;
  11. case 6://显示第6位
  12. ucDigShowTemp=dig_table[ucDigShow6];
  13. if(ucDigDot6==1)
  14. {
  15. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  16. }
  17. dig_hc595_drive(ucDigShowTemp,0xdf);
  18. break;
  19. case 7://显示第7位
  20. ucDigShowTemp=dig_table[ucDigShow7];
  21. if(ucDigDot7==1)
  22. {
  23. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  24. }
  25. dig_hc595_drive(ucDigShowTemp,0xbf);
  26. break;
  27. case 8://显示第8位
  28. ucDigShowTemp=dig_table[ucDigShow8];
  29. if(ucDigDot8==1)
  30. {
  31. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  32. }
  33. dig_hc595_drive(ucDigShowTemp,0x7f);
  34. break;
  35. }
  36. ucDisplayDriveStep++;
  37. if(ucDisplayDriveStep>8)//扫描完8个数码管后,重新从第一个开始扫描
  38. {
  39. ucDisplayDriveStep=1;
  40. }
  41. }
  42. //数码管的74HC595驱动函数
  43. void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01)
  44. {
  45. unsigned char i;
  46. unsigned char ucTempData;
  47. dig_hc595_sh_dr=0;
  48. dig_hc595_st_dr=0;
  49. ucTempData=ucDigStatusTemp16_09;//先送高8位
  50. for(i=0;i<8;i++)
  51. {
  52. if(ucTempData>=0x80)dig_hc595_ds_dr=1;
  53. else dig_hc595_ds_dr=0;
  54. dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  55. delay_short(1);
  56. dig_hc595_sh_dr=1;
  57. delay_short(1);
  58. ucTempData=ucTempData<1;
  59. }
  60. ucTempData=ucDigStatusTemp08_01;//再先送低8位
  61. for(i=0;i<8;i++)
  62. {
  63. if(ucTempData>=0x80)dig_hc595_ds_dr=1;
  64. else dig_hc595_ds_dr=0;
  65. dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  66. delay_short(1);
  67. dig_hc595_sh_dr=1;
  68. delay_short(1);
  69. ucTempData=ucTempData<1;
  70. }
  71. dig_hc595_st_dr=0;//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
  72. delay_short(1);
  73. dig_hc595_st_dr=1;
  74. delay_short(1);
  75. dig_hc595_sh_dr=0; //拉低,抗干扰就增强
  76. dig_hc595_st_dr=0;
  77. dig_hc595_ds_dr=0;
  78. }
  79. //LED灯的74HC595驱动函数
  80. void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01)
  81. {
  82. unsigned char i;
  83. unsigned char ucTempData;
  84. hc595_sh_dr=0;
  85. hc595_st_dr=0;
  86. ucTempData=ucLedStatusTemp16_09;//先送高8位
  87. for(i=0;i<8;i++)
  88. {
  89. if(ucTempData>=0x80)hc595_ds_dr=1;
  90. else hc595_ds_dr=0;
  91. hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  92. delay_short(1);
  93. hc595_sh_dr=1;
  94. delay_short(1);
  95. ucTempData=ucTempData<1;
  96. }
  97. ucTempData=ucLedStatusTemp08_01;//再先送低8位
  98. for(i=0;i<8;i++)
  99. {
  100. if(ucTempData>=0x80)hc595_ds_dr=1;
  101. else hc595_ds_dr=0;
  102. hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  103. delay_short(1);
  104. hc595_sh_dr=1;
  105. delay_short(1);
  106. ucTempData=ucTempData<1;
  107. }
  108. hc595_st_dr=0;//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
  109. delay_short(1);
  110. hc595_st_dr=1;
  111. delay_short(1);
  112. hc595_sh_dr=0; //拉低,抗干扰就增强
  113. hc595_st_dr=0;
  114. hc595_ds_dr=0;
  115. }
  116. void usart_receive(void) interrupt 4 //串口接收数据中断
  117. {
  118. if(RI==1)
  119. {
  120. RI = 0;
  121. ++uiRcregTotal;
  122. if(uiRcregTotal>const_rc_size)//超过缓冲区
  123. {
  124. uiRcregTotal=const_rc_size;
  125. }
  126. ucRcregBuf[uiRcregTotal-1]=SBUF; //将串口接收到的数据缓存到接收缓冲区里
  127. if(ucSendCntLock==0)//原子锁判断
  128. {
  129. ucSendCntLock=1; //加锁
  130. uiSendCnt=0;//及时喂狗,虽然在定时中断那边此变量会不断累加,但是只要串口的数据还没发送完毕,那么它永远也长不大,因为每个串口接收中断它都被清零。
  131. ucSendCntLock=0; //解锁
  132. }
  133. }
  134. else//我在其它单片机上都不用else这段代码的,可能在51单片机上多增加" TI = 0;"稳定性会更好吧。
  135. {
  136. TI = 0;//如果不是串口接收中断,那么必然是串口发送中断,及时清除发送中断的标志,否则一直发送中断
  137. }
  138. }
  139. void T0_time(void) interrupt 1 //定时中断
  140. {
  141. TF0=0;//清除中断标志
  142. TR0=0; //关中断
  143. /* 注释一:
  144. * 此处多增加一个原子锁,作为中断与主函数共享数据的保护,实

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

网站地图

Top