久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
電腦鼠程序 MicroMouse615上的無記憶功能的走迷宮實驗
[打印本頁]
作者:
sbbrqfgu
時間:
2018-4-2 21:39
標題:
電腦鼠程序 MicroMouse615上的無記憶功能的走迷宮實驗
這個是我們電腦鼠的程序,可以用IAR下的流明諾瑞驅動庫進行編譯調試
單片機源程序如下:
/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**--------------File Info---------------------------------------------------------------------------------
** File Name: main.c
** Last modified Date: 2008/02/14
** Last Version: V1.00
** Description: MicroMouse615上的無記憶功能的走迷宮實驗
**
**--------------------------------------------------------------------------------------------------------
** Created By: 廖茂剛
** Created date:
** Version:
** Descriptions:
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
*********************************************************************************************************/
/*********************************************************************************************************
包含頭文件
*********************************************************************************************************/
#include "hw_memmap.h"
#include "hw_ints.h"
#include "hw_types.h"
#include "interrupt.h"
#include "gpio.h"
#include "sysctl.h"
#include "Systick.h"
#include "Timer.h"
#include "adc.h"
#include "Pwm.h"
#include "Type.h"
#include "Zlg7289.h"
/*********************************************************************************************************
PB端口定義
*********************************************************************************************************/
#define IRSEND_BEVEL GPIO_PIN_0 /* 驅動斜角紅外的調制信號 */
#define LEFTSIDE GPIO_PIN_1 /* 左方傳感器輸出的信號 */
#define FRONTSIDE_L GPIO_PIN_2 /* 左前方傳感器輸出的信號 */
#define FRONTSIDE GPIO_PIN_3 /* 前方傳感器輸出的信號 */
#define FRONTSIDE_R GPIO_PIN_4 /* 右前方傳感器輸出的信號 */
#define RIGHTSIDE GPIO_PIN_5 /* 右方傳感器輸出的信號 */
/*********************************************************************************************************
PC端口定義
*********************************************************************************************************/
#define KEY GPIO_PIN_4 /* 按鍵連接的端口 */
/*********************************************************************************************************
PD端口定義
*********************************************************************************************************/
#define PHRA1 GPIO_PIN_0 /* 右側步進電機的A1相 */
#define PHRA2 GPIO_PIN_1 /* 右側步進電機的A2相 */
#define PHRB1 GPIO_PIN_2 /* 右側步進電機的B1相 */
#define PHRB2 GPIO_PIN_3 /* 右側步進電機的B2相 */
#define PHLA1 GPIO_PIN_4 /* 左側步進電機的A1相 */
#define PHLA2 GPIO_PIN_5 /* 左側步進電機的A2相 */
#define PHLB1 GPIO_PIN_6 /* 左側步進電機的B1相 */
#define PHLB2 GPIO_PIN_7 /* 左側步進電機的B2相 */
/*********************************************************************************************************
PE端口定義
*********************************************************************************************************/
#define IRSEND_SIDE GPIO_PIN_0 /* 驅動左前右正向紅外發射 */
/*********************************************************************************************************
常量宏定義 -- 迷宮類型
*********************************************************************************************************/
#define MAZETYPE 8 /* 8: 四分之一迷宮;16: 全迷宮 */
/*********************************************************************************************************
常量宏定義--前進一個迷宮格步進電機需要走的步數
*********************************************************************************************************/
#define ONEBLOCK 125
/*********************************************************************************************************
常量宏定義--電腦鼠狀態
*********************************************************************************************************/
#define STOP 0 /* 電腦鼠停止 */
#define GOAHEAD 1 /* 電腦鼠前進 */
#define TURNLEFT 3 /* 電腦鼠向左轉 */
#define TURNRIGHT 4 /* 電腦鼠向右轉 */
#define TURNBACK 5 /* 電腦鼠向后轉 */
/*********************************************************************************************************
常量宏定義--傳感器
*********************************************************************************************************/
#define LEFT 0 /* 左方傳感器 */
#define FRONTL 1 /* 左前方傳感器 */
#define FRONT 2 /* 前方傳感器 */
#define FRONTR 3 /* 右前方傳感器 */
#define RIGHT 4 /* 右方傳感器 */
/*********************************************************************************************************
常量宏定義--電機狀態
*********************************************************************************************************/
#define MOTORSTOP 0 /* 電機停止 */
#define WAITONESTEP 1 /* 電機暫停一步 */
#define MOTORRUN 2 /* 電機運行 */
/*********************************************************************************************************
常量宏定義--電機運行方向
*********************************************************************************************************/
#define MOTORGOAHEAD 0 /* 電機前進 */
#define MOTORGOBACK 1 /* 電機后退 */
/*********************************************************************************************************
結構體定義
*********************************************************************************************************/
struct motor {
int8 cState; /* 電機運行狀態 */
int8 cDir; /* 電機運行方向 */
uint32 uiPulse; /* 電機需要轉動的步數 */
uint32 uiPulseCtr; /* 電機已轉動的步數 */
int32 iSpeed; /* 電機轉動速度 */
};
typedef struct motor MOTOR;
/*********************************************************************************************************
定義全局變量
*********************************************************************************************************/
static MOTOR GmRight = {MOTORSTOP, MOTORGOAHEAD, 0, 0, 0}; /* 定義并初始化右電機狀態 */
static MOTOR GmLeft = {MOTORSTOP, MOTORGOAHEAD, 0, 0, 0}; /* 定義并初始化左電機狀態 */
static uint8 GucMouseState = STOP; /* 保存電腦鼠當前運行狀態 */
static uint32 GuiAccelTable[300] = {0}; /* 電機加減速各階段定時器值 */
static int32 GiMaxSpeed = 70; /* 保存允許運行的最大速度 */
static uint8 GucDistance[5] = {0}; /* 記錄傳感器狀態 */
/*********************************************************************************************************
** Function name: delay
** Descriptions: 延時函數
** input parameters: uiD :延時參數,值越大,延時越久
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void delay (uint32 uiD)
{
for (; uiD; uiD--);
}
/*********************************************************************************************************
** Function name: rightMotorContr
** Descriptions: 右步進電機驅動時序
** input parameters: 無
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void rightMotorContr (void)
{
static int8 cStep = 0; /* 保存電機當前位置 */
switch (GmRight.cDir) {
case MOTORGOAHEAD: /* 向前步進 */
cStep = (cStep + 1) % 8;
break;
case MOTORGOBACK: /* 向后步進 */
cStep = (cStep + 7) % 8;
break;
default:
break;
}
switch (cStep) {
case 0: /* A2B2 */
GPIOPinWrite(GPIO_PORTD_BASE,
PHRA1 | PHRA2 | PHRB1 | PHRB2,
PHRA1 | PHRA2 | PHRB1 | PHRB2);
break;
case 1: /* A2 */
GPIOPinWrite(GPIO_PORTD_BASE,
PHRA1 | PHRA2 | PHRB1 | PHRB2,
PHRA1 | PHRA2);
break;
case 2: /* A2B1 */
GPIOPinWrite(GPIO_PORTD_BASE,
PHRA1 | PHRA2 | PHRB1 | PHRB2,
PHRA1 | PHRA2 | PHRB2);
break;
case 3: /* B1 */
GPIOPinWrite(GPIO_PORTD_BASE,
PHRA1 | PHRA2 | PHRB1 | PHRB2,
PHRB2);
break;
case 4: /* A1B1 */
GPIOPinWrite(GPIO_PORTD_BASE,
PHRA1 | PHRA2 | PHRB1 | PHRB2,
PHRA2 | PHRB2);
break;
case 5: /* A1 */
GPIOPinWrite(GPIO_PORTD_BASE,
PHRA1 | PHRA2 | PHRB1 | PHRB2,
PHRA2);
break;
case 6: /* A1B2 */
GPIOPinWrite(GPIO_PORTD_BASE,
PHRA1 | PHRA2 | PHRB1 | PHRB2,
PHRA2 | PHRB1 | PHRB2);
break;
case 7: /* B2 */
GPIOPinWrite(GPIO_PORTD_BASE,
PHRA1 | PHRA2 | PHRB1 | PHRB2,
PHRB1 | PHRB2);
break;
default:
break;
}
}
/*********************************************************************************************************
** Function name: leftMotorContr
** Descriptions: 左步進電機驅動時序
** input parameters: GmLeft.cDir :電機運行方向
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void leftMotorContr (void)
{
static int8 cStep = 0; /* 保存電機當前位置 */
switch (GmLeft.cDir) {
case MOTORGOAHEAD: /* 向前步進 */
cStep = (cStep + 1) % 8;
break;
case MOTORGOBACK: /* 向后步進 */
cStep = (cStep + 7) % 8;
break;
default:
break;
}
switch (cStep) {
case 0: /* A2B2 */
GPIOPinWrite(GPIO_PORTD_BASE,
PHLA1 | PHLA2 | PHLB1 | PHLB2,
PHLA1 | PHLA2 | PHLB1 | PHLB2);
break;
case 1: /* B2 */
GPIOPinWrite(GPIO_PORTD_BASE,
PHLA1 | PHLA2 | PHLB1 | PHLB2,
PHLB1 | PHLB2);
break;
case 2: /* A1B2 */
GPIOPinWrite(GPIO_PORTD_BASE,
PHLA1 | PHLA2 | PHLB1 | PHLB2,
PHLA2 | PHLB1 | PHLB2);
break;
case 3: /* A1 */
GPIOPinWrite(GPIO_PORTD_BASE,
PHLA1 | PHLA2 | PHLB1 | PHLB2,
PHLA2);
break;
case 4: /* A1B1 */
GPIOPinWrite(GPIO_PORTD_BASE,
PHLA1 | PHLA2 | PHLB1 | PHLB2,
PHLA2 | PHLB2);
break;
case 5: /* B1 */
GPIOPinWrite(GPIO_PORTD_BASE,
PHLA1 | PHLA2 | PHLB1 | PHLB2,
PHLB2);
break;
case 6: /* A2B1 */
GPIOPinWrite(GPIO_PORTD_BASE,
PHLA1 | PHLA2 | PHLB1 | PHLB2,
PHLA1 | PHLA2 | PHLB2);
break;
case 7: /* A2 */
GPIOPinWrite(GPIO_PORTD_BASE,
PHLA1 | PHLA2 | PHLB1 | PHLB2,
PHLA1 | PHLA2);
break;
default:
break;
}
}
/*********************************************************************************************************
** Function name: speedContrR
** Descriptions: 右電機速度調節
** input parameters: 無
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void speedContrR (void)
{
int32 iDPusle;
iDPusle = GmRight.uiPulse - GmRight.uiPulseCtr; /* 統計電機還剩余的步數 */
if (iDPusle <= GmRight.iSpeed) {
GmRight.iSpeed--;
} else { /* 非減速區間,則加速到最大值 */
if (GmRight.iSpeed < GiMaxSpeed) {
GmRight.iSpeed++;
} else {
GmRight.iSpeed--;
}
}
if (GmRight.iSpeed < 0) { /* 設置速度下限 */
GmRight.iSpeed = 0;
}
TimerLoadSet(TIMER0_BASE, TIMER_A, GuiAccelTable[GmRight.iSpeed]); /* 設置定時時間 */
}
/*********************************************************************************************************
** Function name: speedContrL
** Descriptions: 左電機速度調節
** input parameters: 無
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void speedContrL (void)
{
int32 iDPusle;
iDPusle = GmLeft.uiPulse - GmLeft.uiPulseCtr; /* 統計電機還剩余的步數 */
if (iDPusle <= GmLeft.iSpeed) {
GmLeft.iSpeed--;
} else { /* 非減速區間,則加速到最大值 */
if (GmLeft.iSpeed < GiMaxSpeed) {
GmLeft.iSpeed++;
}
}
if (GmLeft.iSpeed < 0) { /* 設置速度下限 */
GmLeft.iSpeed = 0;
}
TimerLoadSet(TIMER1_BASE,TIMER_A,GuiAccelTable[GmLeft.iSpeed]); /* 設置定時時間 */
}
/*********************************************************************************************************
** Function name: Timer0A_ISR
** Descriptions: Timer0中斷服務函數
** input parameters: 無
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void Timer0A_ISR(void)
{
static int8 n = 0,m = 0;
TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); /* 清除定時器0中斷。 */
switch (GmRight.cState) {
case MOTORSTOP: /* 停止,同時清零速度和脈沖值 */
GmRight.iSpeed = 0;
GmRight.uiPulse = 0;
GmRight.uiPulseCtr = 0;
break;
case WAITONESTEP: /* 暫停一步 */
GmRight.cState = MOTORRUN;
break;
case MOTORRUN: /* 電機運行 */
if (GucMouseState == GOAHEAD) { /* 根據傳感器狀態微調電機位置 */
if (GucDistance[FRONTL] && (GucDistance[FRONTR] == 0)) { /* 左前方有障礙,且前方無擋板 */
if (n == 1) {
GmRight.cState = WAITONESTEP; /* 下一次電機暫停 */
}
n++;
n %= 2;
} else {
n = 0;
}
if ((GucDistance[RIGHT] == 1) && (GucDistance[LEFT] == 0)) {/* 離右擋板太遠,且左方無擋板 */
if(m == 3) {
GmRight.cState = WAITONESTEP; /* 下一次電機暫停 */
}
m++;
m %= 6;
} else {
m = 0;
}
}
rightMotorContr(); /* 推動電機轉動一步 */
break;
default:
break;
}
/*
* 是否完成任務判斷
*/
if (GmRight.cState != MOTORSTOP) {
GmRight.uiPulseCtr++; /* 運行脈沖計數 */
speedContrR(); /* 速度調節 */
if (GmRight.uiPulseCtr >= GmRight.uiPulse) {
GmRight.cState = MOTORSTOP;
GmRight.uiPulseCtr = 0;
GmRight.uiPulse = 0;
GmRight.iSpeed = 0;
}
}
}
/*********************************************************************************************************
** Function name: Timer1A_ISR
** Descriptions: Timer1中斷服務函數
** input parameters: GmLeft.cState :驅動步進電機的時序狀態
** GmLeft.cDir :步進電機運動的方向
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void Timer1A_ISR(void)
{
static int8 n = 0, m = 0;
TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT); /* 清除定時器1中斷。 */
switch (GmLeft.cState) {
case MOTORSTOP: /* 停止,同時清零速度和脈沖值 */
GmLeft.iSpeed = 0;
GmLeft.uiPulse = 0;
GmLeft.uiPulseCtr = 0;
break;
case WAITONESTEP: /* 暫停一步 */
GmLeft.cState = MOTORRUN;
break;
case MOTORRUN: /* 電機運行 */
if (GucMouseState == GOAHEAD) { /* 根據傳感器狀態微調電機位置 */
if (GucDistance[FRONTR] &&(GucDistance[FRONTL]==0)) {
if (n == 1) {
GmLeft.cState = WAITONESTEP;
}
n++;
n %= 2;
} else {
n = 0;
}
if ((GucDistance[LEFT] == 1) && (GucDistance[RIGHT] == 0)) {
if(m == 3) {
GmLeft.cState = WAITONESTEP;
}
m++;
m %= 6;
} else {
m = 0;
}
}
leftMotorContr(); /* 電機驅動程序 */
break;
default:
break;
}
/*
* 是否完成任務判斷
*/
if (GmLeft.cState != MOTORSTOP) {
GmLeft.uiPulseCtr++; /* 運行脈沖計數 */
speedContrL(); /* 速度調節 */
if (GmLeft.uiPulseCtr >= GmLeft.uiPulse) {
GmLeft.cState = MOTORSTOP;
GmLeft.uiPulseCtr = 0;
GmLeft.uiPulse = 0;
GmLeft.iSpeed = 0;
}
}
}
/*********************************************************************************************************
** Function name: irSendFreq
** Descriptions: 發送紅外線。
** input parameters: uiFreq: 紅外線調制頻率
** cNumber: 選擇需要設置的PWM模塊
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void irSendFreq (uint32 uiFreq, int8 cNumber)
{
uiFreq = SysCtlClockGet() / uiFreq;
switch (cNumber) {
case 1:
PWMGenPeriodSet(PWM_BASE, PWM_GEN_1, uiFreq); /* 設置PWM發生器1的周期 */
PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, uiFreq / 2); /* 設置PWM2輸出的脈沖寬度 */
PWMGenEnable(PWM_BASE, PWM_GEN_1); /* 使能PWM發生器1 */
break;
case 2:
PWMGenPeriodSet(PWM_BASE, PWM_GEN_2, uiFreq); /* 設置PWM發生器2的周期 */
PWMPulseWidthSet(PWM_BASE, PWM_OUT_4, uiFreq / 2); /* 設置PWM4輸出的脈沖寬度 */
PWMGenEnable(PWM_BASE, PWM_GEN_2); /* 使能PWM發生器2 */
break;
default:
break;
}
}
/*********************************************************************************************************
** Function name: irCheck
** Descriptions: 紅外線傳感器檢測。
** input parameters: 無
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void irCheck (void)
{
static uint8 ucState = 0;
static uint8 ucIRCheck;
switch (ucState) {
case 0:
irSendFreq(32200, 2); /* 探測左右兩側近距 */
irSendFreq(35000, 1); /* 驅動斜角上的傳感器檢測 */
break;
case 1:
ucIRCheck = GPIOPinRead(GPIO_PORTB_BASE, 0x3e); /* 讀取傳感器狀態 */
PWMGenDisable(PWM_BASE, PWM_GEN_2); /* 禁止PWM發生器2 */
PWMGenDisable(PWM_BASE, PWM_GEN_1); /* 禁止PWM發生器1 */
if (ucIRCheck & RIGHTSIDE) {
GucDistance[RIGHT] &= 0xfd;
} else {
GucDistance[RIGHT] |= 0x02;
}
if (ucIRCheck & LEFTSIDE) {
GucDistance[LEFT] &= 0xfd;
} else {
GucDistance[LEFT] |= 0x02;
}
if (ucIRCheck & FRONTSIDE_R) {
GucDistance[FRONTR] = 0x00;
} else {
GucDistance[FRONTR] = 0x01;
}
if (ucIRCheck & FRONTSIDE_L) {
GucDistance[FRONTL] = 0x00;
} else {
GucDistance[FRONTL] = 0x01;
}
break;
case 2:
irSendFreq(36000, 2); /* 驅動檢測左前右三個方向遠距 */
break;
case 3:
ucIRCheck = GPIOPinRead(GPIO_PORTB_BASE, 0x2a); /* 讀取傳感器狀態 */
PWMGenDisable(PWM_BASE, PWM_GEN_2); /* 禁止PWM發生器2 */
break;
case 4:
irSendFreq(36000, 2); /* 重復檢測左前右三個方向遠距 */
break;
case 5:
ucIRCheck &= GPIOPinRead(GPIO_PORTB_BASE, 0x2a); /* 讀取傳感器狀態 */
PWMGenDisable(PWM_BASE, PWM_GEN_2); /* 禁止PWM發生器2 */
if (ucIRCheck & RIGHTSIDE) {
GucDistance[RIGHT] &= 0xfe;
} else {
GucDistance[RIGHT] |= 0x01;
}
if (ucIRCheck & LEFTSIDE) {
GucDistance[LEFT] &= 0xfe;
} else {
GucDistance[LEFT] |= 0x01;
}
if (ucIRCheck & FRONTSIDE) {
GucDistance[FRONT] &= 0xfe;
} else {
GucDistance[FRONT] |= 0x01;
}
break;
default:
break;
}
ucState = (ucState + 1) % 6; /* 循環檢測 */
}
/*********************************************************************************************************
** Function name: mazeSearch
** Descriptions: 迷宮搜索,若發現分支路或者前方有擋板則退出
** input parameters: 無
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void mazeSearch(void)
{
int8 cL = 0, cR = 0;
/*
* 設定運行任務
*/
GucMouseState = GOAHEAD;
GmRight.cDir = MOTORGOAHEAD;
GmLeft.cDir = MOTORGOAHEAD;
GmRight.uiPulse = MAZETYPE * ONEBLOCK;
GmLeft.uiPulse = MAZETYPE * ONEBLOCK;
GmRight.cState = MOTORRUN;
GmLeft.cState = MOTORRUN;
while (GmLeft.cState != MOTORSTOP) {
if (GucDistance[FRONT]) { /* 前方有墻 */
/*
* 設置繼續前進的步數,以實現能停止在單元格中心的目的
*/
GmRight.uiPulse = GmRight.uiPulseCtr + 70;
GmLeft.uiPulse = GmLeft.uiPulseCtr + 70;
/*
* 反復檢測前方傳感器的狀態,以消除誤判
*/
while (GucDistance[FRONT]) {
if ((GmLeft.uiPulseCtr + 50) > GmLeft.uiPulse) {
goto End; /* 跳出循環,跳到程序結束處 */
}
}
/*
* 程序執行到此步表明出現誤判,則重新設定電機運行任務
*/
GmRight.uiPulse = MAZETYPE * ONEBLOCK;
GmLeft.uiPulse = MAZETYPE * ONEBLOCK;
}
if (cL) { /* 是否允許檢測左邊 */
if ((GucDistance[LEFT] & 0x01) == 0) { /* 左邊有支路 */
/*
* 設置繼續前進的步數,以實現能停止在單元格中心的目的
*/
GmRight.uiPulse = GmRight.uiPulseCtr + 74;
GmLeft.uiPulse = GmLeft.uiPulseCtr + 74;
/*
* 反復檢測前方傳感器的狀態,以消除誤判
*/
while ((GucDistance[LEFT] & 0x01) == 0) {
if ((GmLeft.uiPulseCtr + 50) > GmLeft.uiPulse) {
goto End; /* 跳出循環,跳到程序結束處 */
}
}
/*
* 程序執行到此步表明出現誤判,則重新設定電機運行任務
*/
GmRight.uiPulse = MAZETYPE * ONEBLOCK;
GmLeft.uiPulse = MAZETYPE * ONEBLOCK;
}
} else { /* 左邊有墻時開始允許檢測左邊 */
if ( GucDistance[LEFT] & 0x01) {
cL = 1;
}
}
if (cR) { /* 是否允許檢測右邊 */
if ((GucDistance[RIGHT] & 0x01) == 0) { /* 右邊有支路 */
/*
* 設置繼續前進的步數,以實現能停止在單元格中心的目的
*/
GmRight.uiPulse = GmRight.uiPulseCtr + 74;
GmLeft.uiPulse = GmLeft.uiPulseCtr + 74;
/*
* 反復檢測前方傳感器的狀態,以消除誤判
*/
while ((GucDistance[ RIGHT] & 0x01) == 0) {
if ((GmLeft.uiPulseCtr + 50) > GmLeft.uiPulse) {
goto End; /* 跳出循環,跳到程序結束處 */
}
}
/*
* 程序執行到此步表明出現誤判,則重新設定電機運行任務
*/
GmRight.uiPulse = MAZETYPE * ONEBLOCK;
GmLeft.uiPulse = MAZETYPE * ONEBLOCK;
}
} else {
if ( GucDistance[RIGHT] & 0x01) { /* 右邊有墻時開始允許檢測右邊 */
cR = 1;
}
}
}
End:;
}
/*********************************************************************************************************
** Function name: mouseTurnright
** Descriptions: 右轉
** input parameters: 無
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void mouseTurnright(void)
{
/*
* 等待停止
*/
while (GmLeft.cState != MOTORSTOP);
while (GmRight.cState != MOTORSTOP);
GucMouseState = TURNRIGHT; /* 標記電腦鼠的運行狀態 */
/*
* 開始右轉
*/
GmRight.cDir = MOTORGOBACK; /* 控制右輪向后轉動 */
GmRight.uiPulse = 41; /* 設定右輪轉動的步數 */
GmLeft.cDir = MOTORGOAHEAD; /* 控制左輪向前轉動 */
GmLeft.uiPulse = 41; /* 設定左輪轉動的步數 */
GmRight.cState = MOTORRUN; /* 使能右輪轉動 */
GmLeft.cState = MOTORRUN; /* 使能左輪轉動 */
/*
* 等待右轉完成
*/
while (GmLeft.cState != MOTORSTOP);
while (GmRight.cState != MOTORSTOP);
}
/*********************************************************************************************************
** Function name: mouseTurnleft
** Descriptions: 左轉
** input parameters: 無
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void mouseTurnleft(void)
{
/*
* 等待停止
*/
while (GmLeft.cState != MOTORSTOP);
while (GmRight.cState != MOTORSTOP);
GucMouseState = TURNLEFT; /* 標記電腦鼠的運行狀態 */
/*
* 開始左轉
*/
GmRight.cDir = MOTORGOAHEAD; /* 控制右輪向前轉動 */
GmRight.uiPulse = 41; /* 設定右輪轉動的步數 */
GmLeft.cDir = MOTORGOBACK; /* 控制左輪向后轉動 */
GmLeft.uiPulse = 41; /* 設定左輪轉動的步數 */
GmRight.cState = MOTORRUN; /* 使能右輪轉動 */
GmLeft.cState = MOTORRUN; /* 使能左輪轉動 */
/*
* 等待左轉完成
*/
while (GmLeft.cState != MOTORSTOP);
while (GmRight.cState != MOTORSTOP);
}
/*********************************************************************************************************
** Function name: mouseTurnback
** Descriptions: 后轉
** input parameters: 無
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void mouseTurnback(void)
{
/*
* 等待停止
*/
while (GmLeft.cState != MOTORSTOP);
while (GmRight.cState != MOTORSTOP);
GucMouseState = TURNBACK;
/*
* 開始后轉
*/
GmRight.cDir = MOTORGOBACK;
GmRight.uiPulse = 81;
GmLeft.cDir = MOTORGOAHEAD;
GmLeft.uiPulse = 81;
GmLeft.cState = MOTORRUN;
GmRight.cState = MOTORRUN;
/*
* 等待后轉完成
*/
while (GmLeft.cState != MOTORSTOP);
while (GmRight.cState != MOTORSTOP);
}
/*********************************************************************************************************
** Function name: keyCheck
** Descriptions: 讀取按鍵
** input parameters: 無
** output parameters: 無
** Returned value: true: 按鍵已按下
** false: 按鍵未按下
*********************************************************************************************************/
uint8 keyCheck (void)
{
if (GPIOPinRead(GPIO_PORTC_BASE, KEY) == 0) {
delay(50);
while(GPIOPinRead(GPIO_PORTC_BASE, KEY) == 0);
return(true);
}else {
return(false);
}
}
/*********************************************************************************************************
** Function name: SysTick_ISR
** Descriptions: 定時中斷掃描。
** input parameters: 無
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void SysTick_ISR(void)
{
static int32 iL = 0, iR = 0;
/*
* 如果左電機長時間停止,則斷電
*/
if (GmLeft.cState == MOTORSTOP) {
iL++;
} else {
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: voltageDetect
** Descriptions: 電壓檢測,檢測結果在7289 EX BOARD 上顯示出來
** input parameters: 無
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void voltageDetect (void)
{
unsigned long ulVoltage;
ADCProcessorTrigger(ADC_BASE, 0); /* 處理器觸發一次A/D轉換 */
while (!ADCIntStatus(ADC_BASE, 0, false)); /* 等待轉換結束 */
ADCIntClear(ADC_BASE, 0); /* 清除中斷標準位 */
ADCSequenceDataGet(ADC_BASE, 0, &ulVoltage); /* 讀取轉換結果 */
ulVoltage = ulVoltage * 3000 / 1023; /* 計算實際檢測到的電壓值(mV) */
ulVoltage = ulVoltage * 3 + 350; /* 計算電池電壓值(mV) */
zlg7289Download(0,6,1,(ulVoltage % 10000) / 1000); /* 顯示電壓值整數部分,單位V */
zlg7289Download(0,7,0,(ulVoltage % 1000 ) / 100 ); /* 顯示電壓值小數部分,單位V */
}
/*********************************************************************************************************
** 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(); /* 使能系統時鐘中斷 */
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
電腦鼠程序.rar
(74.78 KB, 下載次數: 35)
2018-4-2 21:36 上傳
點擊文件名下載附件
電腦鼠程序
下載積分: 黑幣 -5
作者:
皇叔
時間:
2019-5-16 21:09
感謝樓主的分享,最近正好需要
作者:
micdot
時間:
2019-11-29 11:06
非常不錯的東東,感謝樓主的分享!
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
久久久综合久久
|
伊人网在线综合
|
色视频欧美
|
欧美在线国产精品
|
www.久久
|
国产精品完整版
|
日韩五月天
|
色综合久久天天综合网
|
欧美激情区
|
国产成人精品久久二区二区91
|
秋霞在线一区二区
|
黄色欧美视频
|
国产伦精品一区二区三区四区视频
|
欧州一区
|
欧美一区二区三区在线观看视频
|
99精品欧美一区二区蜜桃免费
|
三级黄色片在线播放
|
久久久久久a
|
一级黄色av电影
|
亚洲精品国产电影
|
国产精品日韩高清伦字幕搜索
|
国产精品乱码一区二三区小蝌蚪
|
午夜视频免费在线
|
亚洲欧美精
|
超碰美女在线
|
久草资源网站
|
99re在线视频观看
|
1000部精品久久久久久久久
|
欧美一级视频在线观看
|
久草资源
|
久久i
|
国产免费一区二区
|
亚洲欧美一区二区三区情侣bbw
|
精品久久国产
|
在线一区
|
久热精品在线
|
啪啪精品
|
91久久国产精品
|
国产一区二区三区久久久久久久久
|
精品国产乱码久久久久久丨区2区
|
成人精品一区二区三区中文字幕
|