找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2023|回复: 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 单片机教程网

快速回复 返回顶部 返回列表