⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 电子鼠走迷宫无记忆源码----------------
💻 C
📖 第 1 页 / 共 4 页
字号:
        iL = 0;
    }
    if (iL >= 500) {
        GPIOPinWrite(GPIO_PORTD_BASE,
                     PHLA1 | PHLA2 | PHLB1 | PHLB2,
                     0x00);
    }
    /*
     *  如果右电机长时间停止,则断电
     */
    if (GmRight.cState == MOTORSTOP) {
        iR++;
    } else {
        iR = 0;
    }
    if (iR >= 500) {
        GPIOPinWrite(GPIO_PORTD_BASE,
                     PHRA1 | PHRA2 | PHRB1 | PHRB2,
                     0x00);
    }
    /*
     *  红外线检测
     */
    irCheck();
}


/*********************************************************************************************************
** Function name:       wallCheck
** Descriptions:        根据传感器检测结果判断是否存在墙壁
** input parameters:    无
** output parameters:   无
** Returned value:      ucWall: 低三位从左到右一次代表左前右。1为有墙,0为没墙。
*********************************************************************************************************/
uint8 wallCheck (void)
{
    uint8 ucWall = 0;
    
    if (GucDistance[LEFT]  & 0x01) {
        ucWall |=  0x04;
    }else {
        ucWall &= ~0x04;
    }
    if (GucDistance[FRONT] & 0x01) {
        ucWall |=  0x02;
    }else {
        ucWall &= ~0x02;
    }
    if (GucDistance[RIGHT] & 0x01) {
        ucWall |=  0x01;
    }else {
        ucWall &= ~0x01;
    }
    return(ucWall);
}


/*********************************************************************************************************
** Function name:       sensorInit
** Descriptions:        传感器控制初始化
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void sensorInit (void)
{
    /*
     *  设置连接到传感器信号输出脚的I/O口为输入模式
     */
    GPIODirModeSet(GPIO_PORTB_BASE,
                   LEFTSIDE    |
                   FRONTSIDE_L |
                   FRONTSIDE   |
                   FRONTSIDE_R |
                   RIGHTSIDE,  
                   GPIO_DIR_MODE_IN);
    /*
     *  用PWM驱动红外线发射头产生调制的红外线信号
     */
    SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM);                          /*  使能PWM模块                 */
    SysCtlPWMClockSet(SYSCTL_PWMDIV_1);                                 /*  PWM时钟配置:不分频         */
    /*
     *  初始化PWM2,该PWM驱动斜角红外发射头
     */
    GPIOPinTypePWM(GPIO_PORTB_BASE, IRSEND_BEVEL);                      /*  PB0配置为PWM功能            */
    PWMGenConfigure(PWM_BASE, PWM_GEN_1,                                /*  配置PWM发生器1              */
                    PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);       /*  加计数,立即更新            */

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

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


/*********************************************************************************************************
** Function name:       stepMotorIint
** Descriptions:        步进电机控制初始化
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void stepMotorIint (void)
{
    uint16 n = 0;
    /*
     *  设置驱动步进电机的八个I/O口为输出模式
     */
    GPIODirModeSet(GPIO_PORTD_BASE,
                   PHRA1 |
                   PHRA2 |
                   PHRB1 |
                   PHRB2 |
                   PHLA1 |
                   PHLA2 |
                   PHLB1 |
                   PHLB2,
                   GPIO_DIR_MODE_OUT);
    /*
     *  对左右电机转动的位置初始化
     */
    GPIOPinWrite(GPIO_PORTD_BASE,
                 PHRA1 | PHRA2 | PHRB1 | PHRB2,
                 PHRA1 | PHRA2 | PHRB1 | PHRB2);
    
    GPIOPinWrite(GPIO_PORTD_BASE,
                 PHLA1 | PHLA2 | PHLB1 | PHLB2,
                 PHLA1 | PHLA2 | PHLB1 | PHLB2);
    /*
     *  初始化加速/减速时定时器加载值的数据表
     */
    GuiAccelTable[0] = 2236068;
    GuiAccelTable[1] = 926179;
    for(n = 2; n < 300; n++) {
        GuiAccelTable[n] = GuiAccelTable[n - 1] - (2 * GuiAccelTable[n - 1] / (4 * n + 1));
    }
    /*
     *  初始化定时器0,用来控制右电机的转速
     */
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);                       /*  使能定时器0模块             */
    TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);                  /*  配置为32位周期计数模式      */
    TimerLoadSet(TIMER0_BASE, TIMER_A, GuiAccelTable[0]);               /*  设置定时时间                */
    TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);                    /*  设置为溢出中断              */

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

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


