📄 main.c
字号:
#include<reg51.h>
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/**/,j,m=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<delay1ms.c>
#include<xianshi.c>
#include<xunji.c>
#include<htxunji.c>
#include<pheng.c>
#include<bizhang1.c>
#include<lcd3.c>
timer0() interrupt 1 using 1
{ TH0=0xFc;
TL0=0x18;
r++;
t++;
if(TC==1)
{ if(b==1)
{
if(m<setnumber)
{ 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<setnumber+1)
{ 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)+0x30; //累
t=t%1000; //加
sec3=(t/100)+0x30; //时
t=t%100; //间
sec2=(t/10)+0x30; //一
t=t%10; //次
sec1=t+0x30; //
t=0; //
}
if(r==1000)
{ r=0; //每
v=n*c; //一
v=v*10; //秒
vt=v; //计
if(vt>=10000) //算
vt=9999; //速
sd4=(vt/1000)+0x30; //度
vt=vt%1000; //一
sd3=(vt/100)+0x30; //次
vt=vt%100; //
sd2=(vt/10)+0x30; //
vt=vt%10; //
sd1=vt+0x30; //
n=0; //
}
}
timer1() interrupt 3 using 2
{ if(a==3) //在前进的时候。轮子每1/4周累加路程一次
{ n++; //在后退的时候。轮子每1/4周减少路程一次
s=s+c; //
} //
else if(a==4) //
s=s-c; //
if(s>=10000||s<=0) //
s=0; //
st=s; //
lc4=(st/1000)+0x30; //
st=st%1000; //
lc3=(st/100)+0x30; //
st=st%100; //
lc2=(st/10)+0x30; //
st=st%10; //
lc1=st+0x30; //
}
main()
{ yx=0;/*是否运行,标志位*/
kaiji();
TMOD=0x61; /**************************/
TH0=0xFC; /* */
TL0=0x18; /* */
TL1=-1; /*定时计数器,装初值,打开*/
TH1=-1; /* */
IP=0x08; /* */
EA=0;ET0=1;ET1=1;/* */
TR0=1;TR1=1; /**************************/
initlcm();/*显示初始化*/
for(;;)
{ xianshi();
if(p3_7==0)//暂停(启动)?
{
yx++; /*******************/
yx=(yx%2);/* */
EA=yx; /* */
TC=yx; /*切换暂停/启动状态*/
p1_2=!yx; /* */
p1_5=!yx; /*******************/
delay1ms(50,1000);/*延时防抖动*/
}
if(p3_6==0)//切换状态?
{ yx=0; //停
EA=0; //止
TC=0; //运
p1_2=1;//行
p1_5=1;//
if(zt<3) /**********/
zt++; /*切换状态*/
else zt=1;/**********/
if(zt==1)
{ xszt1=0xD1;//
xszt2=0xAD;//切
xszt3=0xBC;//换
xszt4=0xA3;//显
} //示
if(zt==2) //状
{ xszt1=0xB1;//态
xszt2=0xDC;//
xszt3=0xD5;//
xszt4=0xCF;//
} //
if(zt==3) //
{ xszt1=0xC6;//
xszt2=0xBD;//
xszt3=0xBA;//
xszt4=0xE2;//
}
delay1ms(50,1000);/*延时防抖动*/
}
if(yx==1)//运行
{ if(zt==1)
xunji();//状态1,则循迹
else if(zt==2)
bizhang();//状态2,则避障
else if(zt==3)
pheng();//状态3,则跷跷板平衡
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -