久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2020|回復: 0
打印 上一主題 下一主題
收起左側

MicroMouse高級實驗源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:320785 發表于 2018-10-1 16:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
MicroMouse源程序如下:
  1. /****************************************Copyright (c)****************************************************
  2. **                            Guangzhou ZHIYUAN electronics Co.,LTD.
  3. **
  4. **
  5. **--------------File Info---------------------------------------------------------------------------------
  6. ** File name:           main.c
  7. ** Last modified Date:  2011-03-11
  8. ** Last Version:        V1.01
  9. ** Descriptions:        The main() function example template
  10. **
  11. **--------------------------------------------------------------------------------------------------------
  12. ** Created by:          廖茂剛
  13. ** Created date:        2008-02-14
  14. ** Version:             V1.00
  15. ** Descriptions:        MicroMouse615上的無記憶功能的走迷宮實驗
  16. **
  17. **--------------------------------------------------------------------------------------------------------
  18. ** Modified by:         FanLinyun
  19. ** Modified date:       2011-03-11
  20. ** Version:             V1.01
  21. ** Descriptions:        移植到MicroMouse1752上
  22. **
  23. ** Rechecked by:        
  24. *********************************************************************************************************/
  25. #include "..\config.h"

  26. /*********************************************************************************************************
  27.   按鍵宏定義
  28. *********************************************************************************************************/
  29. #define  KEY                        (1 << 6)                            /*  按鍵連接的端口              */
  30. #define  KEY_PRESS()                (!(FIO2PIN & KEY))                  /*  按鍵是否按下判斷            */

  31. /*********************************************************************************************************
  32.   IR相關宏定義
  33. *********************************************************************************************************/
  34. #define IR_SIDE_LFT                 (1ul << 0)                          /*  左方傳感器輸出的信號        */
  35. #define IR_DIG_LFT                  (1ul << 1)                          /*  左前方傳感器輸出的信號      */
  36. #define IR_FRONT                    (1ul << 4)                          /*  前方傳感器輸出的信號        */
  37. #define IR_DIG_RGT                  (1ul << 8)                          /*  右前方傳感器輸出的信號      */
  38. #define IR_SIDE_RGT                 (1ul << 9)                          /*  右方傳感器輸出的信號        */

  39. #define FRONT_SIDE_PWM_INDEX        1                                   /*  左前右驅動傳感器PWM索引號   */
  40. #define DIG_PWM_INDEX               2                                   /*  左前右前驅動傳感器PWM索引號 */

  41. #define PWM_RESET()                 PWM1TCR  = 0x02                     /*  PWM復位                     */
  42. #define PWM_START()                 PWM1TCR  = 0x05                     /*  PWM使能                     */

  43. #define PWM_FRQ_SET(x)              PWM1MR0 = (FPCLK / (x))             /*  PWM頻率設置                 */

  44. #define FRONTSIDE_PWM_PULSE_SET(x)  PWM1MR2 = (x)                       /*  左前右PWM占空比設置         */
  45. #define DIG_PWM_PULSE_SET(x)        PWM1MR1 = (x)                       /*  左前右前PWM占空比設置       */

  46. #define FRONTSIDE_PWM_EN()          PWM1PCR |= (1 << 10)                /*  左前右PWM輸出使能           */
  47. #define DIG_PWM_EN()                PWM1PCR |= (1 << 9)                 /*  左前右前PWM輸出使能         */

  48. #define FRONTSIDE_PWM_DIS()         PWM1PCR &= ~(1 << 10)               /*  左前右PWM輸出禁能           */
  49. #define DIG_PWM_DIS()               PWM1PCR &= ~(1 << 9)                /*  左前右前PWM輸出禁能         */

  50. #define IR_PIN_MODE_IN()            FIO1DIR &=                         /*  配置傳感器檢測引腳為輸入    */\
  51.                 ~(IR_SIDE_LFT | IR_DIG_LFT | IR_FRONT | IR_DIG_RGT | IR_SIDE_RGT)
  52. #define IR_READ()                   FIO1PIN                             /*  紅外信號讀取                */

  53. /*********************************************************************************************************
  54.   電機相關宏定義
  55. *********************************************************************************************************/
  56. /*
  57. *  左電機接口
  58. */
  59. #define MT_LFT_A1           (1 << 2)
  60. #define MT_LFT_A2           (1 << 3)
  61. #define MT_LFT_B1           (1 << 4)
  62. #define MT_LFT_B2           (1 << 5)

  63. /*
  64. *  右電機接口
  65. */
  66. #define MT_RGT_A1           (1 << 25)
  67. #define MT_RGT_A2           (1 << 26)
  68. #define MT_RGT_B1           (1 << 28)
  69. #define MT_RGT_B2           (1 << 29)

  70. /*
  71. *  左電機拍數宏定義
  72. */
  73. #define MT_LFT_OFF()        FIO2CLR = (MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2)
  74. #define MT_LFT_STEP1_SET()  FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2;    \
  75.                             FIO2SET = MT_LFT_A1
  76. #define MT_LFT_STEP2_SET()  FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2;    \
  77.                             FIO2SET = MT_LFT_A1 | MT_LFT_B1
  78. #define MT_LFT_STEP3_SET()  FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2;    \
  79.                             FIO2SET = MT_LFT_B1
  80. #define MT_LFT_STEP4_SET()  FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2;    \
  81.                             FIO2SET = MT_LFT_A2 | MT_LFT_B1
  82. #define MT_LFT_STEP5_SET()  FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2;    \
  83.                             FIO2SET = MT_LFT_A2
  84. #define MT_LFT_STEP6_SET()  FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2;    \
  85.                             FIO2SET = MT_LFT_A2 | MT_LFT_B2
  86. #define MT_LFT_STEP7_SET()  FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2;    \
  87.                             FIO2SET = MT_LFT_B2
  88. #define MT_LFT_STEP8_SET()  FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2;    \
  89.                             FIO2SET = MT_LFT_A1 | MT_LFT_B2
  90. /*
  91. *  右電機拍數宏定義
  92. */
  93. #define MT_RGT_OFF()        FIO1CLR = (MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2)
  94. #define MT_RGT_STEP1_SET()  FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2;    \
  95.                             FIO1SET = MT_RGT_A1
  96. #define MT_RGT_STEP2_SET()  FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2;    \
  97.                             FIO1SET = MT_RGT_A1 | MT_RGT_B1
  98. #define MT_RGT_STEP3_SET()  FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2;    \
  99.                             FIO1SET = MT_RGT_B1
  100. #define MT_RGT_STEP4_SET()  FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2;    \
  101.                             FIO1SET = MT_RGT_A2 | MT_RGT_B1
  102. #define MT_RGT_STEP5_SET()  FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2;    \
  103.                             FIO1SET = MT_RGT_A2
  104. #define MT_RGT_STEP6_SET()  FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2;    \
  105.                             FIO1SET = MT_RGT_A2 | MT_RGT_B2
  106. #define MT_RGT_STEP7_SET()  FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2;    \
  107.                             FIO1SET = MT_RGT_B2
  108. #define MT_RGT_STEP8_SET()  FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2;    \
  109.                             FIO1SET = MT_RGT_A1 | MT_RGT_B2

  110. /*********************************************************************************************************
  111.   定時器宏定義
  112. *********************************************************************************************************/
  113. #define TIMER0_INT_CLR()    T0IR = 0x01                                 /*  定時器0清中斷標志           */
  114. #define TIMER1_INT_CLR()    T1IR = 0x01                                 /*  定時器1清中斷標志           */

  115. #define TIMER0_LOAD_SET(x)  T0TCR  = 0x02;                            /*  定時器0裝載值設定           */ \
  116.                             T0MR0  = x;    \
  117.                             T0TCR  = 0x01
  118. #define TIMER1_LOAD_SET(x)  T1TCR  = 0x02;                            /*  定時器1裝載值設定           */ \
  119.                             T1MR0  = x;    \
  120.                             T1TCR  = 0x01

  121. /*********************************************************************************************************
  122.   前進一個迷宮格步進電機需要走的步數宏定義
  123. *********************************************************************************************************/
  124. #define ONE_BLOCK           125

  125. /*********************************************************************************************************
  126.   電腦鼠狀態宏定義
  127. *********************************************************************************************************/
  128. #define STOP               0                                            /*  電腦鼠停止                  */
  129. #define GO_AHEAD           1                                            /*  電腦鼠前進                  */
  130. #define TURN_LEFT          3                                            /*  電腦鼠向左轉                */
  131. #define TURN_RIGHT         4                                            /*  電腦鼠向右轉                */
  132. #define TURN_BACK          5                                            /*  電腦鼠向后轉                */

  133. /*********************************************************************************************************
  134.   傳感器宏定義
  135. *********************************************************************************************************/
  136. #define LEFT               0                                            /*  左方傳感器                  */
  137. #define FRONTL             1                                            /*  左前方傳感器                */
  138. #define FRONT              2                                            /*  前方傳感器                  */
  139. #define FRONTR             3                                            /*  右前方傳感器                */
  140. #define RIGHT              4                                            /*  右方傳感器                  */

  141. /*********************************************************************************************************
  142.   電機狀態宏定義
  143. *********************************************************************************************************/
  144. #define MOTOR_STOP         0                                            /*  電機停止                    */
  145. #define WAITONE_STEP       1                                            /*  電機暫停一步                */
  146. #define MOTOR_RUN          2                                            /*  電機運行                    */

  147. /*********************************************************************************************************
  148.   常量宏定義--電機運行方向
  149. *********************************************************************************************************/
  150. #define MOTOR_GO_AHEAD     0                                            /*  電機前進                    */
  151. #define MOTOR_GO_BACK      1                                            /*  電機后退                    */


  152. /*********************************************************************************************************
  153.   結構體定義
  154. *********************************************************************************************************/
  155. struct motor {
  156.     volatile INT8S    cState;                                           /*  電機運行狀態                */
  157.     volatile INT8S    cDir;                                             /*  電機運行方向                */
  158.     volatile INT32U   ulPulse;                                          /*  電機需要轉動的步數          */
  159.     volatile INT32U   ulPulseCtr;                                       /*  電機已轉動的步數            */
  160.     volatile INT32S   lSpeed;                                           /*  電機轉動速度                */
  161. };
  162. typedef struct motor MOTOR;

  163. /*********************************************************************************************************
  164.   定義全局變量
  165. *********************************************************************************************************/
  166. static MOTOR   GmRight  = {MOTOR_STOP, MOTOR_GO_AHEAD, 0, 0, 0};        /*  定義并初始化右電機狀態      */
  167. static MOTOR   GmLeft   = {MOTOR_STOP, MOTOR_GO_AHEAD, 0, 0, 0};        /*  定義并初始化左電機狀態      */
  168.                                                                         
  169. static volatile INT8U GucMouseState = STOP;                             /*  保存電腦鼠當前運行狀態      */
  170. static INT32U GulAccelTable[300]    = {0};                              /*  電機加減速各階段定時器值    */
  171. static INT32S GlMaxSpeed            = 60;                               /*  保存允許運行的最大速度      */

  172. static volatile INT8U GucDistance[5]    = {0};                          /*  記錄傳感器狀態              */

  173. /*********************************************************************************************************
  174. ** Function name:       myDelay
  175. ** Descriptions:        軟件延時
  176. ** input parameters:    延時時間,單位為us
  177. ** output parameters:   無
  178. ** Returned value:      無
  179. *********************************************************************************************************/
  180. void delayMs(INT32U ulTime)
  181. {
  182.     INT32U i;
  183.     while (ulTime--) {
  184.       for (i = 0; i < (FCCLK / 1000 / 3); i++);
  185.     }
  186. }
  187. /*********************************************************************************************************
  188. ** Function name:       lftMtCtrl
  189. ** Descriptions:        左步進電機驅動時序
  190. ** input parameters:    GmLeft.cDir :電機運行方向
  191. ** output parameters:   無
  192. ** Returned value:      無
  193. *********************************************************************************************************/
  194. void  lftMtCtrl (void)
  195. {
  196.     static INT8U ucRunStep = 0;                                         /*  保存電機當前位置            */
  197.    
  198.     switch (GmLeft.cDir) {
  199.     case MOTOR_GO_AHEAD:                                                /*  向前步進                    */
  200.         if (++ucRunStep >= 8) {
  201.             ucRunStep = 0;
  202.         }
  203.         break;
  204.     case MOTOR_GO_BACK:                                                 /*  向后步進                    */
  205.         if (--ucRunStep >= 8) {                                         /*  溢出                        */
  206.             ucRunStep = 7;
  207.         }
  208.         break;
  209.     default:
  210.         break;
  211.     }
  212.    
  213.     switch (ucRunStep) {                                                /*  執行步進電機時序            */
  214.     case 0:
  215.         MT_LFT_STEP1_SET();
  216.         break;
  217.     case 1:
  218.         MT_LFT_STEP2_SET();
  219.         break;
  220.     case 2:
  221.         MT_LFT_STEP3_SET();
  222.         break;
  223.     case 3:
  224.         MT_LFT_STEP4_SET();
  225.         break;
  226.     case 4:
  227.         MT_LFT_STEP5_SET();
  228.         break;
  229.     case 5:
  230.         MT_LFT_STEP6_SET();
  231.         break;
  232.     case 6:
  233.         MT_LFT_STEP7_SET();
  234.         break;
  235.     case 7:
  236.         MT_LFT_STEP8_SET();
  237.         break;
  238.     default:
  239.         break;
  240.     }
  241. }


  242. /*********************************************************************************************************
  243. ** Function name:       rgtMtCtrl
  244. ** Descriptions:        右步進電機驅動時序
  245. ** input parameters:    無
  246. ** output parameters:   無
  247. ** Returned value:      無
  248. *********************************************************************************************************/
  249. void  rgtMtCtrl (void)
  250. {
  251.     static INT8U ucRunStep = 0;                                         /*  保存電機當前位置            */
  252.    
  253.     switch (GmRight.cDir) {
  254.     case MOTOR_GO_AHEAD:                                                /*  向前步進                    */
  255.         if (--ucRunStep >= 8) {                                         /*  溢出                        */
  256.             ucRunStep = 7;
  257.         }
  258.         break;
  259.     case MOTOR_GO_BACK:                                                 /*  向后步進                    */
  260.         if (++ucRunStep >= 8) {
  261.             ucRunStep = 0;
  262.         }
  263.         break;
  264.     default:
  265.         break;
  266.     }
  267.    
  268.     switch (ucRunStep) {                                                /*  執行步進電機時序            */
  269.     case 0:
  270.         MT_RGT_STEP1_SET();
  271.         break;
  272.     case 1:
  273.         MT_RGT_STEP2_SET();
  274.         break;
  275.     case 2:
  276.         MT_RGT_STEP3_SET();
  277.         break;
  278.     case 3:
  279.         MT_RGT_STEP4_SET();
  280.         break;
  281.     case 4:
  282.         MT_RGT_STEP5_SET();
  283.         break;
  284.     case 5:
  285.         MT_RGT_STEP6_SET();
  286.         break;
  287.     case 6:
  288.         MT_RGT_STEP7_SET();
  289.         break;
  290.     case 7:
  291.         MT_RGT_STEP8_SET();
  292.         break;
  293.     default:
  294.         break;
  295.     }
  296. }


  297. /*********************************************************************************************************
  298. ** Function name:       lftMtSpeedCtrl
  299. ** Descriptions:        左電機速度調節
  300. ** input parameters:    無
  301. ** output parameters:   無
  302. ** Returned value:      無
  303. *********************************************************************************************************/
  304. void lftMtSpeedCtrl (void)
  305. {
  306.     INT32S lDownPusle;
  307.    
  308.     lDownPusle = GmLeft.ulPulse - GmLeft.ulPulseCtr;                    /*  統計電機還剩余的步數        */
  309.     if (lDownPusle <= GmLeft.lSpeed) {
  310.         GmLeft.lSpeed--;
  311.     } else {                                                            /*  非減速區間,則加速到最大值  */
  312.         if (GmLeft.lSpeed < GlMaxSpeed) {
  313.             GmLeft.lSpeed++;
  314.         }
  315.     }
  316.     if (GmLeft.lSpeed < 0) {                                            /*  設置速度下限                */
  317.         GmLeft.lSpeed = 0;
  318.     }
  319.    
  320.     TIMER0_LOAD_SET(GulAccelTable[GmLeft.lSpeed]);                     /*  設置定時時間                 */
  321. }

  322. /*********************************************************************************************************
  323. ** Function name:       rgtMtSpeedCtrl
  324. ** Descriptions:        右電機速度調節
  325. ** input parameters:    無
  326. ** output parameters:   無
  327. ** Returned value:      無
  328. *********************************************************************************************************/
  329. void rgtMtSpeedCtrl (void)
  330. {
  331.     INT32S lDownPusle;
  332.    
  333.     lDownPusle = GmRight.ulPulse - GmRight.ulPulseCtr;                  /*  統計電機還剩余的步數        */
  334.     if (lDownPusle <= GmRight.lSpeed) {
  335.         GmRight.lSpeed--;
  336.     } else {                                                            /*  非減速區間,則加速到最大值  */
  337.         if (GmRight.lSpeed < GlMaxSpeed) {
  338.             GmRight.lSpeed++;
  339.         } else {
  340.             GmRight.lSpeed--;
  341.         }
  342.     }
  343.     if (GmRight.lSpeed < 0) {                                           /*  設置速度下限                */
  344.         GmRight.lSpeed = 0;
  345.     }

  346.     TIMER1_LOAD_SET(GulAccelTable[GmRight.lSpeed]);                     /*  設置定時時間                */

  347. }

  348. /*********************************************************************************************************
  349. ** Function name:       timer0Isr
  350. ** Descriptions:        Timer0中斷服務函數
  351. ** input parameters:    GmLeft.cState :驅動步進電機的時序狀態
  352. **                      GmLeft.cDir   :步進電機運動的方向
  353. ** output parameters:   無
  354. ** Returned value:      無
  355. *********************************************************************************************************/
  356. void timer0Isr(void)
  357. {
  358.     static INT8S ucCnt1 = 0, ucCnt2 = 0;                                /*  修正姿態計數變量            */
  359.     TIMER0_INT_CLR();                                                   /*  清除中斷標志                */

  360.     switch (GmLeft.cState) {        
  361.     case MOTOR_STOP:                                                    /*  停止,同時清零速度和脈沖值  */
  362.         GmLeft.lSpeed     = 0;
  363.         GmLeft.ulPulse    = 0;
  364.         GmLeft.ulPulseCtr = 0;
  365.         break;        
  366.     case WAITONE_STEP:                                                  /*  暫停一步                    */
  367.         GmLeft.cState     = MOTOR_RUN;
  368.         break;
  369.     case MOTOR_RUN:                                                     /*  電機運行                    */
  370.         if (GucMouseState == GO_AHEAD) {                                /*  根據傳感器狀態微調電機位置  */
  371.             if (GucDistance[FRONTR] &&                                 /*  前右方有擋板                */\
  372.                (GucDistance[FRONTL]==0)) {                              /*  前左方無擋板                */
  373.                 if (ucCnt1 == 1) {
  374.                     GmLeft.cState = WAITONE_STEP;                       /*  使下一步暫停                */
  375.                 }
  376.                 if (++ucCnt1 > 3) {                                     /*  3步暫停一步                 */
  377.                     ucCnt1 = 0;
  378.                 }
  379.             } else {
  380.                 ucCnt1 = 0;
  381.             }
  382.             if ((GucDistance[LEFT] == 1) &&                             /*  左遠方有擋板               */\
  383.                (GucDistance[RIGHT] == 0)) {                             /*  右方無擋板                  */
  384.                 if(ucCnt2 == 3) {
  385.                     GmLeft.cState = WAITONE_STEP;                       /*  使下一步暫停                */
  386.                 }
  387.                 if (++ucCnt2 > 6) {                                     /*  6步暫停一步                 */
  388.                     ucCnt2 = 0;
  389.                 }
  390.             } else {
  391.                 ucCnt2  = 0;
  392.             }
  393.         }
  394.         lftMtCtrl();                                                    /*  電機驅動程序                */
  395.         break;
  396.     default:
  397.         break;
  398.     }
  399.     /*
  400.      *  是否完成任務判斷
  401.      */
  402.     if (GmLeft.cState != MOTOR_STOP) {
  403.         GmLeft.ulPulseCtr++;                                            /*  運行脈沖計數                */
  404.         lftMtSpeedCtrl();                                               /*  速度調節                    */
  405.         if (GmLeft.ulPulseCtr >= GmLeft.ulPulse) {
  406.             GmLeft.cState      = MOTOR_STOP;
  407.             GmLeft.ulPulseCtr  = 0;
  408.             GmLeft.ulPulse     = 0;
  409.             GmLeft.lSpeed      = 0;
  410.         }
  411.     }
  412. }
  413. /*********************************************************************************************************
  414. ** Function name:       timer1Isr
  415. ** Descriptions:        Timer1中斷服務函數
  416. ** input parameters:    無
  417. ** output parameters:   無
  418. ** Returned value:      無
  419. *********************************************************************************************************/
  420. void timer1Isr(void)
  421. {
  422.     static INT8S ucCnt1 = 0, ucCnt2 = 0;                                /*  修正姿態計數變量            */
  423.     TIMER1_INT_CLR();                                                   /*  清除中斷標志                */
  424.    
  425.     switch (GmRight.cState) {
  426.     case MOTOR_STOP:                                                     /*  停止,同時清零速度和脈沖值  */
  427.         GmRight.lSpeed     = 0;
  428.         GmRight.ulPulse    = 0;
  429.         GmRight.ulPulseCtr = 0;
  430.         break;

  431.     case WAITONE_STEP:                                                   /*  暫停一步                    */
  432.         GmRight.cState     = MOTOR_RUN;
  433.         break;
  434.     case MOTOR_RUN:                                                     /*  電機運行                    */
  435.         if (GucMouseState == GO_AHEAD) {                                /*  根據傳感器狀態微調電機位置  */
  436.             if (GucDistance[FRONTL] &&                                 /*  前左方有擋板                */\
  437.                (GucDistance[FRONTR]==0)) {                              /*  前右方無擋板                */
  438.                 if (ucCnt1 == 1) {
  439.                     GmRight.cState = WAITONE_STEP;                      /*  使下一步暫停                */
  440.                 }
  441.                 if (++ucCnt1 > 3) {                                     /*  3步暫停一步                 */
  442.                     ucCnt1 = 0;
  443.                 }
  444.             } else {
  445.                 ucCnt1 = 0;
  446.             }
  447.             if ((GucDistance[RIGHT] == 1) &&                           /*  右遠方有擋板               */\
  448.                (GucDistance[LEFT] == 0)) {                              /*  左方無擋板                  */
  449.                 if(ucCnt2 == 3) {
  450.                     GmRight.cState = WAITONE_STEP;                      /*  使下一步暫停                */
  451.                 }
  452.                 if (++ucCnt2 > 6) {                                     /*  6步暫停一步                 */
  453.                     ucCnt2 = 0;
  454.                 }
  455.             } else {
  456.                 ucCnt2  = 0;
  457.             }
  458.         }
  459.         rgtMtCtrl();                                                    /*  推動電機轉動一步            */
  460.         break;

  461.     default:
  462.         break;
  463.     }
  464.     /*
  465.      *  是否完成任務判斷
  466.      */
  467.     if (GmRight.cState != MOTOR_STOP) {
  468.         GmRight.ulPulseCtr++;                                           /*  運行脈沖計數                */
  469.         rgtMtSpeedCtrl();                                               /*  速度調節                    */
  470.         if (GmRight.ulPulseCtr >= GmRight.ulPulse) {
  471.             GmRight.cState      = MOTOR_STOP;
  472.             GmRight.ulPulseCtr  = 0;
  473.             GmRight.ulPulse     = 0;
  474.             GmRight.lSpeed      = 0;
  475.         }
  476.     }
  477. }

  478. /*********************************************************************************************************
  479. ** Function name:       irSend
  480. ** Descriptions:        紅外發射啟動函數
  481. ** input parameters:    ucIndex: 紅外發射索引號
  482. **                      ulFreq : 紅外載波頻率
  483. ** output parameters:   無
  484. ** Returned value:      無
  485. *********************************************************************************************************/
  486. void  irSend (INT8U ucIndex, INT32U ulFreq)
  487. {
  488.     switch (ucIndex) {
  489.     case FRONT_SIDE_PWM_INDEX:
  490.         PWM_RESET();
  491.         PWM_FRQ_SET(ulFreq);
  492.         FRONTSIDE_PWM_PULSE_SET(FPCLK / ulFreq / 2);
  493.         PWM_START();
  494.         FRONTSIDE_PWM_EN();
  495.         break;
  496.     case DIG_PWM_INDEX:
  497.         PWM_RESET();
  498.         PWM_FRQ_SET(ulFreq);
  499.         DIG_PWM_PULSE_SET(FPCLK / ulFreq / 2);
  500.         PWM_START();
  501.         DIG_PWM_EN();
  502.         break;
  503.     default:
  504.         break;
  505.     }
  506. }
  507. /*********************************************************************************************************
  508. ** Function name:       irCheck
  509. ** Descriptions:        紅外線傳感器檢測。
  510. ** input parameters:    無
  511. ** output parameters:   無
  512. ** Returned value:      無
  513. *********************************************************************************************************/
  514. void irCheck (void)
  515. {
  516.     static INT8U ucState = 0;
  517.     static INT32U ulIRCheck;
  518.    
  519.     switch (ucState) {
  520.     case 0:
  521.         irSend(FRONT_SIDE_PWM_INDEX, 32200);                            /*  探測左右兩側近距            */
  522.         irSend(DIG_PWM_INDEX, 35000);                                   /*  驅動斜角上的傳感器檢測      */
  523.         break;
  524.     case 1:
  525.         ulIRCheck = IR_READ();                                          /*  讀取傳感器狀態              */
  526.         FRONTSIDE_PWM_DIS();                                            /*  禁止PWM發生器2              */
  527.         DIG_PWM_DIS();                                                  /*  禁止PWM發生器1              */
  528.         
  529.         if (ulIRCheck & IR_SIDE_LFT) {
  530.             GucDistance[LEFT]   &= 0xfd;
  531.         } else {
  532.             GucDistance[LEFT]   |= 0x02;
  533.         }

  534.         if (ulIRCheck & IR_DIG_LFT) {
  535.             GucDistance[FRONTL]  = 0x00;
  536.         } else {
  537.             GucDistance[FRONTL]  = 0x01;
  538.         }
  539.         
  540.         if (ulIRCheck & IR_DIG_RGT) {
  541.             GucDistance[FRONTR]  = 0x00;
  542.         } else {
  543.             GucDistance[FRONTR]  = 0x01;
  544.         }
  545.         if (ulIRCheck & IR_SIDE_RGT) {
  546.             GucDistance[RIGHT]  &= 0xfd;
  547.         } else {
  548.             GucDistance[RIGHT]  |= 0x02;
  549.         }
  550.         break;
  551.     case 2:
  552.         irSend(FRONT_SIDE_PWM_INDEX, 36000);                            /*  驅動檢測左前右三個方向遠距  */
  553.         
  554.         break;
  555.     case 3:
  556.         ulIRCheck = IR_READ();                                          /*  讀取傳感器狀態              */
  557.         FRONTSIDE_PWM_DIS();                                            /*  禁止PWM發生器2              */
  558.         break;
  559.     case 4:
  560.         irSend(FRONT_SIDE_PWM_INDEX, 36000);                            /*  重復檢測左前右三個方向遠距  */
  561.         break;
  562.     case 5:
  563.         ulIRCheck &= IR_READ();                                         /*  讀取傳感器狀態              */
  564.         FRONTSIDE_PWM_DIS();                                            /*  禁止PWM發生器2              */

  565.         
  566.         if (ulIRCheck & IR_SIDE_LFT) {
  567.             GucDistance[LEFT]  &= 0xfe;
  568.         } else {
  569.             GucDistance[LEFT]  |= 0x01;
  570.         }
  571.         if (ulIRCheck & IR_FRONT) {
  572.             GucDistance[FRONT] &= 0xfe;
  573.         } else {
  574.             GucDistance[FRONT] |= 0x01;
  575.         }
  576.         if (ulIRCheck & IR_SIDE_RGT) {
  577.             GucDistance[RIGHT] &= 0xfe;
  578.         } else {
  579.             GucDistance[RIGHT] |= 0x01;
  580.         }
  581.         break;
  582.     default:
  583.         break;
  584.     }
  585.     if (++ucState >= 6) {
  586.         ucState = 0;
  587.     }
  588. }

  589. /*********************************************************************************************************
  590. ** Function name:       keyCheck
  591. ** Descriptions:        讀取按鍵
  592. ** input parameters:    無
  593. ** output parameters:   無
  594. ** Returned value:      true:  按鍵已按下
  595. **                      false: 按鍵未按下
  596. *********************************************************************************************************/
  597. BOOLEAN keyCheck (void)
  598. {
  599.     if (KEY_PRESS()) {                                                  /*  按鍵按下                    */
  600.         delayMs(10);                                                    /*  延時10ms消抖動              */
  601.         if (KEY_PRESS()) {                                              /*  按鍵按下                    */
  602.             delayMs(10);                                                /*  延時10ms消抖動              */
  603.             while(!KEY_PRESS());                                        /*  等待按鍵釋放                */
  604.             return (true);
  605.         }
  606.     }
  607.     return (false);
  608. }
  609. /*********************************************************************************************************
  610. ** Function name:       sysTickIsr
  611. ** Descriptions:        定時中斷掃描。
  612. ** input parameters:    無
  613. ** output parameters:   無
  614. ** Returned value:      無
  615. *********************************************************************************************************/
  616. void sysTickIsr(void)
  617. {
  618.     static INT32S lLft = 0, lRgt = 0;
  619.    
  620.     /*
  621.      *  如果左電機長時間停止,則斷電
  622.      */
  623.     if (GmLeft.cState == MOTOR_STOP) {
  624.         lLft++;
  625.     } else {
  626.         lLft = 0;
  627.     }
  628.     if (lLft >= 500) {
  629.         MT_LFT_OFF();
  630.     }
  631.     /*
  632.      *  如果右電機長時間停止,則斷電
  633.      */
  634.     if (GmRight.cState == MOTOR_STOP) {
  635.         lRgt++;
  636.     } else {
  637.         lRgt = 0;
  638.     }
  639.     if (lRgt >= 500) {
  640.         MT_RGT_OFF();
  641.     }
  642.     /*
  643.      *  紅外線檢測
  644.      */
  645.     irCheck();
  646. }
  647. /*********************************************************************************************************
  648. ** Function name:       sensorInit
  649. ** Descriptions:        傳感器控制初始化
  650. ** input parameters:    無
  651. ** output parameters:   無
  652. ** Returned value:      無
  653. *********************************************************************************************************/
  654. void  sensorInit (void)
  655. {
  656.     IR_PIN_MODE_IN();                                                   /* 紅外檢測引腳配置為輸入引腳   */
  657.    
  658.     PWM1TCR  = 0x02;                                                    /* 復位PWM1定時器               */
  659.     PWM1TC   = 0;                                                       /* 定時器設置為0                */
  660.     PWM1PR   = 0;                                                       /* 時鐘不分頻                   */
  661.     PWM1MCR  = 0x02;                                                    /* 設置PWMMR0匹配后復位PWMTC,  */
  662.                                                                         /* 并產生中斷標志               */
  663.     PWM1MR0  = FPCLK / 38000;                                           /* 38KHz頻率                    */
  664.     PWM1MR1  = FPCLK / 38000 / 2;
  665.     PWM1MR2  = FPCLK / 38000 / 2;

  666.     PWM1PCR  &= ~((1 << 9) | (1 << 10));                                /* 禁止輸出                     */
  667.     PWM1TCR  = 0x05;                                                    /* 啟動定時器                   */
  668. }
  669. /*********************************************************************************************************
  670. ** Function name:       stepMotorIint
  671. ** Descriptions:        步進電機控制初始化
  672. ** input parameters:    無
  673. ** output parameters:   無
  674. ** Returned value:      無
  675. *********************************************************************************************************/
  676. void stepMotorIint (void)
  677. {
  678.      INT32U n;
  679.      /*
  680.      *  設置驅動步進電機的八個I/O口為輸出模式
  681.      */
  682.      FIO1DIR |= (1 << 25) | (1 << 26) | (1 << 28) | (1 << 29);
  683.      FIO2DIR |= (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5);
  684.     /*
  685.      *  對左右電機轉動的位置初始化
  686.      */
  687.      MT_LFT_STEP1_SET();
  688.      MT_RGT_STEP1_SET();
  689.     /*
  690.      *  初始化加速/減速時定時器加載值的數據表
  691.      *  C0=F*sqrt(2/w) , W=1000時,sqrt(2/w) = 0.04472136
  692.      *  C1 = 0.4142*C0
  693.      */
  694.     GulAccelTable[0] = (INT32U)(FPCLK * 0.04472136);
  695.     GulAccelTable[1] = (INT32U)((unsigned long long)GulAccelTable[0] * 4142 / 10000);
  696.     for(n = 2; n < 300; n++) {
  697.         GulAccelTable[n] = GulAccelTable[n - 1] - (2 * GulAccelTable[n - 1] / (4 * n + 1));
  698.     }

  699.     /*
  700.      *  初始化定時器0,用來控制左電機的轉速
  701.      */
  702.     T0TCR  = 0x02;
  703.     T0IR   = 1;
  704.     T0CTCR = 0;
  705.     T0TC   = 0;
  706.     T0PR   = 0;
  707.     T0MR0  = GulAccelTable[0];                                          /* 裝載值                       */
  708.     T0MCR  = 0x03;                                                      /* 匹配后產生中斷               */
  709.    
  710.     zyIsrSet(NVIC_TIMER0, (unsigned long)timer0Isr, PRIO_THREE);        /* 設置中斷并使能               */
  711.     T0TCR  = 0x01;                                                      /* 啟動定時器0                  */                                /*  使能定時器0                 */
  712.    
  713.     /*
  714.      *  初始化定時器1,用來控制右電機的轉速
  715.      */
  716.     T1TCR  = 0x02;
  717. ……………………

  718. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
MicroMouse_高級實驗.zip (137.56 KB, 下載次數: 10)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一级做a爰片性色毛片16 | 精品国产一区二区三区成人影院 | 日韩精品a在线观看图片 | 亚洲天堂色 | 青青草免费在线视频 | 亚洲成人精品 | 日韩中文字幕av | 精品国产一区二区久久 | 日韩精品一区二区三区中文在线 | 99精品欧美一区二区三区 | 久久精品av | 毛片一区 | 中文字幕日韩在线 | 欧美国产日韩成人 | 欧美一区二区在线免费观看 | 精品久久国产 | 亚洲国产一区二区三区在线观看 | 日韩久久精品电影 | 国产精品99久久久久久动医院 | 最新日韩在线 | 91久久国产综合久久91精品网站 | 性天堂网| 久久国产成人精品国产成人亚洲 | 色婷婷亚洲国产女人的天堂 | 风间由美一区二区三区在线观看 | 日韩视频精品在线 | 免费视频一区 | 99精品国产一区二区三区 | 成人免费激情视频 | 欧美福利网站 | 精品国产欧美日韩不卡在线观看 | 中文字幕97| 亚洲成av人片在线观看 | www.se91| 精品国产乱码久久久久久丨区2区 | 国产精品久久久久久久久久了 | 欧美性大战久久久久久久蜜臀 | 一区二区三区高清在线观看 | 亚洲午夜精品一区二区三区他趣 | 日韩1区| 欧美中文字幕 |