[经验] 基于R7F0C809智能车遥控器—详细设计方案2

shiyongzhu   2015-11-22 14:30 楼主
R7F0C809显示板套件主要完成处理按键识别、数码管显示以及串口通信三个功能的实现。三个功能具体内容如下:
(1) 按键识别:识别按键的状态
(2) 数码管显示:根据按键状态,数码管能够切换显示控制速度、转弯速度
(3) 串口通信:串口定时向遥控板(stm32f103开发板)输出控制信息(速度、转弯)
为了三项功能分一下几点进行程序编写:
定时器:
实现三个功能同时工作,设计中分别采用三个定时器中断,根据中断状态从而调度不同的功能予以运行。
  1. /******************************************************************************
  2. * Function Name : TAU0_Init
  3. * Description : This function initialize TAU0 module.
  4. * Arguments : none
  5. * Return Value : none
  6. ******************************************************************************/
  7. void TAU0_Init(void)
  8. {
  9. TAU0EN = 1; /*supply input clock*/
  10. TPS0 = 0x05; /*CK00, fMCLK = fCLK/(2^5) = 625kHz╢CLK=20MHz*/
  11. /* channel 0 and 1 used as interval timer */
  12. TMR00H = 0; /*only software trigger*/
  13. TMR00L = 0;
  14. TMR01H = 0; /*only software trigger*/
  15. TMR01L = 0;
  16. TMR02H = 0; /*only software trigger*/
  17. TMR02L = 0;
  18. TDR00H = 0x0a; /*4.17ms*/
  19. TDR00L = 0x2b;
  20. TDR01H = 0x04; /*2ms*/
  21. TDR01L = 0xE1;
  22. TDR03H = 0xf4; /*100ms*/
  23. TDR03L = 0x23;
  24. TMIF00 = 0; /*Clear channel0 interrupt flag */
  25. TMIF01 = 0; /*Clear channel1 interrupt flag */
  26. TMIF02 = 0; /*Clear channel1 interrupt flag */
  27. TMMK00 = 0; /* Enables INTTM00 interrupt */
  28. TMPR100 = 0; /* Sets INTTM00 low priority */
  29. TMPR000 = 1;
  30. TMMK01 = 1; /* Disables INTTM01 interrupt */
  31. TMPR101 = 1; /* Sets INTTM01 low priority */
  32. TMPR001 = 0;
  33. TMMK02 = 0; /* Enables INTTM02 interrupt */
  34. TMPR102 = 1; /* Sets INTTM00 low priority */
  35. // TMPR002 = 1;
  36. }
  37. void TAU0_Start(void)
  38. {
  39. TS0 |= 0x05; /* Start TAU00 TAU02 timer */
  40. }
  41. /******************************************************************************
  42. End of function TAU0_Init
  43. ******************************************************************************/
  44. __interrupt void TAU0_Channel0_Interrupt(void)
  45. {
  46. LED_Display(); /* Executive the LED_Display function*/
  47. TS0 |= 0x02;
  48. TMMK01 = 0; /* Enables INTTM01 interrupt */
  49. }
  50. __interrupt void TAU0_Channel1_Interrupt(void)
  51. {
  52. Key_Scan(); /* Executive the Key_Scan function*/
  53. LED_Mode(); /* Executive the Led_Mode function*/
  54. TMMK01 = 1; /* Disables INTTM01 interrupt */
  55. TT0 |= 0x02;
  56. }
  57. __interrupt void TAU0_Channel2_Interrupt(void)
  58. {
  59. send_timer=1;
  60. }
串口:
由于串口发送(R_UART0_Send(message,8))会产生延时,所以在时间中断中不能调用该函数,只能先设置发送标志(send_timer),再在主程序中进行发送。
  1. void main(void)
  2. {
  3. /* Start user code. Do not edit comment generated here */
  4. MD_STATUS status;
  5. /* UART0 receive buffer setting */
  6. status = R_UART0_Receive(&g_Uart0RxBuf, 1);
  7. /* Start the UART0 Tx/Rx operation */
  8. R_UART0_Start();
  9. TAU0_Start();
  10. /* Main loop */
  11. while (1U)
  12. {
  13. if(send_timer)
  14. {
  15. message[2] = (speed_send & 0x00ff);
  16. message[3] = (speed_send & 0xff00)>>8;
  17. message[4] = (turn_send & 0x00ff);
  18. message[5] = (turn_send & 0xff00)>>8;
  19. g_Uart0TxEnd = R_UART0_Send(message, 8);
  20. while(g_Uart0TxEnd == 0){} /* wait for final transmit */
  21. send_timer=0;
  22. }
  23. if(g_Uart0RxEnd)
  24. {
  25. }
  26. }
  27. /* End user code. Do not edit comment generated here */
  28. }
