|
不好意思啊,这是我写的程序,麻烦大神帮我看看
#include
#define uint unsigned int
void Initclock();
void InitIO();
void Speed(uint a,uint b,uint c,uint d,uint e,uint f);
void Mydelay(uint t);
void Back(uint x,uint y,uint z);
void main()
{
WDTCTL = WDTPW + WDTHOLD;
Initclock();//主时钟和子系统时钟频率为4M,辅助时钟为10khz
InitIO();
while(1)
{
switch(P3IN&0xf0)
{
case 0x00: //四个全不在黑带上
case 0xf0:
Back(2300,2300,2500);//倒退
P1SEL&=~(BIT4+BIT5);
P1OUT&=~(BIT4+BIT5);
Mydelay(20);
break;
case 0x10: //最左边一个在黑带上
Speed(2200,2200,2490,2490,2500,2500);//循迹左转 周期为0.5S
P1SEL&=~(BIT2+BIT3);
P2SEL&=~(BIT4+BIT5);
P1OUT&=~(BIT2+BIT3);
P2OUT&=~(BIT4+BIT5);
Mydelay(20);//反应时间
break;
case 0x20: //最左边旁边一个在黑带上
Speed(2300,2300,2400,2400,2500,2500);//循迹左转 周期为0.5S
P1SEL&=~(BIT2+BIT3);
P2SEL&=~(BIT4+BIT5);
P1OUT&=~(BIT2+BIT3);
P2OUT&=~(BIT4+BIT5);
Mydelay(20);//反应时间
break;
case 0x30: //最左边和它旁边的一个在黑带上
Speed(2300,2300,2400,2400,2500,2500);//循迹左转
P1SEL&=~(BIT2+BIT3);
P2SEL&=~(BIT4+BIT5);
P1OUT&=~(BIT2+BIT3);
P2OUT&=~(BIT4+BIT5);
Mydelay(20);//反应时间
break;
case 0x60: //中间两个在黑带上
Speed(2200,2200,2200,2200,2500,2500);//循迹直
P1SEL&=~(BIT2+BIT3);
P2SEL&=~(BIT4+BIT5);
P1OUT&=~(BIT2+BIT3);
P2OUT&=~(BIT4+BIT5);
Mydelay(20);//反应时间
break;
case 0x40: //最右边旁边一个在黑带上
Speed(2490,2490,2300,2300,2500,2500);//循迹右转
P1SEL&=~(BIT2+BIT3);
P2SEL&=~(BIT4+BIT5);
P1OUT&=~(BIT2+BIT3);
P2OUT&=~(BIT4+BIT5);
Mydelay(20);//反应时间
break;
case 0x80: //最右边一个在黑带上
Speed(2490,2490,2200,2200,2500,2500);//循迹右转
P1SEL&=~(BIT2+BIT3);
P2SEL&=~(BIT4+BIT5);
P1OUT&=~(BIT2+BIT3);
P2OUT&=~(BIT4+BIT5);
Mydelay(20);//反应时间
break;
case 0xC0: //最右边和它旁边的一个在黑带
Speed(2490,2490,2300,2300,2500,2500);//循迹右转
P1SEL&=~(BIT2+BIT3);
P2SEL&=~(BIT4+BIT5);
P1OUT&=~(BIT2+BIT3);
P2OUT&=~(BIT4+BIT5);
Mydelay(20);//反应时间
break;
case 0x70: //左边三个在黑带上
Speed(1400,1400,2495,2495,2500,2500);//循迹左直转
P1SEL&=~(BIT2+BIT3);
P2SEL&=~(BIT4+BIT5);
P1OUT&=~(BIT2+BIT3);
P2OUT&=~(BIT4+BIT5);
Mydelay(20);//反应时间
break;
case 0xe0: //右边三个在黑带上
Speed(2495,2495,1400,1400,2500,2500);//循迹右直转
P1SEL&=~(BIT2+BIT3);
P2SEL&=~(BIT4+BIT5);
P1OUT&=~(BIT2+BIT3);
P2OUT&=~(BIT4+BIT5);
Mydelay(20);//反应时间
break;
default:
P1SEL&=~(BIT2+BIT3);
P2SEL&=~(BIT4+BIT5);
P1OUT&=~(BIT2+BIT3);
P2OUT&=~(BIT4+BIT5);
Mydelay(10);
break;
}
}
}
void Initclock()
{
int i;
P5SEL |= BIT2+BIT3; //将IO配置为XT2功能
UCSCTL6&=~XT2OFF;//选择XT2作为时钟源 4M
UCSCTL3 |= SELREF_2; //FLL模块的参考时钟源选择REFO
UCSCTL4 = UCSCTL4&(~(SELA_7))|SELA_1; //先将ACLK配置为VLOCLK 10khz
do{
UCSCTL7&=~(XT2OFFG+DCOFFG+XT1LFOFFG);
SFRIFG1&=~OFIFG;//清除振荡器失效标志
for(i=0xff;i>0;i--);//稳定时间
}while((SFRIFG1&OFIFG)!=0);//如果振荡器失效则继续循环
UCSCTL4|=SELM__XT2CLK + SELS__XT2CLK ;//主时钟的信号源为XT2,子系统时钟的信号源也为XT2,
//UCSCTL5 =DIVS__4;//子系统时钟4分频 1M,主时钟4M
}
void InitIO()
{
P1SEL|=BIT2+BIT3; //声明有特殊功能,不做普通 I/O使用
P2SEL|=BIT4+BIT5;
P1DIR|=BIT2+BIT3; //输出
P2DIR|=BIT4+BIT5;
//P1DS|=BIT2+BIT3;
//P2DS|=BIT4+BIT5;
P3DIR|=BIT0+BIT1; //输出
P3OUT&=~(BIT0+BIT1);//输出低电平
P1DIR|=BIT4+BIT5; //接两个后轮负端
P1SEL|=BIT4+BIT5; //声明有特殊功能,不做普通I/O口使用
P1OUT&=~(BIT4+BIT5);//输出低电平
P3DIR&=~(BIT4+BIT5+BIT6+BIT7);//红外对管读取高低电平
P3REN|=BIT4+BIT5+BIT6+BIT7;
}
/*a为TAOCCR1的值,b为TAOCCR2的值 ,c为TA2CCR1的值 ,d为TA2CCR2的值,e为TA0CCR0的值,f为TA2CCR0的值
TA0CCR1控制D轮,TA0CCR2控制B轮,TA2CCR1控制C轮,TA2CCR2控制A轮*/
void Speed(uint a,uint b,uint c,uint d,uint e,uint f)
{
P1SEL|=(BIT2+BIT3);
P2SEL|=(BIT4+BIT5);
//TA0CCTL0=CCIE; //定时器 A0的捕获比较器0开启 CCIFG位中断
TA0CCR0=e; //置入计数终值,则 PWM周期为4s
//TA0CCTL1=CCIE; //捕获比较器1开启中断
TA0CCR1=a;
//TA0CCTL2=CCIE; //捕获比较器2开启中断
TA0CCR2=b;
//TA2CCTL0=CCIE; //定时器 A2的捕获比较器0开启 CCIFG位中断
TA2CCR0=f; //周期为2S
//TA2CCTL1=CCIE; //捕获比较器1开启中断
TA2CCR1=c;
//TA2CCTL2=CCIE; //捕获比较器4开启中断
TA2CCR2=d; //d为47000时,6.4ms
TA0CTL|=TACLR; //将计时器 A0清零
TA2CTL|=TACLR;
TA0CTL|=TASSEL_1+MC_3; //定时器选择 ACLK作为时钟源,且为 连续计数模式
TA2CTL|=TASSEL_1+MC_3; //定时器选择 ACLK作为时钟源,且为 连续计数模式
TA0CCTL1=OUTMOD_4; //定时器 A1中的捕获比较器1,输出模式为4翻 转
TA0CCTL2=OUTMOD_4;
TA2CCTL1=OUTMOD_4;
TA2CCTL2=OUTMOD_4;
Mydelay(50);
}
void Back(uint x,uint y,uint z)
{
//TA0CCTL0=CCIE; //定时器 A0的捕获比较器0开启 CCIFG位中断
TA0CCR0=z; //置入计数终值,则 PWM周期为4s
//TA0CCTL3=CCIE; //捕获比较器3开启中断
TA0CCR3=x;
//TA0CCTL4=CCIE; //捕获比较器4开启中断
TA0CCR4=y;
P1SEL&=~(BIT2+BIT3); //关闭第二功能
P2SEL&=~(BIT4+BIT5);
P1OUT&=~(BIT2+BIT3);
P2OUT&=~(BIT4+BIT5);
P1SEL|=BIT4+BIT5;
TA0CTL|=TACLR; //将计时器 A0清零
TA0CTL|=TASSEL_1+MC_3;
TA0CCTL3=OUTMOD_4;
TA0CCTL4=OUTMOD_4;
Mydelay(50);
}
void Mydelay(uint t)
{
int i;
while(t--)
{
for(i=0;i<=4000;i++);///延时1ms
}
} |
|