MicroMouse源程序如下:
- /****************************************Copyright (c)****************************************************
- ** Guangzhou ZHIYUAN electronics Co.,LTD.
- **
- **
- **--------------File Info---------------------------------------------------------------------------------
- ** File name: main.c
- ** Last modified Date: 2011-03-11
- ** Last Version: V1.01
- ** Descriptions: The main() function example template
- **
- **--------------------------------------------------------------------------------------------------------
- ** Created by: 廖茂刚
- ** Created date: 2008-02-14
- ** Version: V1.00
- ** Descriptions: MicroMouse615上的无记忆功能的走迷宫实验
- **
- **--------------------------------------------------------------------------------------------------------
- ** Modified by: FanLinyun
- ** Modified date: 2011-03-11
- ** Version: V1.01
- ** Descriptions: 移植到MicroMouse1752上
- **
- ** Rechecked by:
- *********************************************************************************************************/
- #include "..\config.h"
- /*********************************************************************************************************
- 按键宏定义
- *********************************************************************************************************/
- #define KEY (1 << 6) /* 按键连接的端口 */
- #define KEY_PRESS() (!(FIO2PIN & KEY)) /* 按键是否按下判断 */
- /*********************************************************************************************************
- IR相关宏定义
- *********************************************************************************************************/
- #define IR_SIDE_LFT (1ul << 0) /* 左方传感器输出的信号 */
- #define IR_DIG_LFT (1ul << 1) /* 左前方传感器输出的信号 */
- #define IR_FRONT (1ul << 4) /* 前方传感器输出的信号 */
- #define IR_DIG_RGT (1ul << 8) /* 右前方传感器输出的信号 */
- #define IR_SIDE_RGT (1ul << 9) /* 右方传感器输出的信号 */
- #define FRONT_SIDE_PWM_INDEX 1 /* 左前右驱动传感器PWM索引号 */
- #define DIG_PWM_INDEX 2 /* 左前右前驱动传感器PWM索引号 */
- #define PWM_RESET() PWM1TCR = 0x02 /* PWM复位 */
- #define PWM_START() PWM1TCR = 0x05 /* PWM使能 */
- #define PWM_FRQ_SET(x) PWM1MR0 = (FPCLK / (x)) /* PWM频率设置 */
- #define FRONTSIDE_PWM_PULSE_SET(x) PWM1MR2 = (x) /* 左前右PWM占空比设置 */
- #define DIG_PWM_PULSE_SET(x) PWM1MR1 = (x) /* 左前右前PWM占空比设置 */
- #define FRONTSIDE_PWM_EN() PWM1PCR |= (1 << 10) /* 左前右PWM输出使能 */
- #define DIG_PWM_EN() PWM1PCR |= (1 << 9) /* 左前右前PWM输出使能 */
- #define FRONTSIDE_PWM_DIS() PWM1PCR &= ~(1 << 10) /* 左前右PWM输出禁能 */
- #define DIG_PWM_DIS() PWM1PCR &= ~(1 << 9) /* 左前右前PWM输出禁能 */
- #define IR_PIN_MODE_IN() FIO1DIR &= /* 配置传感器检测引脚为输入 */\
- ~(IR_SIDE_LFT | IR_DIG_LFT | IR_FRONT | IR_DIG_RGT | IR_SIDE_RGT)
- #define IR_READ() FIO1PIN /* 红外信号读取 */
- /*********************************************************************************************************
- 电机相关宏定义
- *********************************************************************************************************/
- /*
- * 左电机接口
- */
- #define MT_LFT_A1 (1 << 2)
- #define MT_LFT_A2 (1 << 3)
- #define MT_LFT_B1 (1 << 4)
- #define MT_LFT_B2 (1 << 5)
- /*
- * 右电机接口
- */
- #define MT_RGT_A1 (1 << 25)
- #define MT_RGT_A2 (1 << 26)
- #define MT_RGT_B1 (1 << 28)
- #define MT_RGT_B2 (1 << 29)
- /*
- * 左电机拍数宏定义
- */
- #define MT_LFT_OFF() FIO2CLR = (MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2)
- #define MT_LFT_STEP1_SET() FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2; \
- FIO2SET = MT_LFT_A1
- #define MT_LFT_STEP2_SET() FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2; \
- FIO2SET = MT_LFT_A1 | MT_LFT_B1
- #define MT_LFT_STEP3_SET() FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2; \
- FIO2SET = MT_LFT_B1
- #define MT_LFT_STEP4_SET() FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2; \
- FIO2SET = MT_LFT_A2 | MT_LFT_B1
- #define MT_LFT_STEP5_SET() FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2; \
- FIO2SET = MT_LFT_A2
- #define MT_LFT_STEP6_SET() FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2; \
- FIO2SET = MT_LFT_A2 | MT_LFT_B2
- #define MT_LFT_STEP7_SET() FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2; \
- FIO2SET = MT_LFT_B2
- #define MT_LFT_STEP8_SET() FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2; \
- FIO2SET = MT_LFT_A1 | MT_LFT_B2
- /*
- * 右电机拍数宏定义
- */
- #define MT_RGT_OFF() FIO1CLR = (MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2)
- #define MT_RGT_STEP1_SET() FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2; \
- FIO1SET = MT_RGT_A1
- #define MT_RGT_STEP2_SET() FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2; \
- FIO1SET = MT_RGT_A1 | MT_RGT_B1
- #define MT_RGT_STEP3_SET() FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2; \
- FIO1SET = MT_RGT_B1
- #define MT_RGT_STEP4_SET() FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2; \
- FIO1SET = MT_RGT_A2 | MT_RGT_B1
- #define MT_RGT_STEP5_SET() FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2; \
- FIO1SET = MT_RGT_A2
- #define MT_RGT_STEP6_SET() FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2; \
- FIO1SET = MT_RGT_A2 | MT_RGT_B2
- #define MT_RGT_STEP7_SET() FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2; \
- FIO1SET = MT_RGT_B2
- #define MT_RGT_STEP8_SET() FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2; \
- FIO1SET = MT_RGT_A1 | MT_RGT_B2
- /*********************************************************************************************************
- 定时器宏定义
- *********************************************************************************************************/
- #define TIMER0_INT_CLR() T0IR = 0x01 /* 定时器0清中断标志 */
- #define TIMER1_INT_CLR() T1IR = 0x01 /* 定时器1清中断标志 */
- #define TIMER0_LOAD_SET(x) T0TCR = 0x02; /* 定时器0装载值设定 */ \
- T0MR0 = x; \
- T0TCR = 0x01
- #define TIMER1_LOAD_SET(x) T1TCR = 0x02; /* 定时器1装载值设定 */ \
- T1MR0 = x; \
- T1TCR = 0x01
- /*********************************************************************************************************
- 前进一个迷宫格步进电机需要走的步数宏定义
- *********************************************************************************************************/
- #define ONE_BLOCK 125
- /*********************************************************************************************************
- 电脑鼠状态宏定义
- *********************************************************************************************************/
- #define STOP 0 /* 电脑鼠停止 */
- #define GO_AHEAD 1 /* 电脑鼠前进 */
- #define TURN_LEFT 3 /* 电脑鼠向左转 */
- #define TURN_RIGHT 4 /* 电脑鼠向右转 */
- #define TURN_BACK 5 /* 电脑鼠向后转 */
- /*********************************************************************************************************
- 传感器宏定义
- *********************************************************************************************************/
- #define LEFT 0 /* 左方传感器 */
- #define FRONTL 1 /* 左前方传感器 */
- #define FRONT 2 /* 前方传感器 */
- #define FRONTR 3 /* 右前方传感器 */
- #define RIGHT 4 /* 右方传感器 */
- /*********************************************************************************************************
- 电机状态宏定义
- *********************************************************************************************************/
- #define MOTOR_STOP 0 /* 电机停止 */
- #define WAITONE_STEP 1 /* 电机暂停一步 */
- #define MOTOR_RUN 2 /* 电机运行 */
- /*********************************************************************************************************
- 常量宏定义--电机运行方向
- *********************************************************************************************************/
- #define MOTOR_GO_AHEAD 0 /* 电机前进 */
- #define MOTOR_GO_BACK 1 /* 电机后退 */
- /*********************************************************************************************************
- 结构体定义
- *********************************************************************************************************/
- struct motor {
- volatile INT8S cState; /* 电机运行状态 */
- volatile INT8S cDir; /* 电机运行方向 */
- volatile INT32U ulPulse; /* 电机需要转动的步数 */
- volatile INT32U ulPulseCtr; /* 电机已转动的步数 */
- volatile INT32S lSpeed; /* 电机转动速度 */
- };
- typedef struct motor MOTOR;
- /*********************************************************************************************************
- 定义全局变量
- *********************************************************************************************************/
- static MOTOR GmRight = {MOTOR_STOP, MOTOR_GO_AHEAD, 0, 0, 0}; /* 定义并初始化右电机状态 */
- static MOTOR GmLeft = {MOTOR_STOP, MOTOR_GO_AHEAD, 0, 0, 0}; /* 定义并初始化左电机状态 */
-
- static volatile INT8U GucMouseState = STOP; /* 保存电脑鼠当前运行状态 */
- static INT32U GulAccelTable[300] = {0}; /* 电机加减速各阶段定时器值 */
- static INT32S GlMaxSpeed = 60; /* 保存允许运行的最大速度 */
- static volatile INT8U GucDistance[5] = {0}; /* 记录传感器状态 */
- /*********************************************************************************************************
- ** Function name: myDelay
- ** Descriptions: 软件延时
- ** input parameters: 延时时间,单位为us
- ** output parameters: 无
- ** Returned value: 无
- *********************************************************************************************************/
- void delayMs(INT32U ulTime)
- {
- INT32U i;
- while (ulTime--) {
- for (i = 0; i < (FCCLK / 1000 / 3); i++);
- }
- }
- /*********************************************************************************************************
- ** Function name: lftMtCtrl
- ** Descriptions: 左步进电机驱动时序
- ** input parameters: GmLeft.cDir :电机运行方向
- ** output parameters: 无
- ** Returned value: 无
- *********************************************************************************************************/
- void lftMtCtrl (void)
- {
- static INT8U ucRunStep = 0; /* 保存电机当前位置 */
-
- switch (GmLeft.cDir) {
- case MOTOR_GO_AHEAD: /* 向前步进 */
- if (++ucRunStep >= 8) {
- ucRunStep = 0;
- }
- break;
- case MOTOR_GO_BACK: /* 向后步进 */
- if (--ucRunStep >= 8) { /* 溢出 */
- ucRunStep = 7;
- }
- break;
- default:
- break;
- }
-
- switch (ucRunStep) { /* 执行步进电机时序 */
- case 0:
- MT_LFT_STEP1_SET();
- break;
- case 1:
- MT_LFT_STEP2_SET();
- break;
- case 2:
- MT_LFT_STEP3_SET();
- break;
- case 3:
- MT_LFT_STEP4_SET();
- break;
- case 4:
- MT_LFT_STEP5_SET();
- break;
- case 5:
- MT_LFT_STEP6_SET();
- break;
- case 6:
- MT_LFT_STEP7_SET();
- break;
- case 7:
- MT_LFT_STEP8_SET();
- break;
- default:
- break;
- }
- }
- /*********************************************************************************************************
- ** Function name: rgtMtCtrl
- ** Descriptions: 右步进电机驱动时序
- ** input parameters: 无
- ** output parameters: 无
- ** Returned value: 无
- *********************************************************************************************************/
- void rgtMtCtrl (void)
- {
- static INT8U ucRunStep = 0; /* 保存电机当前位置 */
-
- switch (GmRight.cDir) {
- case MOTOR_GO_AHEAD: /* 向前步进 */
- if (--ucRunStep >= 8) { /* 溢出 */
- ucRunStep = 7;
- }
- break;
- case MOTOR_GO_BACK: /* 向后步进 */
- if (++ucRunStep >= 8) {
- ucRunStep = 0;
- }
- break;
- default:
- break;
- }
-
- switch (ucRunStep) { /* 执行步进电机时序 */
- case 0:
- MT_RGT_STEP1_SET();
- break;
- case 1:
- MT_RGT_STEP2_SET();
- break;
- case 2:
- MT_RGT_STEP3_SET();
- break;
- case 3:
- MT_RGT_STEP4_SET();
- break;
- case 4:
- MT_RGT_STEP5_SET();
- break;
- case 5:
- MT_RGT_STEP6_SET();
- break;
- case 6:
- MT_RGT_STEP7_SET();
- break;
- case 7:
- MT_RGT_STEP8_SET();
- break;
- default:
- break;
- }
- }
- /*********************************************************************************************************
- ** Function name: lftMtSpeedCtrl
- ** Descriptions: 左电机速度调节
- ** input parameters: 无
- ** output parameters: 无
- ** Returned value: 无
- *********************************************************************************************************/
- void lftMtSpeedCtrl (void)
- {
- INT32S lDownPusle;
-
- lDownPusle = GmLeft.ulPulse - GmLeft.ulPulseCtr; /* 统计电机还剩余的步数 */
- if (lDownPusle <= GmLeft.lSpeed) {
- GmLeft.lSpeed--;
- } else { /* 非减速区间,则加速到最大值 */
- if (GmLeft.lSpeed < GlMaxSpeed) {
- GmLeft.lSpeed++;
- }
- }
- if (GmLeft.lSpeed < 0) { /* 设置速度下限 */
- GmLeft.lSpeed = 0;
- }
-
- TIMER0_LOAD_SET(GulAccelTable[GmLeft.lSpeed]); /* 设置定时时间 */
- }
- /*********************************************************************************************************
- ** Function name: rgtMtSpeedCtrl
- ** Descriptions: 右电机速度调节
- ** input parameters: 无
- ** output parameters: 无
- ** Returned value: 无
- *********************************************************************************************************/
- void rgtMtSpeedCtrl (void)
- {
- INT32S lDownPusle;
-
- lDownPusle = GmRight.ulPulse - GmRight.ulPulseCtr; /* 统计电机还剩余的步数 */
- if (lDownPusle <= GmRight.lSpeed) {
- GmRight.lSpeed--;
- } else { /* 非减速区间,则加速到最大值 */
- if (GmRight.lSpeed < GlMaxSpeed) {
- GmRight.lSpeed++;
- } else {
- GmRight.lSpeed--;
- }
- }
- if (GmRight.lSpeed < 0) { /* 设置速度下限 */
- GmRight.lSpeed = 0;
- }
- TIMER1_LOAD_SET(GulAccelTable[GmRight.lSpeed]); /* 设置定时时间 */
- }
- /*********************************************************************************************************
- ** Function name: timer0Isr
- ** Descriptions: Timer0中断服务函数
- ** input parameters: GmLeft.cState :驱动步进电机的时序状态
- ** GmLeft.cDir :步进电机运动的方向
- ** output parameters: 无
- ** Returned value: 无
- *********************************************************************************************************/
- void timer0Isr(void)
- {
- static INT8S ucCnt1 = 0, ucCnt2 = 0; /* 修正姿态计数变量 */
- TIMER0_INT_CLR(); /* 清除中断标志 */
- switch (GmLeft.cState) {
- case MOTOR_STOP: /* 停止,同时清零速度和脉冲值 */
- GmLeft.lSpeed = 0;
- GmLeft.ulPulse = 0;
- GmLeft.ulPulseCtr = 0;
- break;
- case WAITONE_STEP: /* 暂停一步 */
- GmLeft.cState = MOTOR_RUN;
- break;
- case MOTOR_RUN: /* 电机运行 */
- if (GucMouseState == GO_AHEAD) { /* 根据传感器状态微调电机位置 */
- if (GucDistance[FRONTR] && /* 前右方有挡板 */\
- (GucDistance[FRONTL]==0)) { /* 前左方无挡板 */
- if (ucCnt1 == 1) {
- GmLeft.cState = WAITONE_STEP; /* 使下一步暂停 */
- }
- if (++ucCnt1 > 3) { /* 3步暂停一步 */
- ucCnt1 = 0;
- }
- } else {
- ucCnt1 = 0;
- }
- if ((GucDistance[LEFT] == 1) && /* 左远方有挡板 */\
- (GucDistance[RIGHT] == 0)) { /* 右方无挡板 */
- if(ucCnt2 == 3) {
- GmLeft.cState = WAITONE_STEP; /* 使下一步暂停 */
- }
- if (++ucCnt2 > 6) { /* 6步暂停一步 */
- ucCnt2 = 0;
- }
- } else {
- ucCnt2 = 0;
- }
- }
- lftMtCtrl(); /* 电机驱动程序 */
- break;
- default:
- break;
- }
- /*
- * 是否完成任务判断
- */
- if (GmLeft.cState != MOTOR_STOP) {
- GmLeft.ulPulseCtr++; /* 运行脉冲计数 */
- lftMtSpeedCtrl(); /* 速度调节 */
- if (GmLeft.ulPulseCtr >= GmLeft.ulPulse) {
- GmLeft.cState = MOTOR_STOP;
- GmLeft.ulPulseCtr = 0;
- GmLeft.ulPulse = 0;
- GmLeft.lSpeed = 0;
- }
- }
- }
- /*********************************************************************************************************
- ** Function name: timer1Isr
- ** Descriptions: Timer1中断服务函数
- ** input parameters: 无
- ** output parameters: 无
- ** Returned value: 无
- *********************************************************************************************************/
- void timer1Isr(void)
- {
- static INT8S ucCnt1 = 0, ucCnt2 = 0; /* 修正姿态计数变量 */
- TIMER1_INT_CLR(); /* 清除中断标志 */
-
- switch (GmRight.cState) {
- case MOTOR_STOP: /* 停止,同时清零速度和脉冲值 */
- GmRight.lSpeed = 0;
- GmRight.ulPulse = 0;
- GmRight.ulPulseCtr = 0;
- break;
- case WAITONE_STEP: /* 暂停一步 */
- GmRight.cState = MOTOR_RUN;
- break;
- case MOTOR_RUN: /* 电机运行 */
- if (GucMouseState == GO_AHEAD) { /* 根据传感器状态微调电机位置 */
- if (GucDistance[FRONTL] && /* 前左方有挡板 */\
- (GucDistance[FRONTR]==0)) { /* 前右方无挡板 */
- if (ucCnt1 == 1) {
- GmRight.cState = WAITONE_STEP; /* 使下一步暂停 */
- }
- if (++ucCnt1 > 3) { /* 3步暂停一步 */
- ucCnt1 = 0;
- }
- } else {
- ucCnt1 = 0;
- }
- if ((GucDistance[RIGHT] == 1) && /* 右远方有挡板 */\
- (GucDistance[LEFT] == 0)) { /* 左方无挡板 */
- if(ucCnt2 == 3) {
- GmRight.cState = WAITONE_STEP; /* 使下一步暂停 */
- }
- if (++ucCnt2 > 6) { /* 6步暂停一步 */
- ucCnt2 = 0;
- }
- } else {
- ucCnt2 = 0;
- }
- }
- rgtMtCtrl(); /* 推动电机转动一步 */
- break;
- default:
- break;
- }
- /*
- * 是否完成任务判断
- */
- if (GmRight.cState != MOTOR_STOP) {
- GmRight.ulPulseCtr++; /* 运行脉冲计数 */
- rgtMtSpeedCtrl(); /* 速度调节 */
- if (GmRight.ulPulseCtr >= GmRight.ulPulse) {
- GmRight.cState = MOTOR_STOP;
- GmRight.ulPulseCtr = 0;
- GmRight.ulPulse = 0;
- GmRight.lSpeed = 0;
- }
- }
- }
- /*********************************************************************************************************
- ** Function name: irSend
- ** Descriptions: 红外发射启动函数
- ** input parameters: ucIndex: 红外发射索引号
- ** ulFreq : 红外载波频率
- ** output parameters: 无
- ** Returned value: 无
- *********************************************************************************************************/
- void irSend (INT8U ucIndex, INT32U ulFreq)
- {
- switch (ucIndex) {
- case FRONT_SIDE_PWM_INDEX:
- PWM_RESET();
- PWM_FRQ_SET(ulFreq);
- FRONTSIDE_PWM_PULSE_SET(FPCLK / ulFreq / 2);
- PWM_START();
- FRONTSIDE_PWM_EN();
- break;
- case DIG_PWM_INDEX:
- PWM_RESET();
- PWM_FRQ_SET(ulFreq);
- DIG_PWM_PULSE_SET(FPCLK / ulFreq / 2);
- PWM_START();
- DIG_PWM_EN();
- break;
- default:
- break;
- }
- }
- /*********************************************************************************************************
- ** Function name: irCheck
- ** Descriptions: 红外线传感器检测。
- ** input parameters: 无
- ** output parameters: 无
- ** Returned value: 无
- *********************************************************************************************************/
- void irCheck (void)
- {
- static INT8U ucState = 0;
- static INT32U ulIRCheck;
-
- switch (ucState) {
- case 0:
- irSend(FRONT_SIDE_PWM_INDEX, 32200); /* 探测左右两侧近距 */
- irSend(DIG_PWM_INDEX, 35000); /* 驱动斜角上的传感器检测 */
- break;
- case 1:
- ulIRCheck = IR_READ(); /* 读取传感器状态 */
- FRONTSIDE_PWM_DIS(); /* 禁止PWM发生器2 */
- DIG_PWM_DIS(); /* 禁止PWM发生器1 */
-
- if (ulIRCheck & IR_SIDE_LFT) {
- GucDistance[LEFT] &= 0xfd;
- } else {
- GucDistance[LEFT] |= 0x02;
- }
- if (ulIRCheck & IR_DIG_LFT) {
- GucDistance[FRONTL] = 0x00;
- } else {
- GucDistance[FRONTL] = 0x01;
- }
-
- if (ulIRCheck & IR_DIG_RGT) {
- GucDistance[FRONTR] = 0x00;
- } else {
- GucDistance[FRONTR] = 0x01;
- }
- if (ulIRCheck & IR_SIDE_RGT) {
- GucDistance[RIGHT] &= 0xfd;
- } else {
- GucDistance[RIGHT] |= 0x02;
- }
- break;
- case 2:
- irSend(FRONT_SIDE_PWM_INDEX, 36000); /* 驱动检测左前右三个方向远距 */
-
- break;
- case 3:
- ulIRCheck = IR_READ(); /* 读取传感器状态 */
- FRONTSIDE_PWM_DIS(); /* 禁止PWM发生器2 */
- break;
- case 4:
- irSend(FRONT_SIDE_PWM_INDEX, 36000); /* 重复检测左前右三个方向远距 */
- break;
- case 5:
- ulIRCheck &= IR_READ(); /* 读取传感器状态 */
- FRONTSIDE_PWM_DIS(); /* 禁止PWM发生器2 */
-
- if (ulIRCheck & IR_SIDE_LFT) {
- GucDistance[LEFT] &= 0xfe;
- } else {
- GucDistance[LEFT] |= 0x01;
- }
- if (ulIRCheck & IR_FRONT) {
- GucDistance[FRONT] &= 0xfe;
- } else {
- GucDistance[FRONT] |= 0x01;
- }
- if (ulIRCheck & IR_SIDE_RGT) {
- GucDistance[RIGHT] &= 0xfe;
- } else {
- GucDistance[RIGHT] |= 0x01;
- }
- break;
- default:
- break;
- }
- if (++ucState >= 6) {
- ucState = 0;
- }
- }
- /*********************************************************************************************************
- ** Function name: keyCheck
- ** Descriptions: 读取按键
- ** input parameters: 无
- ** output parameters: 无
- ** Returned value: true: 按键已按下
- ** false: 按键未按下
- *********************************************************************************************************/
- BOOLEAN keyCheck (void)
- {
- if (KEY_PRESS()) { /* 按键按下 */
- delayMs(10); /* 延时10ms消抖动 */
- if (KEY_PRESS()) { /* 按键按下 */
- delayMs(10); /* 延时10ms消抖动 */
- while(!KEY_PRESS()); /* 等待按键释放 */
- return (true);
- }
- }
- return (false);
- }
- /*********************************************************************************************************
- ** Function name: sysTickIsr
- ** Descriptions: 定时中断扫描。
- ** input parameters: 无
- ** output parameters: 无
- ** Returned value: 无
- *********************************************************************************************************/
- void sysTickIsr(void)
- {
- static INT32S lLft = 0, lRgt = 0;
-
- /*
- * 如果左电机长时间停止,则断电
- */
- if (GmLeft.cState == MOTOR_STOP) {
- lLft++;
- } else {
- lLft = 0;
- }
- if (lLft >= 500) {
- MT_LFT_OFF();
- }
- /*
- * 如果右电机长时间停止,则断电
- */
- if (GmRight.cState == MOTOR_STOP) {
- lRgt++;
- } else {
- lRgt = 0;
- }
- if (lRgt >= 500) {
- MT_RGT_OFF();
- }
- /*
- * 红外线检测
- */
- irCheck();
- }
- /*********************************************************************************************************
- ** Function name: sensorInit
- ** Descriptions: 传感器控制初始化
- ** input parameters: 无
- ** output parameters: 无
- ** Returned value: 无
- *********************************************************************************************************/
- void sensorInit (void)
- {
- IR_PIN_MODE_IN(); /* 红外检测引脚配置为输入引脚 */
-
- PWM1TCR = 0x02; /* 复位PWM1定时器 */
- PWM1TC = 0; /* 定时器设置为0 */
- PWM1PR = 0; /* 时钟不分频 */
- PWM1MCR = 0x02; /* 设置PWMMR0匹配后复位PWMTC, */
- /* 并产生中断标志 */
- PWM1MR0 = FPCLK / 38000; /* 38KHz频率 */
- PWM1MR1 = FPCLK / 38000 / 2;
- PWM1MR2 = FPCLK / 38000 / 2;
- PWM1PCR &= ~((1 << 9) | (1 << 10)); /* 禁止输出 */
- PWM1TCR = 0x05; /* 启动定时器 */
- }
- /*********************************************************************************************************
- ** Function name: stepMotorIint
- ** Descriptions: 步进电机控制初始化
- ** input parameters: 无
- ** output parameters: 无
- ** Returned value: 无
- *********************************************************************************************************/
- void stepMotorIint (void)
- {
- INT32U n;
- /*
- * 设置驱动步进电机的八个I/O口为输出模式
- */
- FIO1DIR |= (1 << 25) | (1 << 26) | (1 << 28) | (1 << 29);
- FIO2DIR |= (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5);
- /*
- * 对左右电机转动的位置初始化
- */
- MT_LFT_STEP1_SET();
- MT_RGT_STEP1_SET();
- /*
- * 初始化加速/减速时定时器加载值的数据表
- * C0=F*sqrt(2/w) , W=1000时,sqrt(2/w) = 0.04472136
- * C1 = 0.4142*C0
- */
- GulAccelTable[0] = (INT32U)(FPCLK * 0.04472136);
- GulAccelTable[1] = (INT32U)((unsigned long long)GulAccelTable[0] * 4142 / 10000);
- for(n = 2; n < 300; n++) {
- GulAccelTable[n] = GulAccelTable[n - 1] - (2 * GulAccelTable[n - 1] / (4 * n + 1));
- }
- /*
- * 初始化定时器0,用来控制左电机的转速
- */
- T0TCR = 0x02;
- T0IR = 1;
- T0CTCR = 0;
- T0TC = 0;
- T0PR = 0;
- T0MR0 = GulAccelTable[0]; /* 装载值 */
- T0MCR = 0x03; /* 匹配后产生中断 */
-
- zyIsrSet(NVIC_TIMER0, (unsigned long)timer0Isr, PRIO_THREE); /* 设置中断并使能 */
- T0TCR = 0x01; /* 启动定时器0 */ /* 使能定时器0 */
-
- /*
- * 初始化定时器1,用来控制右电机的转速
- */
- T1TCR = 0x02;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
MicroMouse_高级实验.zip
(137.56 KB, 下载次数: 10)
|