#include<reg51.h>
#define uchar unsigned char
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 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 p1_6=P1^6;
sbit p2_7=P2^7;
sbit p3_2=P3^2;
sbit p3_6=P3^6;
sbit p3_4=P3^4;
int a,b,l,setnumber=5,n,r,t,kk,i,m=0,tk,vt,st,yx,z,TC=1;
int phzt=0/*平衡状态*/;dd=0/*等待时间*/;
char sec1,sec2,sec3,sec4,sd1=48,sd2=48,sd3=48,sd4=48,lc1,lc2,lc3,lc4;
float s,c=0.9742647;
double v;
sbit E_CLK =P1^6;//clock input 同步时钟输入端
sbit RW_SID=P1^7;//data input/output 入、输出端
//串行发送一字节数据
void SendByte(unsigned char dat)
{ unsigned char i;
for(i=0;i<8;i++)
{ E_CLK=0;
if(dat&0x80)RW_SID=1;
else RW_SID=0;
E_CLK=1;
dat=dat<<1;
}
}
void SendCMD(unsigned char dat)
{ SendByte(0xF8);//11111,00,0 RW=0,RS=0 同步标志
SendByte(dat&0xF0);//高四位
SendByte((dat&0x0F)<<4);//低四位
}
//写显示数据或单字节字符
void SendDat(unsigned char dat)
{ SendByte(0xFA);//11111,01,0 RW=0,RS=1
SendByte(dat&0xF0);//高四位
SendByte((dat&0x0F)<<4);//低四位
}
/* 写汉字到LCD 指定的位置
x_add显示RAM的地址
dat1/dat2显示汉字编码
*/
//初始化 LCM
void initlcm(void)
{ SendCMD(0x30);//功能设置,一次送8位数据,基本指令集
SendCMD(0x0C);//0000,1100 整体显示,游标off,游标位置off
SendCMD(0x01);//0000,0001 清DDRAM
SendCMD(0x02);//0000,0010 DDRAM地址归位
SendCMD(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC
}
void set_wenzi(void)
{ SendCMD(0x80);//1000,0001 设定DDRAM 7位地址000,0001到地址计数器AC.
SendDat(0xd0); //将ASCII码调出来,显示在液晶屏幕上.下同
SendDat(0xa1);//小
SendDat(0xb3);
SendDat(0xb5);//车
SendDat(0xd7);
SendDat(0xb4);//状
SendDat(0xcc);
SendDat(0xac);//态
SendDat(0xa3);
SendDat(0xba);
SendCMD(0x90); //设置液晶屏的显示地址,下同.
SendDat(0xca);
SendDat(0xb1);//时
SendDat(0xbc);
SendDat(0xe4); //间
SendDat(0x3a);
SendDat(sec4);
SendDat(sec3);
SendDat(sec2);
SendDat(0x2e);
SendDat(sec1);
SendDat(0x73);
SendCMD(0x88);
SendDat(0xcb);
SendDat(0xd9); //速
SendDat(0xb6);
SendDat(0xc8); //度
SendDat(0x3a); //:
SendDat(sd4);
SendDat(sd3);
SendDat(sd2);
SendDat(0x2e);
SendDat(sd1);
SendDat(0x63);
SendDat(0x6d);
SendDat(0x2f);
SendDat(0x73);
SendCMD(0x98);
SendDat(0xc2);
SendDat(0xb7); //路
SendDat(0xb3);
SendDat(0xcc); // 程
SendDat(0x3a);
SendDat(lc4);
SendDat(lc3);
SendDat(0x2e);
SendDat(lc2);
SendDat(lc1);
SendDat(0x6d);
}
xianshi()
{ set_wenzi(); //将想要设置的文字显示在液晶屏幕上。
return;
}
void delay1ms(uchar t); //延时程序
void rightrun()
{ b=1;
p1_0=1;
p1_1=0;
p1_3=1;
p1_4=1;
a=2;
return;
}
void leftrun()
{
b=1;
p1_0=0;
p1_1=1;
p1_3=1;
p1_4=0;
a=1;
return;
}
void brightrun() //////////////
{ b=1;
p1_0=1;
p1_1=0;
p1_3=0;
p1_4=1;
a=2;
return;
}
void bleftrun()//////////////
{ b=1;
p1_0=0;
p1_1=1;
p1_3=1;
p1_4=1;
a=1;
return;
}
void forwordrun()
{ b=0;
p1_0=1;
p1_1=0;
p1_3=1;/**/
p1_4=0;/**/
a=3;
return;
}
void backrun()
{ b=0;
p1_0=0;
p1_1=1;
p1_3=0;/**/
p1_4=1;/**/
a=4;
return;
}
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+1)
p1_5=1;
if (l>10)
l=0;
l++;
}
}
if(t==100)
{ if(phzt!=1&&phzt!=3)
tk++;
else
{ dd++;
p3_4=!p3_4;
}
if(dd==50)
{ if(phzt==1)
phzt=2;
if(phzt==3)
phzt=4; //打破平衡,准备下跷跷板
p3_4=1;
tk=0; //重新计时
dd=0;
}
if (tk>=10000)
tk=0;
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
{ n++;
s=s+c;
if(s>=10000)
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()
{ int cs=0/*跷跷板翻的次数*/,fdd=6/*防抖动系数*/;
int fx=0/*前一次运动方向,标志*/,ph=0/*平衡的持久度*/;
int fy=0/*反应时间*/,wt=0/*是否微调,标志*/,cf=1/*冲锋标志*/,cfsj=40,bc=0/*是否补偿,标志*/;
long qj=10/*前进参数*/,ht=1/*后退参数*/,tz=0/*平衡状态参数*/,bf=400/*步进*/;
yx=0;/*是否运行,标志位*/
initlcm();
sec1=48;
sec2=48;
sec3=48;
sec4=48;
lc1=48;
lc2=48;
lc3=48;
lc4=48;
TMOD=0x61;
TH0=0xFC;
TL0=0x18;
TL1=-1;
TH1=-1;
IP=0x08;
EA=0;ET0=1;ET1=1;
TR0=1;TR1=1;
yx=1;
for(;;)
{ xianshi();
z=p3_2;
if(z==0)
{
yx++;
yx=(yx%2);
EA=yx;
TC=yx;
p1_2=!yx;
p1_5=!yx;
delay1ms(1000);
}
if(p3_6==0)
{ delay1ms(1000);
sec1=48;
sec2=48;
sec3=48;
sec4=48;
lc1=48;
lc2=48;
lc3=48;
lc4=48;
sd1=48;
sd2=48;
sd3=48;
sd4=48;
TH0=0xFC;
TL0=0x18;
TL1=-1;
TH1=-1;
yx=0;
tk=0;
s=0;
EA=0;
TC=1;
}
if(yx==1)
{
/////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
if((p2_5==0||phzt==2)&&phzt!=4)//后仰了
{ fy++;//反应参数自加一
qj++;//前进(后仰)参数;
TC=1;//打开电机
if(cf||phzt==2)
{ //若在冲锋,反应参数到达20,自动满足前进条件
qj=fdd*ht;
bc=1;
if(cf&&tk>=35)
setnumber=5;
if(cf&&tk>=45)
setnumber=4;
if(phzt==2)
if(p2_0&&p2_1&&p2_2)
phzt=3;
}
if(!cf&&fy>=200)//若没有冲锋,则反应参数到200后,自动对前进后退参数置一,并且打开微调
{fy=0;
qj=1;
ht=1;
wt=1;
}
if(qj>=fdd*ht)//防平衡器抖动;
{ ph=0;//电机打开,平衡态系数置零
fx=2;//方向为前
for(i=0;i<=(bf)/*步进补偿*/;i++)
{
//////////////////////////////////前进循迹程序段///////////////////////////
if(p2_0==1)
{ if(p2_0==1&&p2_1==1)
{ rightrun();
}
else if(p2_0==1&&p2_1==0&&p2_2==0)
{ rightrun();
}
}
else if(p2_2==1)
{ if(p2_2==1&&p2_1==1)
{ leftrun();
}
else if(p2_0==0&&p2_1==0&&p2_2==1)
{ leftrun();
}
}
else if(p2_1==1)
forwordrun();
else forwordrun();
/////////////////////////////////////////////////////////
if((cs%2)&&(cs<=10))//跷跷板过平衡点次数
{ cs++;
}
没有合适的资源?快使用搜索试试~ 我知道了~
单片机代码 跷跷板全套资料.rar
共72个文件
c:18个
lst:10个
obj:8个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 117 浏览量
2023-03-03
09:13:42
上传
评论 1
收藏 146KB RAR 举报
温馨提示
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,本人不对所涉及的版权问题或内容负法律责任。如有侵权,请举报或通知本人删除。
资源推荐
资源详情
资源评论
收起资源包目录
单片机代码 跷跷板全套资料.rar (72个子文件)
跷跷板.c 6KB
跷跷板
xiaoche4.Opt 2KB
XIAOCHE.BIN 4KB
MAIN 9KB
delay1ms.LST 935B
STARTUP.LST 14KB
xianshi.c 3KB
ad574.c 768B
xianshi.LST 5KB
MAIN.BIN 4KB
main.OBJ 44KB
TEMP.LST 3KB
turnrun.LST 753B
XIAOCHE.DSK 3KB
xiaoche3.lnp 45B
houtuixunji.c 4KB
STARTUP.A51 6KB
xiaoche.lnp 44B
xiaoche3.M51 35KB
turnrun.OBJ 376B
xiaoche3.plg 200B
xiaoche4.plg 2KB
delay1ms.OBJ 790B
kaiji.c 5KB
xiaoche3.hex 14KB
xiaoche4.Uv2 2KB
xiaoche3_Opt.Bak 3KB
trunrun.c 665B
turnrun.c 19B
main.LST 13KB
xiaoche.plg 143B
xiaoche4.hex 16KB
xiaoche4_Opt.Bak 3KB
pheng.c 4KB
bizhang1.LST 5KB
da0832.c 340B
pwm.c 730B
MAIN.DSK 4KB
xiaoche.PRJ 3KB
xiaoche_Opt.Bak 2KB
htxunji.c 936B
MAIN.HEX 10KB
delay1ms.c 185B
kaiji2.c 5KB
XIAOCHE.M51 29KB
lcd3.c 4KB
xunji.c 2KB
xiaoche.hex 12KB
xiaoche.Uv2 2KB
xunji.LST 6KB
xiaoche3.Opt 3KB
xiaoche.Opt 2KB
xiaoche 24KB
STARTUP.OBJ 758B
bizhang1.c 2KB
WAVE.LIN 43B
跷跷板平衡程序——最终华丽终结版.c 11KB
pheng.OBJ 14KB
xunji.OBJ 4KB
pwm.OBJ 2KB
pwm.LST 2KB
MAIN.PRJ 2KB
xiaoche4_Uv2.Bak 2KB
xiaoche3 29KB
main.c 6KB
xiaoche3.Uv2 2KB
MAIN.M51 27KB
xianshi.OBJ 7KB
pheng.LST 20KB
xiaoche4.M51 43KB
xiaoche_Uv2.Bak 2KB
xiaoche4.lnp 45B
共 72 条
- 1
资源评论
大富大贵7
- 粉丝: 379
- 资源: 8869
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功