/*********************************************************************************************************
** Function name:       keyInit
** Descriptions:        对连接按键的GPIO口初始化
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void keyInit (void)
{
    GPIODirModeSet(GPIO_PORTC_BASE, KEY, GPIO_DIR_MODE_IN);             /*  设置按键口为输入            */
}


/*********************************************************************************************************
** Function name:       sysTickInit
** Descriptions:        系统节拍定时器初始化。
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void sysTickInit (void)
{
    SysTickPeriodSet(SysCtlClockGet() / 1600);                          /*  设置定时时钟为625us         */
    SysTickEnable();                                                    /*  使能系统时钟                */
    SysTickIntEnable();                                                 /*  使能系统时钟中断            */
}


/*********************************************************************************************************
** Function name:       SensorDebug
** Descriptions:        用数码管显示出传感器状态,方便调试
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void sensorDebug (void)
{
    zlg7289Download(2, 0, 0, GucDistance[LEFT  ]);
    zlg7289Download(2, 1, 0, GucDistance[FRONTL]);
    zlg7289Download(2, 2, 0, GucDistance[FRONT ]);
    zlg7289Download(2, 3, 0, GucDistance[FRONTR]);    
    zlg7289Download(2, 4, 0, GucDistance[RIGHT ]);    
}


/*********************************************************************************************************
** Function name:       main
** Descriptions:        主函数
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
main (void)
{
    uint8 ucWall;
    SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                    SYSCTL_XTAL_6MHZ );                                 /*  使能PLL,50M                */

    SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOB );                      /*  使能GPIO B口外设            */
    SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOC );                      /*  使能GPIO C口外设            */
    SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOD );                      /*  使能GPIO D口外设            */
    SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOE );                      /*  使能GPIO E口外设            */

    zlg7289Init();                                                      /*  显示模块初始化              */
    keyInit();                                                          /*  按键初始化                  */
    sysTickInit();                                                      /*  系统时钟初始化              */
    sensorInit();                                                       /*  传感器初始化                */
    stepMotorIint();                                                    /*  步进电机初始化              */

    while (keyCheck() == false) {                                       /*  等待按键                    */
        delay(20000);
        sensorDebug();                                                  /*  传感器状态显示              */
    }

    zlg7289Reset();                                                     /*  复位数码显示                */
    
    while(1){
        
        ucWall = wallCheck();                                           /*  检测挡板信息                */
        
        switch (ucWall) {
            
        case 0x00:                                                      /*  三边都没有挡板,右转弯      */
            mouseTurnright();
            break;
            
        case 0x01:                                                      /*  只有右边存在挡板,不转弯    */
            break;
            
        case 0x02:                                                      /*  只有前边存在挡板,右转弯    */
            mouseTurnright();
            break;
            
        case 0x03:                                                      /*  只有左边没有挡板,左转弯    */
            mouseTurnleft();
            break;
            
        case 0x04:                                                      /*  只有左边存在挡板,右转弯    */
            mouseTurnright();
            break;
            
        case 0x05:                                                      /*  只有前边没有挡板,不转弯    */
            break;
            
        case 0x06:                                                      /*  只有右边没有挡板,右转弯    */
            mouseTurnright();
            break;
            
        case 0x07:                                                      /*  三边都存在挡板,向后转      */
            mouseTurnback();
            break;
            
        default:
            break;
        }
        mazeSearch();                                                   /*  搜索前进                    */
    }
}


/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -