- /********************************************************************
- * 名称 : Com_Init()
- * 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
- ***********************************************************************/
- void Com_Init(void)
- {
- TMOD = 0x21;
- PCON = 0x00;
- SCON = 0x50;
- TH1 = 0xFd; //设置波特率 9600
- TL1 = 0xFd;
- TR1 = 1; //启动定时器1
- ES = 1; //开串口中断
- EA = 1; //开总中断
- IT0=0;
- EX0=1;
- }
- /********************************************************************
- * 功能 : 舵机PWM中断初始化
- ***********************************************************************/
- void Timer0Init()
- {
- /*0度=0.5ms, 45度=1ms, 90度=1.5ms, 135度=2ms, 180度=2.5ms
- /.5 ms初始值 F700, (12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700)*/
- TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
- TH0=-ms2_5Con>>8; //给定初值,17ms中断
- TL0=-ms2_5Con;
- EA=1; //总中断打开
- ET0=1; //定时器0中断打开
- TR0=1; //定时器0开关打开
- }
- /********************************************************************
- * 功能 : 舵机PWM中断, //舵机控制函数 周期为20ms 一个循环20MS = 8*2.5ms
- ***********************************************************************/
- void SteeringGear() interrupt 1
- {
- switch(pwm_flag)
- {
- case 1: servo0=1; TH0=-pwm[0]>>8; TL0=-pwm[0]; break;
- case 2: servo0=0; TH0=-(ms2_5Con-pwm[0])>>8; TL0=-(ms2_5Con-pwm[0]); break;
- case 3: servo1=1; TH0=-pwm[1]>>8; TL0=-pwm[1]; break;
- case 4: servo1=0; TH0=-(ms2_5Con-pwm[1])>>8; TL0=-(ms2_5Con-pwm[1]); break;
- case 5: servo2=1; TH0=-pwm[2]>>8; TL0=-pwm[2]; break;
- case 6: servo2=0; TH0=-(ms2_5Con-pwm[2])>>8; TL0=-(ms2_5Con-pwm[2]); break;
- case 7: servo3=1; TH0=-pwm[3]>>8; TL0=-pwm[3]; break;
- case 8: servo3=0; TH0=-(ms2_5Con-pwm[3])>>8; TL0=-(ms2_5Con-pwm[3]); break;
- case 9: servo4=1; TH0=-pwm[4]>>8; TL0=-pwm[4]; break;
- case 10: servo4=0; TH0=-(ms2_5Con-pwm[4])>>8; TL0=-(ms2_5Con-pwm[4]); break;
- case 11: servo5=1; TH0=-pwm[5]>>8; TL0=-pwm[5]; break;
- case 12: servo5=0; TH0=-(ms2_5Con-pwm[5])>>8; TL0=-(ms2_5Con-pwm[5]); break;
- case 13: servo6=1;TH0=-pwm[6]>>8; TL0=-pwm[6]; break;
- case 14: servo6=0;TH0=-(ms2_5Con-pwm[6])>>8; TL0=-(ms2_5Con-pwm[6]); break;
- case 15: servo7=1;TH0=-pwm[7]>>8; TL0=-pwm[7]; break;
- case 16: servo7=0;TH0=-(ms2_5Con-pwm[7])>>8; TL0=-(ms2_5Con-pwm[7]); break;
- default: TH0=0xff; TL0=0x80; pwm_flag=0;
- }
- pwm_flag++;
- }
- void SetSteeringGear(uchar i, uchar val)
- {
- uint a = (val+46)*10;
- if(a<ms0_5Con)
- a=ms0_5Con;
- if(a>ms2_5Con)
- a=ms2_5Con;
- pwm[i]=a;
- CommandDatatable[2]=0xff; //清除缓存
- }
- void SetSteeringGear1(uchar val)
- {
- if(val!=5)
- {
- P10=0;
- }
- if(val==5)
- {
- P10=1;
- }
- }
- void SetSteeringGear2(uchar val)
- {
- if(val!=5)
- {
- P11=0;
- }
- if(val==5)
- {
- P11=1;
- }
- }
- /********************************************************************
- * 名称 :Moto_Forward()
- * 功能 : 电机启动,前进,整车表现为前进。
- ***********************************************************************/
- void Moto_Forward()
- {
- P12=1;
- Delay_1ms(100);
- }
- /********************************************************************
- * 名称 :Moto_Backward()
- * 功能 : 电机启动,后退,整车表现为后退。
- ***********************************************************************/
- void Moto_Backward()
- {
- P14=1;
- }
- /********************************************************************
- * 名称 :Moto_TurnLeft()
- * 功能 : 舵机左转45度,电机前进,整车表现为左转。
- ***********************************************************************/
- void Moto_TurnLeft()
- {
- SetSteeringGear(0x01,0x87);
- P12=1;
- }
- /********************************************************************
- * 名称 :Moto_TurnRight()
- * 功能 : 舵机右转45度135度,电机前进,整车表现为右转。
- ***********************************************************************/
- void Moto_TurnRight()
- {
- SetSteeringGear(0x01,0x2D);
- P12=1;
- }
- /********************************************************************
- * 名称 :Moto_Stop()
- * 功能 : 电机停止,舵机至0位90度,整车表现为停止。54为校准后小车能走直线。
- ***********************************************************************/
- void Moto_Stop()
- {
- SetSteeringGear(0x1,0x54);
- P1= 0x00;
- }
- /********************************************************************
- * 功能 : 串口中断接收数据
- ***********************************************************************/
- /*********************************************************************************
- ** 函数功能 : 主函数
- *********************************************************************************/
- void main()
- {
- Delay_1ms(6000);
- Delay_1ms(6000);
- Delay_1ms(6000);
- Delay_1ms(6000);
- Com_Init();//串口初始化
- Timer0Init();//舵机PWM中断初始化
- while(1)
- {
- if(CommandDatatable[0]==0XFF && CommandDatatable[4]==0XFF)
- {
- switch (CommandDatatable[1]) //根据键值不同,执行不同的内容
- {
- case 0X00: //类型位0X00,表明是控制数据包,进入控制数据case
- switch(CommandDatatable[2]) //根据数据位的值来进行选择执行不同的动作
- {
- case 0X00:Moto_Stop();break;
- case 0X01:Moto_Forward();break;
- case 0X02:Moto_Backward();break;
- case 0X03:Moto_TurnLeft();break;
- case 0X04:Moto_TurnRight();break;
- default : break;
- }
- break;
- case 0X01: //类型位0X01,表明是舵机数据包,进入舵机case
- switch(CommandDatatable[2])
- {
- case 0x02:SetSteeringGear(1,CommandDatatable[3]);break;
- case 0x03:SetSteeringGear(2,CommandDatatable[3]);break;
- case 0x04:SetSteeringGear(3,CommandDatatable[3]);break;
- case 0x05:SetSteeringGear(4,CommandDatatable[3]);break;
- case 0x06:SetSteeringGear(5,CommandDatatable[3]);break;
- case 0x07:SetSteeringGear(6,CommandDatatable[3]);break;
- case 0x08:SetSteeringGear(7,CommandDatatable[3]);break;
- default : break;
- }
- break;
- case 0X02:
- switch(CommandDatatable[2])
- {
- case 0X01:SetSteeringGear1(CommandDatatable[3]);break;
- case 0X02:SetSteeringGear2(CommandDatatable[3]);break;
- defaul : break;
- }
- break;
- case 0X04: //类型位0X04,表明是大灯数据包,进入大灯case
- switch(CommandDatatable[2])
- {
- case 0X01:Light=0;break;
- case 0X00:Light=1;break;
- default : break;
- }
- break;
- default : break;
- }
- }
- }
- }
复制代码 |