微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第43节:通过串口用计数延时方式发送一串数据

第43节:通过串口用计数延时方式发送一串数据

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

  1. 数据的中间变量清零
  2. uiSendTimeCnt=0; //累计主循环次数的计数延时器清零
  3. ucSendStep=1; //切换到下一步发送一串数据
  4. break;
  5. default://如果没有符合要求的消息,则不处理
  6. ucSendStep=0; //维持现状,不切换
  7. break;
  8. }
  9. }
  10. break;
  11. case 1://利用累加主循环次数的计数延时方式来发送一串数据
  12. /* 注释二:
  13. * 这里的计数延时为什么不用累计定时中断次数的延时,而用累计主循环次数的计数延时?
  14. * 因为本程序定时器中断一次需要500个指令时间,时间分辨率太低,不方便微调时间。因此我
  15. * 就用累计主循环次数的计数延时方式,在做项目的时候,各位读者应该根据系统的实际情况
  16. * 来调整const_send_time的大小。
  17. */
  18. uiSendTimeCnt++;//累计主循环次数的计数延时,为每个字节之间增加延时,
  19. if(uiSendTimeCnt>const_send_time)//请根据实际系统的情况,调整const_send_time的大小
  20. {
  21. uiSendTimeCnt=0;
  22. eusart_send(ucSendregBuf[uiSendCnt]);//发送一串数据给上位机
  23. uiSendCnt++;
  24. if(uiSendCnt>=9) //说明数据已经发送完毕
  25. {
  26. uiSendCnt=0;
  27. ucSendStep=0; //返回到上一步,处理其它未处理的消息
  28. }
  29. }
  30. break;
  31. }
  32. }
  33. void eusart_send(unsigned char ucSendData)
  34. {
  35. ES = 0; //关串口中断
  36. TI = 0; //清零串口发送完成中断请求标志
  37. SBUF =ucSendData; //发送一个字节
  38. /* 注释三:
  39. * 根据我个人的经验,在发送一串数据中,每个字节之间必须添加一个延时,用来等待串口发送完成。
  40. * 当然,也有一些朋友可能不增加延时,直接靠单片机自带的发送完成标志位来判断,但是我以前
  41. * 在做项目中,感觉单单靠发送完成标志位来判断还是容易出错(当然也有可能是我自身程序的问题),
  42. * 所以后来在大部分的项目中我就干脆靠延时来等待它发送完成。我在51,PIC单片机中都是这么做的。
  43. * 但是,凭我的经验,在stm32单片机中,可以不增加延时,直接靠单片机自带的标志位来判断就很可靠。
  44. */
  45. //delay_short(400);//因为外部在每个发送字节之间用了累计主循环次数的计数延时,因此不要此行的delay延时
  46. TI = 0; //清零串口发送完成中断请求标志
  47. ES = 1; //允许串口中断
  48. }
  49. void key_scan(void)//按键扫描函数 放在定时中断里
  50. {
  51. if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  52. {
  53. ucKeyLock1=0; //按键自锁标志清零
  54. uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
  55. }
  56. else if(ucKeyLock1==0)//有按键按下,且是第一次被按下
  57. {
  58. uiKeyTimeCnt1++; //累加定时中断次数
  59. if(uiKeyTimeCnt1>const_key_time1)
  60. {
  61. uiKeyTimeCnt1=0;
  62. ucKeyLock1=1;//自锁按键置位,避免一直触发
  63. ucKeySec=1; //触发1号键
  64. }
  65. }
  66. if(key_sr2==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  67. {
  68. ucKeyLock2=0; //按键自锁标志清零
  69. uiKeyTimeCnt2=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
  70. }
  71. else if(ucKeyLock2==0)//有按键按下,且是第一次被按下
  72. {
  73. uiKeyTimeCnt2++; //累加定时中断次数
  74. if(uiKeyTimeCnt2>const_key_time2)
  75. {
  76. uiKeyTimeCnt2=0;
  77. ucKeyLock2=1;//自锁按键置位,避免一直触发
  78. ucKeySec=2; //触发2号键
  79. }
  80. }
  81. if(key_sr3==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  82. {
  83. ucKeyLock3=0; //按键自锁标志清零
  84. uiKeyTimeCnt3=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
  85. }
  86. else if(ucKeyLock3==0)//有按键按下,且是第一次被按下
  87. {
  88. uiKeyTimeCnt3++; //累加定时中断次数
  89. if(uiKeyTimeCnt3>const_key_time3)
  90. {
  91. uiKeyTimeCnt3=0;
  92. ucKeyLock3=1;//自锁按键置位,避免一直触发
  93. ucKeySec=3; //触发3号键
  94. }
  95. }
  96. if(key_sr4==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  97. {
  98. ucKeyLock4=0; //按键自锁标志清零
  99. uiKeyTimeCnt4=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
  100. }
  101. else if(ucKeyLock4==0)//有按键按下,且是第一次被按下
  102. {
  103. uiKeyTimeCnt4++; //累加定时中断次数
  104. if(uiKeyTimeCnt4>const_key_time4)
  105. {
  106. uiKeyTimeCnt4=0;
  107. ucKeyLock4=1;//自锁按键置位,避免一直触发
  108. ucKeySec=4; //触发4号键
  109. }
  110. }
  111. }
  112. void key_service(void) //第三区 按键服务的应用程序
  113. {
  114. switch(ucKeySec) //按键服务状态切换
  115. {
  116. case 1:// 1号键 对应朱兆祺学习板的S1键

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

网站地图

Top