电动车跷跷板程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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转换