资源简介

跷跷板程序,学习PId算法的经典例子,希望对大家有帮助;

资源截图

代码片段和文件信息

#include
sbit p1_0=P1^0;//电机旋转控制
sbit p1_1=P1^1;//电机旋转控制
sbit p1_2=P1^2;//电机使能控制
sbit p1_3=P1^3;//电机旋转控制
sbit p1_4=P1^4;//电机旋转控制
sbit p1_5=P1^5;//电机使能控制
sbit E_CLK=P1^6;//LCD显示。时钟输入
sbit RW_SID=P1^7;//LCD显示。数据输入
sbit p2_0=P2^0;//前进循迹方向信号
sbit p2_1=P2^1;//前进循迹方向信号
sbit p2_2=P2^2;//前进循迹方向信号
sbit p2_3=P2^3;//跷跷板平衡信号
sbit p2_4=P2^4;//跷跷板平衡信号
sbit p2_5=P2^5;//跷跷板平衡信号
sbit p2_6=P2^6;//后退循迹方向信号
sbit p2_7=P2^7;//避障传感器信号
sbit p3_2=P3^2;//温度传感器信号
sbit p3_4=P3^4;//蜂鸣器信号控制
sbit p3_6=P3^6;//状态切换键信号
sbit p3_7=P3^7;//暂停/开始键信号


/****************************************显示用变量*************************************************************/
char sec1=48/*显示,秒十分位*/sec2=48/*显示,秒个位*/sec3=48/*显示,秒十位*/sec4=48/*显示,秒百位*/;
char sd1=48/*显示,速度十分位*/sd2=48/*显示,速度个位*/sd3=48/*显示,速度十位*/sd4=48/*显示,速度百位*/;
char lc1=48/*显示,路程百分位*/lc2=48/*显示,路程十分位*/lc3=48/*显示,路程个位*/lc4=48/*显示,路程十位*/;
int xszt1=0xD1/*显示,状态*/xszt2=0xAD/*显示,状态*/xszt3=0xBC/*显示,状态*/xszt4=0xA3/*显示,状态*/;

/****************************************跷跷板平衡用变量*******************************************************/
long qj=10/*前进参数*/ht=1/*后退参数*/tz=0/*平衡状态参数*/bf=600/*步进*/;
int cs=0/*跷跷板翻的次数*/fdd=6/*防抖动系数*/fx=0/*前一次运动方向,标志*/ph=0/*平衡的持久度*/;
int fy=0/*反应时间*/cf=1/*冲锋标志*/bc=0/*是否补偿标志*/phzt=0/*平衡状态*/dd=0/*等待时间*/;

/****************************************通用变量****************************************************************/
int a/**/b/**/l/**/r/**/i/**/jm=0/**/k/**/zt=1/*循迹、避障、平衡状态标志*/;
int setnumber=8/*PWM占空比调整*/n/*一秒种转了几圈*/t/*计时用,每0.1秒判断标志,及时间传递显示的过度量*/;
int tk/*时间计数*/vt/*速度传递显示的过渡量*/st/*路程传递显示的过渡量*/yx/*小车运行标志*/TC=1/*停车标志*/;
float s/*路程计算量*/c=0.9742647/*轮子1/4圈的长度(cm)*/;
double v/*速度计算量*/;

#define uchar unsigned char
#include
#include
#include
#include
#include
#include
#include

timer0() interrupt 1 using 1
{ TH0=0xFc;
TL0=0x18;
r++;
t++;
if(TC==1)
{ if(b==1)
{
if(m { p1_2=0;
p1_5=0;
}
else
{ p1_2=1;
p1_5=1;
}
     if (m>=10)
m=0;
m++;
}
else if(b==0)
{ if(l { p1_2=0;
p1_5=0;
}
else
{ p1_2=1;

}
if (l>setnumber+2)
p1_5=1;

     if (l>10)
l=0;
    l++;
}
}
if(t==100)
{ if(phzt!=1&&phzt!=3||zt!=3)
tk++;
else  //若在状态3(跷跷板平衡状态)的平衡停表情况
dd++;  //
if(dd==50)  //
{ if(phzt==1)  //
phzt=2;  //
if(phzt==3)  //
phzt=4;  //打破平衡准备下跷跷板
tk=0;  //重新计时
dd=0;
}

                if (tk>=10000) //每
                 tk=0; //0.1
                t=tk; //秒
                sec4=(t/1000)+0

评论

共有 条评论