基于MSP430单片机控制坦克打靶C语言源程序代码
1基于MSP430单片机控制坦克打靶C语言源程序代码.zip
(30.63 KB)
/************************* Header Files ***********************************/
#include <msp430x14x.h>
#include "sysconfiger.h"
/**************************** Tab Code ***************************************/
//步进电机驱动编码
unsigned char bjdj[] = {0x10, 0x20, 0x40, 0x80};//P3口高4位驱动
/**************************** Variable ***************************************/
unsigned char miao = 0, m16 = 0;
//Debug
unsigned char test = 0, cish = 0;
/****************************** 服务函数 *************************************/
/**************************** Interrupt Function *****************************/
#pragma vector = TIMERB0_VECTOR
__interrupt void Timerb0(void)
{
unsigned char tP1IN = P1IN & 0x07;//BIT1
static unsigned char flag = 1;
m16++;
if((cish < 5) && flag)//Don't finish
{
if(m16 == 16)//1/16s(62.5ms) 中断一次
{
m16 = 0;
miao++;
if(miao == 60)//60s 定时
{
P1IE = 0x00;//Disable Port1 Interruption
flag = 0;
stop();//car stop
}
}
}
else//cish == 5;
{
P6OUT ^= BIT7;
P2OUT ^= BIT7;
if(m16 == 32)
{
P6OUT = 0xff;//Close Buzzer
P1IE = 0x00;//Disable Port1 Interruption
TBCCTL0 &= ~CCIE;//Disable TimerB
}
}
if(tP1IN == 0x02)//转弯成功后P1.1 == 1,直行,每(62.5ms)检测一次
{
ahead();//car goon
test = 0;//
}
P2OUT ^= BIT0;//LED闪烁灯
}
/***************************** Interrupt Function ****************************/
//寻迹由端口1接入 进入中断后 查询引脚电平 做出相应动作 实现自动寻迹
//左 中 右
//P1.2 P1.1 P1.0 P1IN 状态
// 0 1 0 0x02 直走
// 1 1 0 0x06 右偏转 左转校正
// 0 1 1 0x03 左偏转 右转校正
// 1 1 1 0x07 射击黑线 根据要求执行
//偏离2cm检测
// 1 0 0 0x04 右偏转2cm 左转校正
// 0 0 1 0x01 左偏转2cm 右转校正
//端口配置
// P1.0 ~ P1.2
// P1DIR = 0xf8;//1111 1000
// P1IE = 0x07;//0000 0111
// P1IES = 0x02;//0000 0010
// P2.3 左车轮
// P2.4 右车轮
//Debug 状态分配 0 - ahead, 1 - turn right, 2 - turn left, 3 - stop, 4 - others
#pragma vector = PORT1_VECTOR
__interrupt void Port1(void)
{
unsigned char tPIN = P1IN & 0x07;
switch(tPIN)
{
case 0x01:// > 2cm turn right
turn_right();
warning();
test = 1;
break;
case 0x02://ahead
ahead();
test = 0;
break;
case 0x03://turn right
turn_right();
test = 1;
break;
case 0x04:// > 2cm turn left
turn_left();
warning();
test = 2;
break;
case 0x06://turn left
turn_left();
test = 2;
break;
case 0x07://black line
warning();//声光报警
stop();//停车
test = 3;
cish++;
delay(200);//
ahead();
break;
default://others
warning();
test = 4;
break;
}
P1IFG &= 0x00;//Clear P1IFG
P2OUT ^= BIT1;//Debug Test
}
/******************************* Main ***************************************/
void main()
{
//Stop WDT
WDTCTL = WDTPW + WDTHOLD;
//端口配置
IO_cfg();
//时钟配置
Timer_cfg();
//Open EA
_EINT();
while(1)
{
disp_LED();
}
}
/******************************************************************************/
|