在使用串口时,涉及到端口复用功能,首先需要先设定PIOR寄存器,而后再对所使用的端口进行设定。本设计中串口使用的是P01、P137口,PIOR设定如下:
PIOR &= 0x0FU;
PIOR |= 0x10U;
再设定端口状态:
P0 |= 0x02U;
PM0 &= ~0x02U;
键盘扫描:原先的键盘扫描,只能识别单一按键,而作为小车遥控器应具备同时运动方向和转弯的按键同时按下的要求,所以将代码进行了重新更改。
taojian_1.jpg
  1. void Key_Scan(void)
  2. {
  3. ///******************************************************************************
  4. //Static variables and functions(Only use the this files)
  5. //******************************************************************************/
  6. static uint8_t s_Count[8] ={0,0,0,0,0,0,0,0}; /* Key press count */
  7. uint8_t Key_scan0 = 0; /* Reading the P00's value */
  8. uint8_t Key_scan1 = 0; /* Reading the P16's value */
  9. uint8_t ComN = 0; /* Reading the P0's value */
  10. Key_scan0 = P0.0;
  11. Key_scan1 = P1.6;
  12. ComN = P0&0x3c;
  13. //Key scan
  14. if(ComN == 0x20) // scan K4 K8
  15. {
  16. if(Key_scan0==1)
  17. {
  18. if(s_Count[7]<3)
  19. s_Count[7]++;
  20. }
  21. else
  22. s_Count[7]=0;
  23. if(Key_scan1==1)
  24. {
  25. if(s_Count[3]<3)
  26. s_Count[3]++;
  27. }
  28. else
  29. s_Count[3]=0;
  30. }
  31. else if(ComN == 0x10) // scan K3 K7
  32. {
  33. if(Key_scan0==1)
  34. {
  35. if(s_Count[6]<12)
  36. s_Count[6]++;
  37. }
  38. else
  39. s_Count[6]=0;
  40. if(Key_scan1==1)
  41. {
  42. if(s_Count[2]<12)
  43. s_Count[2]++;
  44. }
  45. else
  46. s_Count[2]=0;
  47. }
  48. else if(ComN == 0x08) // scan K2 K6
  49. {
  50. if(Key_scan0==1)
  51. {
  52. if(s_Count[5]<3)
  53. s_Count[5]++;
  54. }
  55. else
  56. s_Count[5]=0;
  57. if(Key_scan1==1)
  58. {
  59. if(s_Count[1]<3)
  60. s_Count[1]++;
  61. }
  62. else
  63. s_Count[1]=0;
  64. }
  65. else if(ComN == 0x04) // scan K1 K5
  66. {
  67. if(Key_scan0==1)
  68. {
  69. if(s_Count[4]<12)
  70. s_Count[4]++;
  71. }
  72. else
  73. s_Count[4]=0;
  74. if(Key_scan1==1)
  75. {
  76. if(s_Count[0]<12)
  77. s_Count[0]++;
  78. }
  79. else
  80. s_Count[0]=0;
  81. }
  82. // Key procedure
  83. if(s_Count[1]==3) //K2--go ahead
  84. {
  85. g_Mode=0;
  86. speed_send = speed;
  87. }
  88. else if(s_Count[5]==3) //K6--back off
  89. {
  90. g_Mode=0;
  91. speed_send = -speed;
  92. }
  93. else
  94. speed_send=0;
  95. if(s_Count[0]==12) //K1--speed decrease
  96. {
  97. s_Count[0]=0;
  98. g_Mode=1;
  99. if(speed>10)
  100. speed-=1;
  101. }
  102. else if(s_Count[2]==12) //K3--speed increase
  103. {
  104. s_Count[2]=0;
  105. g_Mode=1;
  106. if(speed<80)
  107. speed+=1;
  108. }
  109. if(s_Count[3]==3) //K4--turn right
  110. {
  111. g_Mode=2;
  112. turn_send = turn;
  113. }
  114. else if(s_Count[7]==3) //K8--turn left
  115. {
  116. g_Mode=2;
  117. turn_send = -turn;
  118. }
  119. else
  120. turn_send=0;
  121. if(s_Count[4]==12) //K5--turn angle decrease
  122. {
  123. s_Count[4]=0;
  124. g_Mode=3;
  125. if(turn>10)
  126. turn-=1;
  127. }
  128. else if(s_Count[6]==12) //K7--turn angle increase
  129. {
  130. s_Count[6]=0;
  131. g_Mode=3;
  132. if(turn<30)
  133. turn+=1;
  134. }
  135. }
至此,基本功能已经完成编写,下面进行程序测试: 串口输出从测试: 串口.JPG 按键功能测试视频: 小车遥控测试视频: 代码:
ControlPanel.rar (86.18 KB)
(下载次数: 2, 2015-11-22 14:26 上传)
本帖最后由 shiyongzhu 于 2015-11-22 14:30 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复