找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3475|回复: 2
打印 上一主题 下一主题
收起左侧

电脑鼠程序 MicroMouse615上的无记忆功能的走迷宫实验

[复制链接]
跳转到指定楼层
楼主
ID:301154 发表于 2018-4-2 21:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个是我们电脑鼠的程序,可以用IAR下的流明诺瑞驱动库进行编译调试

单片机源程序如下:
  1. /****************************************Copyright (c)****************************************************
  2. **                               Guangzhou ZHIYUAN electronics Co.,LTD.
  3. **--------------File Info---------------------------------------------------------------------------------
  4. ** File Name:               main.c
  5. ** Last modified Date:      2008/02/14
  6. ** Last Version:            V1.00
  7. ** Description:             MicroMouse615上的无记忆功能的走迷宫实验
  8. **
  9. **--------------------------------------------------------------------------------------------------------
  10. ** Created By:              廖茂刚
  11. ** Created date:
  12. ** Version:
  13. ** Descriptions:
  14. **
  15. **--------------------------------------------------------------------------------------------------------
  16. ** Modified by:
  17. ** Modified date:
  18. ** Version:
  19. ** Description:
  20. **
  21. *********************************************************************************************************/


  22. /*********************************************************************************************************
  23.   包含头文件
  24. *********************************************************************************************************/
  25. #include "hw_memmap.h"
  26. #include "hw_ints.h"
  27. #include "hw_types.h"
  28. #include "interrupt.h"
  29. #include "gpio.h"
  30. #include "sysctl.h"
  31. #include "Systick.h"
  32. #include "Timer.h"
  33. #include "adc.h"
  34. #include "Pwm.h"
  35. #include "Type.h"
  36. #include "Zlg7289.h"


  37. /*********************************************************************************************************
  38.   PB端口定义
  39. *********************************************************************************************************/
  40. #define IRSEND_BEVEL       GPIO_PIN_0                                   /*  驱动斜角红外的调制信号      */

  41. #define LEFTSIDE           GPIO_PIN_1                                   /*  左方传感器输出的信号        */
  42. #define FRONTSIDE_L        GPIO_PIN_2                                   /*  左前方传感器输出的信号      */
  43. #define FRONTSIDE          GPIO_PIN_3                                   /*  前方传感器输出的信号        */
  44. #define FRONTSIDE_R        GPIO_PIN_4                                   /*  右前方传感器输出的信号      */
  45. #define RIGHTSIDE          GPIO_PIN_5                                   /*  右方传感器输出的信号        */


  46. /*********************************************************************************************************
  47.   PC端口定义
  48. *********************************************************************************************************/
  49. #define  KEY               GPIO_PIN_4                                   /*  按键连接的端口              */


  50. /*********************************************************************************************************
  51.   PD端口定义
  52. *********************************************************************************************************/
  53. #define  PHRA1             GPIO_PIN_0                                   /*  右侧步进电机的A1相          */
  54. #define  PHRA2             GPIO_PIN_1                                   /*  右侧步进电机的A2相          */
  55. #define  PHRB1             GPIO_PIN_2                                   /*  右侧步进电机的B1相          */
  56. #define  PHRB2             GPIO_PIN_3                                   /*  右侧步进电机的B2相          */
  57. #define  PHLA1             GPIO_PIN_4                                   /*  左侧步进电机的A1相          */
  58. #define  PHLA2             GPIO_PIN_5                                   /*  左侧步进电机的A2相          */
  59. #define  PHLB1             GPIO_PIN_6                                   /*  左侧步进电机的B1相          */
  60. #define  PHLB2             GPIO_PIN_7                                   /*  左侧步进电机的B2相          */


  61. /*********************************************************************************************************
  62.   PE端口定义
  63. *********************************************************************************************************/
  64. #define IRSEND_SIDE        GPIO_PIN_0                                   /*  驱动左前右正向红外发射      */


  65. /*********************************************************************************************************
  66.   常量宏定义 -- 迷宫类型
  67. *********************************************************************************************************/
  68. #define MAZETYPE           8                                            /*  8: 四分之一迷宫;16: 全迷宫 */


  69. /*********************************************************************************************************
  70.   常量宏定义--前进一个迷宫格步进电机需要走的步数
  71. *********************************************************************************************************/
  72. #define ONEBLOCK           125


  73. /*********************************************************************************************************
  74.   常量宏定义--电脑鼠状态
  75. *********************************************************************************************************/
  76. #define STOP               0                                            /*  电脑鼠停止                  */
  77. #define GOAHEAD            1                                            /*  电脑鼠前进                  */
  78. #define TURNLEFT           3                                            /*  电脑鼠向左转                */
  79. #define TURNRIGHT          4                                            /*  电脑鼠向右转                */
  80. #define TURNBACK           5                                            /*  电脑鼠向后转                */


  81. /*********************************************************************************************************
  82.   常量宏定义--传感器
  83. *********************************************************************************************************/
  84. #define LEFT               0                                            /*  左方传感器                  */
  85. #define FRONTL             1                                            /*  左前方传感器                */
  86. #define FRONT              2                                            /*  前方传感器                  */
  87. #define FRONTR             3                                            /*  右前方传感器                */
  88. #define RIGHT              4                                            /*  右方传感器                  */


  89. /*********************************************************************************************************
  90.   常量宏定义--电机状态
  91. *********************************************************************************************************/
  92. #define MOTORSTOP          0                                            /*  电机停止                    */
  93. #define WAITONESTEP        1                                            /*  电机暂停一步                */
  94. #define MOTORRUN           2                                            /*  电机运行                    */


  95. /*********************************************************************************************************
  96.   常量宏定义--电机运行方向
  97. *********************************************************************************************************/
  98. #define MOTORGOAHEAD       0                                            /*  电机前进                    */
  99. #define MOTORGOBACK        1                                            /*  电机后退                    */


  100. /*********************************************************************************************************
  101.   结构体定义
  102. *********************************************************************************************************/
  103. struct motor {
  104.     int8    cState;                                                     /*  电机运行状态                */
  105.     int8    cDir;                                                       /*  电机运行方向                */
  106.     uint32  uiPulse;                                                    /*  电机需要转动的步数          */
  107.     uint32  uiPulseCtr;                                                 /*  电机已转动的步数            */
  108.     int32   iSpeed;                                                     /*  电机转动速度                */
  109. };
  110. typedef struct motor MOTOR;


  111. /*********************************************************************************************************
  112.   定义全局变量
  113. *********************************************************************************************************/
  114. static MOTOR   GmRight  = {MOTORSTOP, MOTORGOAHEAD, 0, 0, 0};           /*  定义并初始化右电机状态      */
  115. static MOTOR   GmLeft   = {MOTORSTOP, MOTORGOAHEAD, 0, 0, 0};           /*  定义并初始化左电机状态      */
  116.                                                                         
  117. static uint8   GucMouseState       = STOP;                              /*  保存电脑鼠当前运行状态      */
  118. static uint32  GuiAccelTable[300]  = {0};                               /*  电机加减速各阶段定时器值    */
  119. static int32   GiMaxSpeed          = 70;                                /*  保存允许运行的最大速度      */
  120. static uint8   GucDistance[5]      = {0};                               /*  记录传感器状态              */


  121. /*********************************************************************************************************
  122. ** Function name:       delay
  123. ** Descriptions:        延时函数
  124. ** input parameters:    uiD :延时参数,值越大,延时越久
  125. ** output parameters:   无
  126. ** Returned value:      无
  127. *********************************************************************************************************/
  128. void delay (uint32  uiD)
  129. {
  130.     for (; uiD; uiD--);
  131. }


  132. /*********************************************************************************************************
  133. ** Function name:       rightMotorContr
  134. ** Descriptions:        右步进电机驱动时序
  135. ** input parameters:    无
  136. ** output parameters:   无
  137. ** Returned value:      无
  138. *********************************************************************************************************/
  139. void rightMotorContr (void)
  140. {
  141.     static int8 cStep = 0;                                              /*  保存电机当前位置            */
  142.    
  143.     switch (GmRight.cDir) {

  144.     case MOTORGOAHEAD:                                                  /*  向前步进                    */
  145.         cStep = (cStep + 1) % 8;
  146.         break;

  147.     case MOTORGOBACK:                                                   /*  向后步进                    */
  148.         cStep = (cStep + 7) % 8;
  149.         break;

  150.     default:
  151.         break;
  152.     }
  153.    
  154.     switch (cStep) {

  155.     case 0:                                                             /*  A2B2                        */
  156.         GPIOPinWrite(GPIO_PORTD_BASE,
  157.                      PHRA1 | PHRA2 | PHRB1 | PHRB2,
  158.                      PHRA1 | PHRA2 | PHRB1 | PHRB2);
  159.         break;

  160.     case 1:                                                             /*  A2                          */
  161.         GPIOPinWrite(GPIO_PORTD_BASE,
  162.                      PHRA1 | PHRA2 | PHRB1 | PHRB2,
  163.                      PHRA1 | PHRA2);
  164.         break;

  165.     case 2:                                                             /*  A2B1                        */
  166.         GPIOPinWrite(GPIO_PORTD_BASE,
  167.                      PHRA1 | PHRA2 | PHRB1 | PHRB2,
  168.                      PHRA1 | PHRA2 | PHRB2);
  169.         break;

  170.     case 3:                                                             /*  B1                          */
  171.         GPIOPinWrite(GPIO_PORTD_BASE,
  172.                      PHRA1 | PHRA2 | PHRB1 | PHRB2,
  173.                      PHRB2);
  174.         break;

  175.     case 4:                                                             /*  A1B1                        */
  176.         GPIOPinWrite(GPIO_PORTD_BASE,
  177.                      PHRA1 | PHRA2 | PHRB1 | PHRB2,
  178.                      PHRA2 | PHRB2);
  179.         break;

  180.     case 5:                                                             /*  A1                          */
  181.         GPIOPinWrite(GPIO_PORTD_BASE,
  182.                      PHRA1 | PHRA2 | PHRB1 | PHRB2,
  183.                      PHRA2);
  184.         break;

  185.     case 6:                                                             /*  A1B2                        */
  186.         GPIOPinWrite(GPIO_PORTD_BASE,
  187.                      PHRA1 | PHRA2 | PHRB1 | PHRB2,
  188.                      PHRA2 | PHRB1 | PHRB2);
  189.         break;

  190.     case 7:                                                             /*  B2                          */
  191.         GPIOPinWrite(GPIO_PORTD_BASE,
  192.                      PHRA1 | PHRA2 | PHRB1 | PHRB2,
  193.                      PHRB1 | PHRB2);
  194.         break;

  195.     default:
  196.         break;
  197.     }
  198. }


  199. /*********************************************************************************************************
  200. ** Function name:       leftMotorContr
  201. ** Descriptions:        左步进电机驱动时序
  202. ** input parameters:    GmLeft.cDir :电机运行方向
  203. ** output parameters:   无
  204. ** Returned value:      无
  205. *********************************************************************************************************/
  206. void leftMotorContr (void)
  207. {
  208.     static int8 cStep = 0;                                              /*  保存电机当前位置            */
  209.    
  210.     switch (GmLeft.cDir) {
  211.         
  212.     case MOTORGOAHEAD:                                                  /*  向前步进                    */
  213.         cStep = (cStep + 1) % 8;
  214.         break;
  215.         
  216.     case MOTORGOBACK:                                                   /*  向后步进                    */
  217.         cStep = (cStep + 7) % 8;
  218.         break;
  219.         
  220.     default:
  221.         break;
  222.     }
  223.    
  224.     switch (cStep) {

  225.     case 0:                                                             /*  A2B2                        */
  226.         GPIOPinWrite(GPIO_PORTD_BASE,
  227.                      PHLA1 | PHLA2 | PHLB1 | PHLB2,
  228.                      PHLA1 | PHLA2 | PHLB1 | PHLB2);
  229.         break;

  230.     case 1:                                                             /*  B2                          */
  231.         GPIOPinWrite(GPIO_PORTD_BASE,
  232.                      PHLA1 | PHLA2 | PHLB1 | PHLB2,
  233.                      PHLB1 | PHLB2);
  234.         break;

  235.     case 2:                                                             /*  A1B2                        */
  236.         GPIOPinWrite(GPIO_PORTD_BASE,
  237.                      PHLA1 | PHLA2 | PHLB1 | PHLB2,
  238.                      PHLA2 | PHLB1 | PHLB2);
  239.         break;

  240.     case 3:                                                             /*  A1                          */
  241.         GPIOPinWrite(GPIO_PORTD_BASE,
  242.                      PHLA1 | PHLA2 | PHLB1 | PHLB2,
  243.                      PHLA2);
  244.         break;

  245.     case 4:                                                             /*  A1B1                        */
  246.         GPIOPinWrite(GPIO_PORTD_BASE,
  247.                      PHLA1 | PHLA2 | PHLB1 | PHLB2,
  248.                      PHLA2 | PHLB2);
  249.         break;

  250.     case 5:                                                             /*  B1                          */
  251.         GPIOPinWrite(GPIO_PORTD_BASE,
  252.                      PHLA1 | PHLA2 | PHLB1 | PHLB2,
  253.                      PHLB2);
  254.         break;

  255.     case 6:                                                             /*  A2B1                        */
  256.         GPIOPinWrite(GPIO_PORTD_BASE,
  257.                      PHLA1 | PHLA2 | PHLB1 | PHLB2,
  258.                      PHLA1 | PHLA2 | PHLB2);
  259.         break;

  260.     case 7:                                                             /*  A2                          */
  261.         GPIOPinWrite(GPIO_PORTD_BASE,
  262.                      PHLA1 | PHLA2 | PHLB1 | PHLB2,
  263.                      PHLA1 | PHLA2);
  264.         break;

  265.     default:
  266.         break;
  267.     }
  268. }


  269. /*********************************************************************************************************
  270. ** Function name:       speedContrR
  271. ** Descriptions:        右电机速度调节
  272. ** input parameters:    无
  273. ** output parameters:   无
  274. ** Returned value:      无
  275. *********************************************************************************************************/
  276. void speedContrR (void)
  277. {
  278.     int32 iDPusle;
  279.    
  280.     iDPusle = GmRight.uiPulse - GmRight.uiPulseCtr;                     /*  统计电机还剩余的步数        */
  281.     if (iDPusle <= GmRight.iSpeed) {
  282.         GmRight.iSpeed--;
  283.     } else {                                                            /*  非减速区间,则加速到最大值  */
  284.         if (GmRight.iSpeed < GiMaxSpeed) {
  285.             GmRight.iSpeed++;
  286.         } else {
  287.             GmRight.iSpeed--;
  288.         }
  289.     }
  290.     if (GmRight.iSpeed < 0) {                                           /*  设置速度下限                */
  291.         GmRight.iSpeed = 0;
  292.     }
  293.     TimerLoadSet(TIMER0_BASE, TIMER_A, GuiAccelTable[GmRight.iSpeed]);  /*  设置定时时间                */
  294. }


  295. /*********************************************************************************************************
  296. ** Function name:       speedContrL
  297. ** Descriptions:        左电机速度调节
  298. ** input parameters:    无
  299. ** output parameters:   无
  300. ** Returned value:      无
  301. *********************************************************************************************************/
  302. void speedContrL (void)
  303. {
  304.     int32 iDPusle;
  305.    
  306.     iDPusle = GmLeft.uiPulse - GmLeft.uiPulseCtr;                       /*  统计电机还剩余的步数        */
  307.     if (iDPusle <= GmLeft.iSpeed) {
  308.         GmLeft.iSpeed--;
  309.     } else {                                                            /*  非减速区间,则加速到最大值  */
  310.         if (GmLeft.iSpeed < GiMaxSpeed) {
  311.             GmLeft.iSpeed++;
  312.         }
  313.     }
  314.     if (GmLeft.iSpeed < 0) {                                            /*  设置速度下限                */
  315.         GmLeft.iSpeed = 0;
  316.     }
  317.     TimerLoadSet(TIMER1_BASE,TIMER_A,GuiAccelTable[GmLeft.iSpeed]);     /*  设置定时时间                */
  318. }


  319. /*********************************************************************************************************
  320. ** Function name:       Timer0A_ISR
  321. ** Descriptions:        Timer0中断服务函数
  322. ** input parameters:    无
  323. ** output parameters:   无
  324. ** Returned value:      无
  325. *********************************************************************************************************/
  326. void Timer0A_ISR(void)
  327. {
  328.     static int8 n = 0,m = 0;
  329.    
  330.     TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);                     /*  清除定时器0中断。           */
  331.     switch (GmRight.cState) {
  332.         
  333.     case MOTORSTOP:                                                     /*  停止,同时清零速度和脉冲值  */
  334.         GmRight.iSpeed     = 0;
  335.         GmRight.uiPulse    = 0;
  336.         GmRight.uiPulseCtr = 0;
  337.         break;

  338.     case WAITONESTEP:                                                   /*  暂停一步                    */
  339.         GmRight.cState     = MOTORRUN;
  340.         break;

  341.     case MOTORRUN:                                                      /*  电机运行                    */
  342.         if (GucMouseState == GOAHEAD) {                                 /*  根据传感器状态微调电机位置  */
  343.             if (GucDistance[FRONTL] && (GucDistance[FRONTR] == 0)) {    /*  左前方有障碍,且前方无挡板  */
  344.                 if (n == 1) {
  345.                     GmRight.cState = WAITONESTEP;                       /*  下一次电机暂停              */
  346.                 }
  347.                 n++;
  348.                 n %= 2;
  349.             } else {
  350.                 n = 0;
  351.             }        
  352.             if ((GucDistance[RIGHT] == 1) && (GucDistance[LEFT] == 0)) {/*  离右挡板太远,且左方无挡板  */
  353.                 if(m == 3) {
  354.                     GmRight.cState = WAITONESTEP;                       /*  下一次电机暂停              */
  355.                 }
  356.                 m++;
  357.                 m %= 6;
  358.             } else {
  359.                 m  = 0;
  360.             }
  361.         }
  362.         rightMotorContr();                                              /*  推动电机转动一步            */
  363.         break;

  364.     default:
  365.         break;
  366.     }
  367.     /*
  368.      *  是否完成任务判断
  369.      */
  370.     if (GmRight.cState != MOTORSTOP) {
  371.         GmRight.uiPulseCtr++;                                           /*  运行脉冲计数                */
  372.         speedContrR();                                                  /*  速度调节                    */
  373.         if (GmRight.uiPulseCtr >= GmRight.uiPulse) {
  374.             GmRight.cState      = MOTORSTOP;
  375.             GmRight.uiPulseCtr  = 0;
  376.             GmRight.uiPulse     = 0;
  377.             GmRight.iSpeed      = 0;
  378.         }
  379.     }
  380. }


  381. /*********************************************************************************************************
  382. ** Function name:       Timer1A_ISR
  383. ** Descriptions:        Timer1中断服务函数
  384. ** input parameters:    GmLeft.cState :驱动步进电机的时序状态
  385. **                      GmLeft.cDir   :步进电机运动的方向
  386. ** output parameters:   无
  387. ** Returned value:      无
  388. *********************************************************************************************************/
  389. void Timer1A_ISR(void)
  390. {
  391.     static int8 n = 0, m = 0;
  392.    
  393.     TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT);                     /*  清除定时器1中断。           */
  394.     switch (GmLeft.cState) {
  395.         
  396.     case MOTORSTOP:                                                     /*  停止,同时清零速度和脉冲值  */
  397.         GmLeft.iSpeed     = 0;
  398.         GmLeft.uiPulse    = 0;
  399.         GmLeft.uiPulseCtr = 0;
  400.         break;
  401.         
  402.     case WAITONESTEP:                                                   /*  暂停一步                    */
  403.         GmLeft.cState     = MOTORRUN;
  404.         break;

  405.     case MOTORRUN:                                                      /*  电机运行                    */
  406.         if (GucMouseState == GOAHEAD) {                                 /*  根据传感器状态微调电机位置  */
  407.             if (GucDistance[FRONTR] &&(GucDistance[FRONTL]==0)) {
  408.                 if (n == 1) {
  409.                     GmLeft.cState = WAITONESTEP;
  410.                 }
  411.                 n++;
  412.                 n %= 2;
  413.             } else {
  414.                 n = 0;
  415.             }
  416.             if ((GucDistance[LEFT] == 1) && (GucDistance[RIGHT] == 0)) {
  417.                 if(m == 3) {
  418.                     GmLeft.cState = WAITONESTEP;
  419.                 }
  420.                 m++;
  421.                 m %= 6;
  422.             } else {
  423.                 m  = 0;
  424.             }
  425.         }
  426.         leftMotorContr();                                               /*  电机驱动程序                */
  427.         break;

  428.     default:
  429.         break;
  430.     }
  431.     /*
  432.      *  是否完成任务判断
  433.      */
  434.     if (GmLeft.cState != MOTORSTOP) {
  435.         GmLeft.uiPulseCtr++;                                            /*  运行脉冲计数                */
  436.         speedContrL();                                                  /*  速度调节                    */
  437.         if (GmLeft.uiPulseCtr >= GmLeft.uiPulse) {
  438.             GmLeft.cState      = MOTORSTOP;
  439.             GmLeft.uiPulseCtr  = 0;
  440.             GmLeft.uiPulse     = 0;
  441.             GmLeft.iSpeed      = 0;
  442.         }
  443.     }
  444. }


  445. /*********************************************************************************************************
  446. ** Function name:       irSendFreq
  447. ** Descriptions:        发送红外线。
  448. ** input parameters:    uiFreq:  红外线调制频率
  449. **                      cNumber: 选择需要设置的PWM模块
  450. ** output parameters:   无
  451. ** Returned value:      无
  452. *********************************************************************************************************/
  453. void irSendFreq (uint32  uiFreq, int8  cNumber)
  454. {
  455.     uiFreq = SysCtlClockGet() / uiFreq;
  456.     switch (cNumber) {

  457.     case 1:
  458.         PWMGenPeriodSet(PWM_BASE, PWM_GEN_1, uiFreq);                   /*  设置PWM发生器1的周期        */
  459.         PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, uiFreq / 2);              /*  设置PWM2输出的脉冲宽度      */
  460.         PWMGenEnable(PWM_BASE, PWM_GEN_1);                              /*  使能PWM发生器1              */
  461.         break;

  462.     case 2:
  463.         PWMGenPeriodSet(PWM_BASE, PWM_GEN_2, uiFreq);                   /*  设置PWM发生器2的周期        */
  464.         PWMPulseWidthSet(PWM_BASE, PWM_OUT_4, uiFreq / 2);              /*  设置PWM4输出的脉冲宽度      */
  465.         PWMGenEnable(PWM_BASE, PWM_GEN_2);                              /*  使能PWM发生器2              */
  466.         break;

  467.     default:
  468.         break;
  469.     }
  470. }


  471. /*********************************************************************************************************
  472. ** Function name:       irCheck
  473. ** Descriptions:        红外线传感器检测。
  474. ** input parameters:    无
  475. ** output parameters:   无
  476. ** Returned value:      无
  477. *********************************************************************************************************/
  478. void irCheck (void)
  479. {
  480.     static uint8 ucState = 0;
  481.     static uint8 ucIRCheck;
  482.    
  483.     switch (ucState) {

  484.     case 0:
  485.         irSendFreq(32200, 2);                                           /*  探测左右两侧近距            */
  486.         irSendFreq(35000, 1);                                           /*  驱动斜角上的传感器检测      */
  487.         break;
  488.         
  489.     case 1:
  490.         ucIRCheck = GPIOPinRead(GPIO_PORTB_BASE, 0x3e);                 /*  读取传感器状态              */
  491.         PWMGenDisable(PWM_BASE, PWM_GEN_2);                             /*  禁止PWM发生器2              */
  492.         PWMGenDisable(PWM_BASE, PWM_GEN_1);                             /*  禁止PWM发生器1              */
  493.         if (ucIRCheck & RIGHTSIDE) {
  494.             GucDistance[RIGHT]  &= 0xfd;
  495.         } else {
  496.             GucDistance[RIGHT]  |= 0x02;
  497.         }
  498.         if (ucIRCheck & LEFTSIDE) {
  499.             GucDistance[LEFT]   &= 0xfd;
  500.         } else {
  501.             GucDistance[LEFT]   |= 0x02;
  502.         }
  503.         if (ucIRCheck & FRONTSIDE_R) {
  504.             GucDistance[FRONTR]  = 0x00;
  505.         } else {
  506.             GucDistance[FRONTR]  = 0x01;
  507.         }
  508.         if (ucIRCheck & FRONTSIDE_L) {
  509.             GucDistance[FRONTL]  = 0x00;
  510.         } else {
  511.             GucDistance[FRONTL]  = 0x01;
  512.         }
  513.         break;

  514.     case 2:
  515.         irSendFreq(36000, 2);                                           /*  驱动检测左前右三个方向远距  */
  516.         break;
  517.         
  518.     case 3:
  519.         ucIRCheck = GPIOPinRead(GPIO_PORTB_BASE, 0x2a);                 /*  读取传感器状态              */
  520.         PWMGenDisable(PWM_BASE, PWM_GEN_2);                             /*  禁止PWM发生器2              */
  521.         break;

  522.     case 4:
  523.         irSendFreq(36000, 2);                                           /*  重复检测左前右三个方向远距  */
  524.         break;
  525.         
  526.     case 5:
  527.         ucIRCheck &= GPIOPinRead(GPIO_PORTB_BASE, 0x2a);                /*  读取传感器状态              */
  528.         PWMGenDisable(PWM_BASE, PWM_GEN_2);                             /*  禁止PWM发生器2              */
  529.         if (ucIRCheck & RIGHTSIDE) {
  530.             GucDistance[RIGHT] &= 0xfe;
  531.         } else {
  532.             GucDistance[RIGHT] |= 0x01;
  533.         }
  534.         if (ucIRCheck & LEFTSIDE) {
  535.             GucDistance[LEFT]  &= 0xfe;
  536.         } else {
  537.             GucDistance[LEFT]  |= 0x01;
  538.         }
  539.         if (ucIRCheck & FRONTSIDE) {
  540.             GucDistance[FRONT] &= 0xfe;
  541.         } else {
  542.             GucDistance[FRONT] |= 0x01;
  543.         }
  544.         break;

  545.     default:
  546.         break;
  547.     }
  548.     ucState = (ucState + 1) % 6;                                        /*  循环检测                    */
  549. }


  550. /*********************************************************************************************************
  551. ** Function name:       mazeSearch
  552. ** Descriptions:        迷宫搜索,若发现分支路或者前方有挡板则退出
  553. ** input parameters:    无
  554. ** output parameters:   无
  555. ** Returned value:      无
  556. *********************************************************************************************************/
  557. void mazeSearch(void)
  558. {
  559.     int8 cL = 0, cR = 0;
  560.     /*
  561.      *  设定运行任务
  562.      */
  563.     GucMouseState   = GOAHEAD;
  564.     GmRight.cDir    = MOTORGOAHEAD;
  565.     GmLeft.cDir     = MOTORGOAHEAD;
  566.     GmRight.uiPulse = MAZETYPE * ONEBLOCK;
  567.     GmLeft.uiPulse  = MAZETYPE * ONEBLOCK;
  568.     GmRight.cState  = MOTORRUN;
  569.     GmLeft.cState   = MOTORRUN;
  570.    
  571.     while (GmLeft.cState != MOTORSTOP) {
  572.         if (GucDistance[FRONT]) {                                       /*  前方有墙                    */
  573.             /*
  574.              *  设置继续前进的步数,以实现能停止在单元格中心的目的
  575.              */
  576.             GmRight.uiPulse = GmRight.uiPulseCtr + 70;
  577.             GmLeft.uiPulse  = GmLeft.uiPulseCtr  + 70;
  578.             /*
  579.              *  反复检测前方传感器的状态,以消除误判
  580.              */
  581.             while (GucDistance[FRONT]) {
  582.                 if ((GmLeft.uiPulseCtr + 50) > GmLeft.uiPulse) {
  583.                     goto End;                                           /*  跳出循环,跳到程序结束处    */
  584.                 }
  585.             }
  586.             /*
  587.              *  程序执行到此步表明出现误判,则重新设定电机运行任务
  588.              */            

  589.             GmRight.uiPulse = MAZETYPE * ONEBLOCK;
  590.             GmLeft.uiPulse  = MAZETYPE * ONEBLOCK;
  591.         }
  592.         if (cL) {                                                       /*  是否允许检测左边            */
  593.             if ((GucDistance[LEFT] & 0x01) == 0) {                      /*  左边有支路                  */
  594.                 /*
  595.                  *  设置继续前进的步数,以实现能停止在单元格中心的目的
  596.                  */
  597.                 GmRight.uiPulse = GmRight.uiPulseCtr + 74;
  598.                 GmLeft.uiPulse  = GmLeft.uiPulseCtr  + 74;
  599.                 /*
  600.                  *  反复检测前方传感器的状态,以消除误判
  601.                  */
  602.                 while ((GucDistance[LEFT] & 0x01) == 0) {
  603.                     if ((GmLeft.uiPulseCtr + 50) > GmLeft.uiPulse) {
  604.                         goto End;                                       /*  跳出循环,跳到程序结束处    */
  605.                     }
  606.                 }
  607.                 /*
  608.                  *  程序执行到此步表明出现误判,则重新设定电机运行任务
  609.                  */
  610.                 GmRight.uiPulse = MAZETYPE * ONEBLOCK;
  611.                 GmLeft.uiPulse  = MAZETYPE * ONEBLOCK;
  612.             }
  613.         } else {                                                        /*  左边有墙时开始允许检测左边  */
  614.             if ( GucDistance[LEFT] & 0x01) {
  615.                 cL = 1;
  616.             }
  617.         }
  618.         if (cR) {                                                       /*  是否允许检测右边            */
  619.             if ((GucDistance[RIGHT] & 0x01) == 0) {                     /*  右边有支路                  */
  620.                 /*
  621.                  *  设置继续前进的步数,以实现能停止在单元格中心的目的
  622.                  */
  623.                 GmRight.uiPulse = GmRight.uiPulseCtr + 74;
  624.                 GmLeft.uiPulse  = GmLeft.uiPulseCtr  + 74;
  625.                 /*
  626.                  *  反复检测前方传感器的状态,以消除误判
  627.                  */
  628.                 while ((GucDistance[ RIGHT] & 0x01) == 0) {
  629.                     if ((GmLeft.uiPulseCtr + 50) > GmLeft.uiPulse) {
  630.                         goto End;                                       /*  跳出循环,跳到程序结束处    */
  631.                     }
  632.                 }
  633.                 /*
  634.                  *  程序执行到此步表明出现误判,则重新设定电机运行任务
  635.                  */
  636.                 GmRight.uiPulse = MAZETYPE * ONEBLOCK;
  637.                 GmLeft.uiPulse  = MAZETYPE * ONEBLOCK;
  638.             }
  639.         } else {
  640.             if ( GucDistance[RIGHT] & 0x01) {                           /*  右边有墙时开始允许检测右边  */
  641.                 cR = 1;
  642.             }
  643.         }
  644.     }
  645. End:;
  646. }


  647. /*********************************************************************************************************
  648. ** Function name:       mouseTurnright
  649. ** Descriptions:        右转
  650. ** input parameters:    无
  651. ** output parameters:   无
  652. ** Returned value:      无
  653. *********************************************************************************************************/
  654. void mouseTurnright(void)
  655. {
  656.     /*
  657.      *  等待停止
  658.      */
  659.     while (GmLeft.cState  != MOTORSTOP);
  660.     while (GmRight.cState != MOTORSTOP);
  661.    
  662.     GucMouseState   = TURNRIGHT;                                        /*  标记电脑鼠的运行状态        */
  663.     /*
  664.      *  开始右转
  665.      */
  666.     GmRight.cDir    = MOTORGOBACK;                                      /*  控制右轮向后转动            */
  667.     GmRight.uiPulse = 41;                                               /*  设定右轮转动的步数          */
  668.    
  669.     GmLeft.cDir     = MOTORGOAHEAD;                                     /*  控制左轮向前转动            */
  670.     GmLeft.uiPulse  = 41;                                               /*  设定左轮转动的步数          */
  671.    
  672.     GmRight.cState  = MOTORRUN;                                         /*  使能右轮转动                */
  673.     GmLeft.cState   = MOTORRUN;                                         /*  使能左轮转动                */
  674.     /*
  675.      *  等待右转完成
  676.      */
  677.     while (GmLeft.cState  != MOTORSTOP);
  678.     while (GmRight.cState != MOTORSTOP);
  679. }


  680. /*********************************************************************************************************
  681. ** Function name:       mouseTurnleft
  682. ** Descriptions:        左转
  683. ** input parameters:    无
  684. ** output parameters:   无
  685. ** Returned value:      无
  686. *********************************************************************************************************/
  687. void mouseTurnleft(void)
  688. {
  689.     /*
  690.      *  等待停止
  691.      */
  692.     while (GmLeft.cState  != MOTORSTOP);
  693.     while (GmRight.cState != MOTORSTOP);
  694.    
  695.     GucMouseState   = TURNLEFT;                                         /*  标记电脑鼠的运行状态        */
  696.     /*
  697.      *  开始左转
  698.      */
  699.     GmRight.cDir    = MOTORGOAHEAD;                                     /*  控制右轮向前转动            */
  700.     GmRight.uiPulse = 41;                                               /*  设定右轮转动的步数          */
  701.    
  702.     GmLeft.cDir     = MOTORGOBACK;                                      /*  控制左轮向后转动            */
  703.     GmLeft.uiPulse  = 41;                                               /*  设定左轮转动的步数          */
  704.    
  705.     GmRight.cState  = MOTORRUN;                                         /*  使能右轮转动                */
  706.     GmLeft.cState   = MOTORRUN;                                         /*  使能左轮转动                */
  707.     /*
  708.      *  等待左转完成
  709.      */
  710.     while (GmLeft.cState  != MOTORSTOP);
  711.     while (GmRight.cState != MOTORSTOP);
  712. }


  713. /*********************************************************************************************************
  714. ** Function name:       mouseTurnback
  715. ** Descriptions:        后转
  716. ** input parameters:    无
  717. ** output parameters:   无
  718. ** Returned value:      无
  719. *********************************************************************************************************/
  720. void mouseTurnback(void)
  721. {
  722.     /*
  723.      *  等待停止
  724.      */
  725.     while (GmLeft.cState  != MOTORSTOP);
  726.     while (GmRight.cState != MOTORSTOP);
  727.    
  728.     GucMouseState   = TURNBACK;
  729.     /*
  730.      *  开始后转
  731.      */
  732.     GmRight.cDir    = MOTORGOBACK;
  733.     GmRight.uiPulse = 81;
  734.    
  735.     GmLeft.cDir     = MOTORGOAHEAD;
  736.     GmLeft.uiPulse  = 81;
  737.    
  738.     GmLeft.cState   = MOTORRUN;
  739.     GmRight.cState  = MOTORRUN;
  740.     /*
  741.      *  等待后转完成
  742.      */
  743.     while (GmLeft.cState  != MOTORSTOP);
  744.     while (GmRight.cState != MOTORSTOP);
  745. }


  746. /*********************************************************************************************************
  747. ** Function name:       keyCheck
  748. ** Descriptions:        读取按键
  749. ** input parameters:    无
  750. ** output parameters:   无
  751. ** Returned value:      true:  按键已按下
  752. **                      false: 按键未按下
  753. *********************************************************************************************************/
  754. uint8 keyCheck (void)
  755. {
  756.     if (GPIOPinRead(GPIO_PORTC_BASE, KEY) == 0) {
  757.         delay(50);
  758.         while(GPIOPinRead(GPIO_PORTC_BASE, KEY) == 0);
  759.         return(true);
  760.     }else {
  761.         return(false);
  762.     }
  763. }


  764. /*********************************************************************************************************
  765. ** Function name:       SysTick_ISR
  766. ** Descriptions:        定时中断扫描。
  767. ** input parameters:    无
  768. ** output parameters:   无
  769. ** Returned value:      无
  770. *********************************************************************************************************/
  771. void SysTick_ISR(void)
  772. {
  773.     static int32 iL = 0, iR = 0;
  774.    
  775.     /*
  776.      *  如果左电机长时间停止,则断电
  777.      */
  778.     if (GmLeft.cState == MOTORSTOP) {
  779.         iL++;
  780.     } else {
  781.         iL = 0;
  782.     }
  783.     if (iL >= 500) {
  784.         GPIOPinWrite(GPIO_PORTD_BASE,
  785.                      PHLA1 | PHLA2 | PHLB1 | PHLB2,
  786.                      0x00);
  787.     }
  788.     /*
  789.      *  如果右电机长时间停止,则断电
  790.      */
  791.     if (GmRight.cState == MOTORSTOP) {
  792.         iR++;
  793.     } else {
  794.         iR = 0;
  795.     }
  796.     if (iR >= 500) {
  797.         GPIOPinWrite(GPIO_PORTD_BASE,
  798.                      PHRA1 | PHRA2 | PHRB1 | PHRB2,
  799.                      0x00);
  800.     }
  801.     /*
  802.      *  红外线检测
  803.      */
  804.     irCheck();
  805. }


  806. /*********************************************************************************************************
  807. ** Function name:       wallCheck
  808. ** Descriptions:        根据传感器检测结果判断是否存在墙壁
  809. ** input parameters:    无
  810. ** output parameters:   无
  811. ** Returned value:      ucWall: 低三位从左到右一次代表左前右。1为有墙,0为没墙。
  812. *********************************************************************************************************/
  813. uint8 wallCheck (void)
  814. {
  815.     uint8 ucWall = 0;
  816.    
  817.     if (GucDistance[LEFT]  & 0x01) {
  818.         ucWall |=  0x04;
  819.     }else {
  820.         ucWall &= ~0x04;
  821.     }
  822.     if (GucDistance[FRONT] & 0x01) {
  823.         ucWall |=  0x02;
  824.     }else {
  825.         ucWall &= ~0x02;
  826.     }
  827.     if (GucDistance[RIGHT] & 0x01) {
  828.         ucWall |=  0x01;
  829.     }else {
  830.         ucWall &= ~0x01;
  831.     }
  832.     return(ucWall);
  833. }


  834. /*********************************************************************************************************
  835. ** Function name:       voltageDetect
  836. ** Descriptions:        电压检测,检测结果在7289 EX BOARD 上显示出来
  837. ** input parameters:    无
  838. ** output parameters:   无
  839. ** Returned value:      无
  840. *********************************************************************************************************/
  841. void voltageDetect (void)
  842. {
  843.     unsigned long ulVoltage;
  844.    
  845.     ADCProcessorTrigger(ADC_BASE, 0);                                   /*  处理器触发一次A/D转换       */
  846.     while (!ADCIntStatus(ADC_BASE, 0, false));                          /*  等待转换结束                */
  847.     ADCIntClear(ADC_BASE, 0);                                           /*  清除中断标准位              */
  848.     ADCSequenceDataGet(ADC_BASE, 0, &ulVoltage);                        /*  读取转换结果                */
  849.    
  850.     ulVoltage = ulVoltage * 3000 / 1023;                                /*  计算实际检测到的电压值(mV)  */
  851.     ulVoltage = ulVoltage * 3 + 350;                                    /*  计算电池电压值(mV)          */
  852.    
  853.     zlg7289Download(0,6,1,(ulVoltage % 10000) / 1000);                  /*  显示电压值整数部分,单位V   */
  854.     zlg7289Download(0,7,0,(ulVoltage % 1000 ) / 100 );                  /*  显示电压值小数部分,单位V   */
  855. }


  856. /*********************************************************************************************************
  857. ** Function name:       sensorInit
  858. ** Descriptions:        传感器控制初始化
  859. ** input parameters:    无
  860. ** output parameters:   无
  861. ** Returned value:      无
  862. *********************************************************************************************************/
  863. void sensorInit (void)
  864. {
  865.     /*
  866.      *  设置连接到传感器信号输出脚的I/O口为输入模式
  867.      */
  868.     GPIODirModeSet(GPIO_PORTB_BASE,
  869.                    LEFTSIDE    |
  870.                    FRONTSIDE_L |
  871.                    FRONTSIDE   |
  872.                    FRONTSIDE_R |
  873.                    RIGHTSIDE,  
  874.                    GPIO_DIR_MODE_IN);
  875.     /*
  876.      *  用PWM驱动红外线发射头产生调制的红外线信号
  877.      */
  878.     SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM);                          /*  使能PWM模块                 */
  879.     SysCtlPWMClockSet(SYSCTL_PWMDIV_1);                                 /*  PWM时钟配置:不分频         */
  880.     /*
  881.      *  初始化PWM2,该PWM驱动斜角红外发射头
  882.      */
  883.     GPIOPinTypePWM(GPIO_PORTB_BASE, IRSEND_BEVEL);                      /*  PB0配置为PWM功能            */
  884.     PWMGenConfigure(PWM_BASE, PWM_GEN_1,                                /*  配置PWM发生器1              */
  885.                     PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);       /*  加计数,立即更新            */

  886.     PWMOutputState(PWM_BASE, PWM_OUT_2_BIT, true);                      /*  使能PWM2输出                */
  887.     PWMGenDisable(PWM_BASE, PWM_GEN_1);                                 /*  禁止PWM发生器1              */
  888.     /*
  889.      *  初始化PWM4,该PWM驱动左前右正方向红外发射头
  890.      */
  891.     GPIOPinTypePWM(GPIO_PORTE_BASE, IRSEND_SIDE);                       /*  PE0配置为PWM功能            */
  892.     PWMGenConfigure(PWM_BASE, PWM_GEN_2,                                /*  配置PWM发生器2              */
  893.                     PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);       /*  加计数,立即更新            */

  894.     PWMOutputState(PWM_BASE, PWM_OUT_4_BIT, true);                      /*  使能PWM4输出                */
  895.     PWMGenDisable(PWM_BASE, PWM_GEN_2);                                 /*  禁止PWM发生器2              */
  896. }


  897. /*********************************************************************************************************
  898. ** Function name:       stepMotorIint
  899. ** Descriptions:        步进电机控制初始化
  900. ** input parameters:    无
  901. ** output parameters:   无
  902. ** Returned value:      无
  903. *********************************************************************************************************/
  904. void stepMotorIint (void)
  905. {
  906.     uint16 n = 0;
  907.     /*
  908.      *  设置驱动步进电机的八个I/O口为输出模式
  909.      */
  910.     GPIODirModeSet(GPIO_PORTD_BASE,
  911.                    PHRA1 |
  912.                    PHRA2 |
  913.                    PHRB1 |
  914.                    PHRB2 |
  915.                    PHLA1 |
  916.                    PHLA2 |
  917.                    PHLB1 |
  918.                    PHLB2,
  919.                    GPIO_DIR_MODE_OUT);
  920.     /*
  921.      *  对左右电机转动的位置初始化
  922.      */
  923.     GPIOPinWrite(GPIO_PORTD_BASE,
  924.                  PHRA1 | PHRA2 | PHRB1 | PHRB2,
  925.                  PHRA1 | PHRA2 | PHRB1 | PHRB2);
  926.    
  927.     GPIOPinWrite(GPIO_PORTD_BASE,
  928.                  PHLA1 | PHLA2 | PHLB1 | PHLB2,
  929.                  PHLA1 | PHLA2 | PHLB1 | PHLB2);
  930.     /*
  931.      *  初始化加速/减速时定时器加载值的数据表
  932.      */
  933.     GuiAccelTable[0] = 2236068;
  934.     GuiAccelTable[1] = 926179;
  935.     for(n = 2; n < 300; n++) {
  936.         GuiAccelTable[n] = GuiAccelTable[n - 1] - (2 * GuiAccelTable[n - 1] / (4 * n + 1));
  937.     }
  938.     /*
  939.      *  初始化定时器0,用来控制右电机的转速
  940.      */
  941.     SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);                       /*  使能定时器0模块             */
  942.     TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);                  /*  配置为32位周期计数模式      */
  943.     TimerLoadSet(TIMER0_BASE, TIMER_A, GuiAccelTable[0]);               /*  设置定时时间                */
  944.     TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);                    /*  设置为溢出中断              */

  945.     IntEnable(INT_TIMER0A);                                             /*  使能定时器0中断             */
  946.     TimerEnable(TIMER0_BASE, TIMER_A);                                  /*  使能定时器0                 */
  947.    
  948.     /*
  949.      *  初始化定时器1,用来控制电机的转速
  950.      */
  951.     SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);                       /*  使能定时器1模块             */
  952.     TimerConfigure(TIMER1_BASE, TIMER_CFG_32_BIT_PER);                  /*  配置为32位周期计数模式      */
  953.     TimerLoadSet(TIMER1_BASE, TIMER_A, GuiAccelTable[0]);               /*  设置定时时间                */
  954.     TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT);                    /*  设置为溢出中断              */

  955.     IntEnable(INT_TIMER1A);                                             /*  使能定时器1中断             */
  956.     TimerEnable(TIMER1_BASE, TIMER_A);                                  /*  使能定时器1                 */
  957. }


  958. /*********************************************************************************************************
  959. ** Function name:       keyInit
  960. ** Descriptions:        对连接按键的GPIO口初始化
  961. ** input parameters:    无
  962. ** output parameters:   无
  963. ** Returned value:      无
  964. *********************************************************************************************************/
  965. void keyInit (void)
  966. {
  967.     GPIODirModeSet(GPIO_PORTC_BASE, KEY, GPIO_DIR_MODE_IN);             /*  设置按键口为输入            */
  968. }


  969. /*********************************************************************************************************
  970. ** Function name:       sysTickInit
  971. ** Descriptions:        系统节拍定时器初始化。
  972. ** input parameters:    无
  973. ** output parameters:   无
  974. ** Returned value:      无
  975. *********************************************************************************************************/
  976. void sysTickInit (void)
  977. {
  978.     SysTickPeriodSet(SysCtlClockGet() / 1600);                          /*  设置定时时钟为625us         */
  979.     SysTickEnable();                                                    /*  使能系统时钟                */
  980.     SysTickIntEnable();                                                 /*  使能系统时钟中断            */
  981. ……………………

  982. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
电脑鼠程序.rar (74.78 KB, 下载次数: 35)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:333550 发表于 2019-5-16 21:09 | 只看该作者
感谢楼主的分享,最近正好需要
回复

使用道具 举报

板凳
ID:652227 发表于 2019-11-29 11:06 | 只看该作者
非常不错的东东,感谢楼主的分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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