电动车跷跷板程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

我自己写的电动车跷跷板程序,做了一个1602菜单(只用了3个键哟!),使用步进电机,采用折半查找法寻找平衡点,最小步进达到1mm,还有很多其他功能,自己用51单片机试试看,这个是源程序,文库里还有个报告,加上一句我用的是倾角传感器,用AD采样算倾角。

#include

#define uchar unsigned char

#define uint unsigned int

#define Xiaodou 50 //消抖时间

#define OneCircle 512//OneCircle次循环为360度

#define LCircle 23//轮子转一圈为LCircle cm

#define FirstJour 256//找重心第一步

#define SAOMIAO 600//延迟600ms测一次角度

#define QueDing 700//平衡确定延时

#define UpAngle 0x82//上限角度,大于上限角表示向前翘起,2.56V

#define DownAngle 0x7e//下限角度,小于下限角表示向后翘起,2.45V

sbit KeyEnter=P3^2;//调整确定键

sbit KeyUp=P3^3;//上方向键

sbit KeyRight=P3^4;//右方向键

sbit LCDRs=P3^0;//液晶的命令数据端

sbit LCDEn=P3^1;//液晶的使能端

sbit ADST=P3^5;//AD0809的转换启动信号端ST

sbit ADEOC=P3^6;//AD0809的转换结束信号,高电平表示转换结束

sbit ADCLK=P3^7;//AD0809的时钟为500KHz

sbit FLLight=P1^4;//前左灯,低电平发光

sbit FRLight=P1^5;//前右灯,低电平发光

sbit BLLight=P1^6;//后左灯,低电平发光

sbit BRLight=P1^7;//后右灯,低电平发光

uchar timecount=0;

uint count[4]={0,0,0,0};//控制时间,4个过程的时间

uint journey[4]={60,65,55,115};//设置行程

uchar speed=3;//速度参量

uchar step=0;//步骤游标

uchar protype[4]={0,2,0,1};//每个步骤指令

uchar CharDisp[3];//用于显示字符

uchar code F_Rotation[]={0xc9,0xc1,0xc3,0xc2,0xc6,0xc4,0xcc,0xc8};//正转表格,前灯亮

uchar code B_Rotation[]={0x38,0x3c,0x34,0x36,0x32,0x33,0x31,0x39};//反转表格,后灯亮

void Delay(uint x,uint y)//x=1,y=110每执行一次大概为1ms

{

for(;x>0;x--)

for(y=110;y>0;y--);

}

void WriteCommond(uchar com)//给液晶写入指令,com为16进制

{

LCDRs=0;

P0=com;//液晶的数据端口

Delay(5,110);

LCDEn=1;

Delay(5,110);

LCDEn=0;

}

void WriteData(uchar date)//给液晶写入字符,com为16进制

{

LCDRs=1;

P0=date;//液晶的数据端口

Delay(5,110);

LCDEn=1;

Delay(5,110);

LCDEn=0;

}

void WriteString(uchar * string)//写入字符串

{

for(;*string;string++)

WriteData(*string);

}

void DispTimeS(uint times,uchar address)//显示时间或者距离

{

uchar i=0;

CharDisp[0]=times/100;

CharDisp[1]=times%100/10;

CharDisp[2]=times%10;

WriteCommond(address);

for(;i<=2;i++)

{

WriteData(CharDisp[i]+'0');

}

}

void RunXCircle(uchar drec,uint num)//轮子跑num圈,drec为0向前,为1向后{

uchar i;

uint j;

while(num--)

{

j=OneCircle;

while(j--)

{

for(i=0;i<8;i++) //4相

{

if(!drec)

P1=F_Rotation[i]; //输出对应的相,可以自行换成反转表格

else

P1=B_Rotation[i];

Delay(speed,110); //改变这个参数可以调整电机转速

}

}

}

P1=0xf0;//停止行走,灯熄灭

}

void RunNCircle(uchar drec,uint num)//轮子转num个最小单位,drec为1向前,为0向后{

uchar i;

//num*=OneCircle/LCircle;

while(num--)

{

for(i=0;i<8;i++) //4相

{

if(!drec)

P1=F_Rotation[i]; //输出对应的相,可以自行换成反转表格

else

P1=B_Rotation[i];

Delay(speed,110); //改变这个参数可以调整电机转速

}

}

P1=0xf0;//停止行走,灯熄灭

}

uchar DeltFind()//返回指为2表示平衡了,为0需要向前走,为1需要向后走

{

uchar angle,result=2;

ADST=0;

ADST=1;

ADST=0;//启动AD0809转换

相关文档
最新文档