- #include<reg60s2.h>//芯片头文件 寄存器已经修改
- #include<math.h>
- #include<delay.h> //延时程序 通过示波器测试
- #define uchar unsigned char
- #define uint unsigned int
- sbit KG=P1^7; //开关的位置
- uchar position[8];//用于记录8个舵机的位置
- uchar pick_up[8]; //kouchu[8];各个io口轮流输出是屏蔽其它位
- uchar arr[8]; //提供排序空间 paixu_ncha[8]=0;中间过度用
- uchar t0bit=0; //定时器0周期相同标志位
- uchar N;
- void first();
- void second();
- void three();
- //void four();
- //关于扫尾值的参数
- //uchar zsax=15; //14h,z 平面sa 修正参数 p da z xiao
- //uchar psax=10; //15h,p 平面sa 修正参数交互2
- //uchar zsag=20; //16h,z 平面sa 过渡参数
- //uchar psag=20;//17h,p 平面sa 过渡参数
- /*************************************************************************************
- 函数名称:void low_level_500u
- 函数功能:PWM信号低电平时间子程序,控制舵机PWM信号的低电平时间决定舵机转动的速度 积分思想
- 输入 : time
- 输出 :无
- *************************************************************************************/
- void low_level_500u(uint time)
- {
- uint i;
- for(i=0;i<time;i++)
- {delay500us(1);}
- }
- /*************************************************************************************
- 函数名称:void t0_init
- 函数功能:t0定时器初始化,用于舵机2.5ms定时
- 输入 :无
- 输出 :无
- 备注 :没有开启定时
- *************************************************************************************/
- void t0_init(void) //定时器初始化
- {
- TMOD = TMOD & 0xf0; //初始化定时器1的计数方式为方式1 无用
- TMOD = TMOD | 0x01;
- TH0=0xee; //22.1184MHz,2.5Ms定时ee00
- TL0=0x00;
- ET0=1;
- EA=1;
- t0bit=1;
- }
- /*************************************************************************************
- 函数名称:void low_level_t0
- 函数功能:同周期定时器0设置及启动程序,使每变化一个变化量的周期相同 给寄存器填值
- 输入 :THTL
- 输出 :无
- *************************************************************************************/
- void low_level_t0(uint THTL) //定时器调用函数
- {
- TH0=THTL>>8; //22.1184MHz,2.5Ms定时ee00
- TL0=THTL;
- t0bit=0;
- TR0=1;
- }
- /*************************************************************************************
- 函数名称:void T0_Interrupt(void) interrupt 1
- 函数功能:定时器t0中断服务函数函数 中断一次填一次值 标记一次一个2.5ms到了
- 输入 :
- 输出 :无
- *************************************************************************************/
- void T0_Interrupt(void) interrupt 1 //定时器中断函数 中断一次填一次值 标记一次一个2.5ms到了
- {
- TH0=0xee; //22.1184MHz,2.5Ms定时ee00
- TL0=0x00;
- t0bit=1;
- }
- /*************************************************************************************
- 函数名称:init_cpu
- 函数功能:单片机初始化程序
- 输入 :无
- 输出 :无
- *************************************************************************************/
- void init_cpu(void)
- {
- t0_init(); //定时器0初始化
- delay500us(10);
- }
- /*************************************************************************************
- 函数名称:array()
- 函数功能:排序子程序,将各个口的8位根据时间的长短排序 提供arr[i]=arr[i]- arr[i+1]相邻差值
- 输入 :无
- 输出 :无
- *************************************************************************************/
- void array()
- {
- uchar i=0,j=0,x=0;
- pick_up[0]=0xFE;
- pick_up[1]=0xFD;
- pick_up[2]=0xFB;
- pick_up[3]=0xF7;
- pick_up[4]=0xEF;
- pick_up[5]=0xDF;
- pick_up[6]=0xBF;
- pick_up[7]=0x7F; //赋值
- //冒泡排序
- for(i=0;i<=7;i++)
- { for(j=i+1;j<=8;j++)
- {
- if(arr[i]<arr[j])//交换数据
- {
- x=arr[j];
- arr[j]=arr[i];
- arr[i]=x;
-
- x=pick_up[j];
- pick_up[j]=pick_up[i];
- pick_up[i]=x;
- }
- }
- }
- for(i=0;i<7;i++)
- {
- arr[i]= arr[i]- arr[i+1];
- }
- }
- /*************************************************************************************
- 函数名称:void PWM_8()
- 函数功能:8路舵机输出子程序,实现8路舵机的PWM信号在最短的时间内输出
- 输入 :position[i]
- 输出 :无
- 备注 :P0口
- *************************************************************************************/
- void PWM_8()
- {
- uchar i=0,j;
- for(i=0;i<8;i++) //取P0口舵机对应的值
- {arr[i]=position[i];}
- array(); //排序计算
- low_level_t0(0xee00); //开启定时器并赋初始值, 22.1184MHz,2.5Ms定时ee00
- P0=0xff; //使口P0全部拉高
- delay500us(1); //调用延时500us函数
- for(i=0;i<8;i++) //P0口8路同时输出
- {
- for(j=0;j<arr[7-i];j++) //此时arr为(安位置大小)相邻舵机位置相差值
- {delay8us(1);}
- P0=P0&pick_up[7-i]; //此时pick_up为 代表的是那一位为0 逻辑与后拉低
- }
- while(t0bit==0); //等待2.5ms应该说是一个周期的到来 可自定义
- TR0=0; //关闭定时器0
- }
- /*************************************************************************************
- 函数名称:initial_position();
- 函数功能:初始位置子程序,根据各个舵机的不同位置设置初始位置
- 输入 :无
- 输出 :无
- *************************************************************************************/
- void initial_position(void)
- {
- uint i,j,x=0;
- for(i=0;i<30;i++)
- { x++;
- /////初始
- // position[0]=143; //-后
- // position[1]=92; //-后
- // position[2]=126; //-前
- // position[3]=131; // +后
- // position[4]=128; //+前
- // position[5]=136; // -后
- // position[6]=127; //+后
- // position[7]=172; // -前
-
-
- position[0]=145; //-后
- position[1]=100; //-后
- position[2]=88; //-前
- position[3]=100; // +后
- position[4]=96; //+前
- position[5]=169; // -后
- position[6]=167; //+后
- position[7]=137; // -前
- PWM_8();
- if(x<10)
- {j=20;j--;
- low_level_500u(j);
- }
- else
- { j=10;
- j++;
- low_level_500u(j);
- }
- }
- }
- /*************************************************************************************
- 函数名称:main
- 函数功能:入口函数
- 输入 :无
- 输出 :无
- *************************************************************************************/
- void main(void)
- {
- SP=0x70; //堆栈指针初始化
- P0M1 = 0x00;//P0 as Digital OUTPUT
- P0M0 = 0x00;
-
- init_cpu();//初始化cpu 设置定时器
- delay500us(10);
- P0=0xff;
- delay500ms(1);
- initial_position();//初始位置
- delay500ms(1);
-
- while(KG)
- {
- if(!KG)
- delay500us(1); //调用延时500us函数
- if(!KG)
- break;
- }
- while(1)
- {
- first();
- // second();
- // three();
- // four();
- }
- while(1);
- }
- //前进****************************************************************************************************************
- //---------------------------------------------
- void first ()
- {
- uint i=0;
- for(i=0;i<1;i++)
- {
- position[0]=145; //-后
- position[1]=95; //-后
- position[2]=88; //-前
- position[3]=100; // +后
- position[4]=96; //+前
- position[5]=169; // -后
- position[6]=167; //+后
- position[7]=137; // -前
- PWM_8();
- delay10ms(50);
- }
- for(i=0;i<1;i++)
- {
- position[0]=90; //-后
- position[1]=95; //-后
- position[2]=88; //-前
- position[3]=100; // +后
- position[4]=96; //+前
- position[5]=169; // -后
- position[6]=167; //+后
- position[7]=137; // -前
- PWM_8();
- delay1s(2);
- }
- for(i=0;i<1;i++)
- {
- position[0]=145; //-后
- position[1]=95; //-后
- position[2]=88; //-前
- position[3]=100; // +后
- position[4]=96; //+前
- position[5]=169; // -后
- position[6]=167; //+后
- position[7]=137; // -前
- PWM_8();
- delay1s(1);
- }
- for(i=0;i<1;i++)
- {
- position[0]=145; //-后
- position[1]=100; //-后
- position[2]=88; //-前
- position[3]=100; // +后
- position[4]=96; //+前
- position[5]=169; // -后
- position[6]=167; //+后
- position[7]=137; // -前
- PWM_8();
- delay1s(1);
- }
-
-
-
-
- }
- //*************************************************************
- //----------------------------------------------------------------------------------------------------
- //前进****************************************************************************************************************
- //
- //
- //
- ////向左****************************************************************************************************************
- ////---------------------------------------------
- // void first ()
- // {
- //
- //
- // uint i=0;
- // for(i=0;i<1;i++)
- // {
- //
- // position[0]=106; //-后
- // position[1]=67; //-后
- // position[2]=108; //-前
- // position[3]=80; // +后
- // position[4]=76; //+前
- // position[5]=169; // -后
- // position[6]=167; //+后
- // position[7]=137; // -前
- //
- // PWM_8();
- // delay10ms(50);
- // }
- //
- ////*****************************************************
- // for (i=0;i<40;i++)
- // {
- // position[1]+=1; //-后
- // if (i>10&&i<38)
- // {
- // position[1]-=1; //+前
- // }
- //
- // position[2]+=1; //-前
- // if (i>20)
- // {
- // position[2]-=1; //+前
- // }
- // position[3]+=1; // +后
- // if (i>20)
- // {
- // position[3]-=1; //+前
- // }
- // position[4]+=1; //+前
- // if (i>10&&i<38)
- // {
- // position[4]-=1; //+前
- // }
- // PWM_8();
- // delay1ms(5);
- //
- // }
- //
- ////**************************************************************************
- //
- //
- //
- // for (i=0;i<1;i++)
- // {
- // position[0]=108; //-后
- // position[1]=84; //-后
- // position[2]=126; //-前
- // position[3]=131; // +后
- // position[4]=125; //+前
- // position[5]=180; // -后
- // position[6]=165; //+后
- // position[7]=137; // -前
- //
- // PWM_8();
- // delay10ms(5);
- // }
- //
- //
- // for (i=0;i<1;i++)
- // {
- // position[0]=108; //-后
- // position[1]=84; //-后
- // position[2]=126; //-前
- // position[3]=131; // +后
- // position[4]=125; //+前
- // position[5]=235; // -后
- // position[6]=165; //+后
- // position[7]=25; // -前
- //
- // PWM_8();
- // delay10ms(10);
- // }
- //
- // for (i=0;i<1;i++)
- // {
- //
- // position[0]=155; //-后
- // position[1]=84; //-后
- // position[2]=126; //-前
- // position[3]=131; // +后
- // position[4]=125; //+前
- // position[5]=235; // -后
- // position[6]=90; //+后
- // position[7]=25; // -前
- // PWM_8();
- // delay10ms(10);
- // }
- //
- // for (i=0;i<1;i++)
- // {
- //
- // position[0]=155; //-后
- // position[1]=84; //-后
- // position[2]=126; //-前
- // position[3]=131; // +后
- // position[4]=125; //+前
- // position[5]=235; // -后
- // position[6]=90; //+后
- // position[7]=60; // -前
- // PWM_8();
- // delay10ms(10);
- // }
- //
- // //**************************************************************
- // for (i=0;i<40;i++)
- // {
- // position[0]+=1; //-后
- // if (i>27)
- // {
- // position[0]-=1; //+前
- // }
- // position[1]+=1; //-后
- // if (i>15&&i<32)
- // {
- // position[1]-=1; //+前
- // }
- // position[2]+=1; //-前
- // position[3]+=1; // +后
- // position[4]+=1; //+前
- // position[5]-=4; // -后
- // if (i>35)
- // {
- // position[5]+=4; //+前
- // }
- // position[6]-=1; //+后
- // if (i>3)
- // {
- // position[6]+=1; //+前
- // }
- // position[7]+=4; // -前
- // if (i>39)
- // {
- // position[7]-=4; //+前
- // }
- // PWM_8();
- // delay1ms(5);
- //
- // }
- //
- ////**************************************************************
- //
- // }
- //
- //
- //
- //
- //
- //
- //
- //
- //
- //
- //
- //
- // void second ()
- // {
- // uint i=0;
- // for(i=0;i<1;i++)
- // {
- //
- // position[0]=163; //-后
- // position[1]=124; //-后
- // position[2]=166; //-前
- // position[3]=171; // +后
- // position[4]=165; //+前
- // position[5]=110; // -后
- // position[6]=107; //+后
- // position[7]=194; // -前
- // PWM_8();
- // delay10ms(50);
- // }
- //
- ////**************************************************************
- // for (i=0;i<40;i++)
- // {
- // position[0]-=1; //-后
- // if (i>20)
- // {
- // position[0]-=1; //+前
- // }
- // position[5]+=1; //-前
- // if (i>5)
- // {
- // position[5]-=1; //+前
- // }
- // position[6]+=1; // +后
- // if (i>20)
- // {
- // position[6]-=1; //+前
- // }
- // position[7]-=1; //+前
- // if (i>5&&i<40)
- // {
- // position[7]+=1; //+前
- // }
- // PWM_8();
- // delay1ms(5);
- //
- // }
- //
- ////**************************************************************
- // for (i=0;i<1;i++)
- // {
- // position[0]=143; //-后
- // position[1]=139; //-后
- // position[2]=174; //-前
- // position[3]=177; // +后
- // position[4]=171; //+前
- // position[5]=132; // -后
- // position[6]=127; //+后
- // position[7]=176; // -前
- // PWM_8();
- // delay10ms(5);
- // }
- //
- // for (i=0;i<1;i++)
- // {
- // position[0]=143; //-后
- // position[1]=240; //-后
- // position[2]=174; //-前
- // position[3]=177; // +后
- // position[4]=235; //+前
- // position[5]=132; // -后
- // position[6]=127; //+后
- // position[7]=176; // -前
- // PWM_8();
- // delay10ms(10);
- // }
- //
- // for (i=0;i<1;i++)
- // {
- // position[0]=143; //-后
- // position[1]=240; //-后
- // position[2]=114; //-前
- // position[3]=120; // +后
- // position[4]=235; //+前
- // position[5]=132; // -后
- // position[6]=127; //+后
- // position[7]=176; // -前
- // PWM_8();
- // delay10ms(10);
- // }
- //
- //
- // for (i=0;i<1;i++)
- // {
- // position[0]=143; //-后
- // position[1]=200; //-后
- // position[2]=114; //-前
- // position[3]=120; // +后
- // position[4]=235; //+前
- // position[5]=132; // -后
- // position[6]=127; //+后
- // position[7]=176; // -前
- // PWM_8();
- // delay10ms(10);
- // }
- //
- //
- //
- ////******************************************************
- // for (i=0;i<40;i++)
- // {
- // position[0]-=1; //-后
- // if (i>36)
- // {
- // position[0]+=1; //+前
- // }
- // position[1]-=3; //-后
- // if (i>37)
- // {
- // position[1]+=3; //+前
- // }
- // position[2]-=1; //-前
- // if (i>27)
- // {
- // position[2]+=1; //+前
- // }
- // position[3]-=1; // +后
- // if (i>25)
- // {
- // position[3]+=1; //+前
- // }
- // position[4]-=4; //+前
- // if (i>35)
- // {
- // position[4]+=4; //+前
- // }
- // position[5]+=1; // -后
- // if (i>37)
- // {
- // position[5]-=1; //+前
- // }
- // position[6]+=1; //+后
- // position[7]-=2; // -前
- // if (i>15&&i<32)
- // {
- // position[7]+=2; //+前
- // }
- // PWM_8();
- // delay1ms(5);
- //
- // }
- ////*************************************************************
- //
- //
- //
- // }
- //
- //----------------------------------------------------------------------------------------------------
- ////向左****************************************************************************************************************
- ////向右****************************************************************************************************************
- ////---------------------------------------------
- // void first ()
- // {
- //
- //
- // uint i=0;
- // for(i=0;i<1;i++)
- // {
- //
- // position[0]=108; //-后
- // position[1]=70; //-后
- // position[2]=66; //-前
- // position[3]=92; // +后
- // position[4]=92; //+前
- // position[5]=167; // -后
- // position[6]=165; //+后
- // position[7]=97; // -前
- //
- // PWM_8();
- // delay10ms(50);
- // }
- //
- ////*****************************************************
- // for (i=0;i<41;i++)
- // {
- // position[1]+=1; //-后
- // position[2]+=1; //-前
- // position[3]+=1; // +后
- // position[4]+=1; //+前
- // PWM_8();
- // delay1ms(1);
- //
- // }
- //
- ////**************************************************************************
- //
- //
- //
- // for (i=0;i<1;i++)
- // {
- // position[0]=108; //-后
- // position[1]=132; //-后
- // position[2]=131; //-前
- // position[3]=139; // +后
- // position[4]=137; //+前
- // position[5]=167; // -后
- // position[6]=165; //+后
- // position[7]=97; // -前
- //
- // PWM_8();
- // delay10ms(20);
- // }
- //
- //
- // for (i=0;i<1;i++)
- // {
- // position[0]=108; //-后
- // position[1]=132; //-后
- // position[2]=131; //-前
- // position[3]=139; // +后
- // position[4]=137; //+前
- // position[5]=204; // -后
- // position[6]=165; //+后
- // position[7]=20; // -前
- //
- // PWM_8();
- // delay10ms(20);
- // }
- //
- // for (i=0;i<1;i++)
- // {
- //
- // position[0]=150; //-后
- // position[1]=132; //-后
- // position[2]=129; //-前
- // position[3]=139; // +后
- // position[4]=137; //+前
- // position[5]=204; // -后
- // position[6]=90; //+后
- // position[7]=20; // -前
- // PWM_8();
- // delay10ms(20);
- // }
- //
- //
- //
- //
- //
- // }
- //
- //
- //
- //
- //
- //
- //
- //
- //
- //
- //
- //
- // void second ()
- // {
- // uint i=0;
- // for(i=0;i<1;i++)
- // {
- //
- // position[0]=178; //-后
- // position[1]=179; //-后
- // position[2]=174; //-前
- // position[3]=177; // +后
- // position[4]=171; //+前
- // position[5]=66; // -后
- // position[6]=63; //+后
- // position[7]=169; // -前
- // PWM_8();
- // delay10ms(50);
- // }
- //
- ////**************************************************************
- // for (i=0;i<41;i++)
- // {
- // position[0]-=1; //-后
- // position[5]+=1; //-前
- // position[6]+=1; // +后
- // position[7]-=1; //+前
- // if (i>36)
- // {
- // position[7]+=1; //+前
- // }
- // PWM_8();
- // delay1ms(1);
- //
- // }
- //
- ////**************************************************************
- // for (i=0;i<1;i++)
- // {
- // position[0]=136; //-后
- // position[1]=179; //-后
- // position[2]=174; //-前
- // position[3]=177; // +后
- // position[4]=171; //+前
- // position[5]=130; // -后
- // position[6]=130; //+后
- // position[7]=132; // -前
- // PWM_8();
- // delay10ms(20);
- // }
- //
- // for (i=0;i<1;i++)
- // {
- // position[0]=136; //-后
- // position[1]=254; //-后
- // position[2]=174; //-前
- // position[3]=177; // +后
- // position[4]=202; //+前
- // position[5]=130; // -后
- // position[6]=130; //+后
- // position[7]=132; // -前
- // PWM_8();
- // delay10ms(20);
- // }
- //
- // for (i=0;i<1;i++)
- // {
- // position[0]=136; //-后
- // position[1]=254; //-后
- // position[2]=124; //-前
- // position[3]=120; // +后
- // position[4]=202; //+前
- // position[5]=130; // -后
- // position[6]=130; //+后
- // position[7]=132; // -前
- // PWM_8();
- // delay10ms(20);
- // }
- //
- //}
- //
- //
- //
- //
- //
- //////----------------------------------------------------------------------------------------------------
- //////向右****************************************************************************************************************
复制代码 |