📄 jiben_end.c
字号:
//先快速,再超慢速加角度传感器测平衡
//再驶向B点,并返回;
//液晶并行显示各段时间
//单通道单极性AD0809,人为给AD发信号
#include"reg51.h"
#include"Lcd_Display.h"
#define uchar unsigned char
#define uint unsigned int
sbit STK_DIR1=P1^0;
sbit STK_CP=P1^1;
sbit STK_DIR2=P1^2;
sbit p20=P2^0;
sbit p21=P2^1;
#define DA_LCDPORT P0 //A/D数据口
sbit AD_EOC=P3^4; //A/D转换结束信号输出端
sbit AD_CLK=P3^5; //A/D时钟信号输入端
sbit AD_START=P3^6; //启动A/D转换控制信号输入端
sbit AD_OE=P3^7; //A/D输出允许控制端
uchar code Lcd_Code[16]={ 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39, //0~9 ASCII code
0x41,0x42,0x43,0x44,0x45,0x46}; //A~F
#define START 0 //
#define SLOW 1
#define BALANCE 2
#define GO_ON 3
#define PAUSE 4
#define RETURN 5
#define END 6
uchar flag=0;
uint tt;
uchar sec; //总时间
uchar sec1; //分段时间
uint T_ms2;
uint T_ms2_1;
uchar T_ms2_2;
uint steps; //步数
bit flag_stop;
uchar flag_pinghen; //检测到平衡的次数
bit flag_fuhao; //符号
uchar SS1='A'; //状态
uchar SS2=0x7e;
uchar SS3='C';
uchar SS4=' ';
#define r 45 //1伏为45度
uchar du[2];
void time1() interrupt 3
{ TR1=0;
TH1=0xf8; TL1=0x30; //2ms
TR1=1;
T_ms2++;
if(T_ms2==500) //1s
{ T_ms2=0;
sec++; //时间
sec1++; //分段时间
}
switch(flag)
{ case START: STK_CP=~STK_CP; //快速
steps++;
if(steps>=4440)
flag=SLOW;
break;
case SLOW: if(flag_stop==0)
{ T_ms2_2++; //慢速找平衡
if(T_ms2_2==30) //60ms
{ T_ms2_2=0;
STK_CP=~STK_CP;
}
}
if(flag_stop==1)
{ T_ms2_1++;
if(T_ms2_1==300) //0.6s
{ T_ms2_1=0;
flag_stop=0;
flag_pinghen++;
if(flag_pinghen==5)
{ flag=BALANCE; //平衡处
sec1=0; //开始计时
p20=0; //LED
p21=1; //SPEAK
SS1='B';
SS2='A';
SS3='L';
SS4=' ';
}
}
}
case BALANCE: if(sec1==6) //平衡处//要显示5s
{ sec1=0;
steps=0;
flag=GO_ON;
STK_DIR1=0; //电机前转
STK_DIR2=1;
p20=1; //LED
p21=0; //SPEAK
TR0=0; //关AD
SS1='C';
SS2=0x7e;
SS3='B';
SS4=' ';
}
break;
case GO_ON: STK_CP=~STK_CP; //继续前进
steps++;
if(steps>=3990)
{ sec1=0;
flag=PAUSE;
SS1=' ';
SS2='P';
SS3=' ';
SS4=' ';
}
break;
case PAUSE: if(sec1==6) //暂停
{ sec1=0;
steps=0;
flag=RETURN;//返回
STK_DIR1=1; //电机反转
STK_DIR2=0;
SS1='B';
SS2=0x7e;
SS3='A';
SS4=' ';
}
break;
case RETURN: STK_CP=~STK_CP; //返回
steps++;
if(steps==8450)
{ flag=END;
SS1='S';
SS2='T';
SS3='O';
SS4='P';
}
break;
case END: TR1=0;
break;
default: break;
}
}
void time0() interrupt 1 //50us
{ AD_CLK=~AD_CLK; //A/D时钟信号
}
void AD_chuli() //A/D信号处理
{ long int da;
uchar da1;
AD_START=1; //又上升沿复位内部寄存器
AD_OE=1; //OE为高电平时,转换结果出现在D7~D0
DA_LCDPORT=0xff;
da=DA_LCDPORT;
if(da<127)
{ flag_fuhao=1;//负数
da=128-da;
}
else
{ flag_fuhao=0;
da=da-127;
}
da=da*1961;
da=da*r;
du[0]=da/100000%10;
du[1]=da/1000000%10;
da1=du[1]*10+du[0];
if(flag==SLOW)
{ if(flag_fuhao==0) // 正
{ if(da1>4)//(da1>7)
{ STK_DIR1=0; //电机前转
STK_DIR2=1;
}
if(da1<3)//(da1<5)
{ STK_DIR1=1; //电机反转
STK_DIR2=0;
}
if( (da1==3) || (da1==5) )
flag_stop=1;
if( (da1<2) || (da1>5) )
flag_pinghen=0;
}
if(flag_fuhao==1) //负
{ STK_DIR1=1; //电机反转
STK_DIR2=0;
flag_pinghen=0;
}
}
AD_OE=0; //D7~D0对外成高阻态
AD_START=0; //下降沿又开始A/D
}
void Lcd_Display()
{ uchar s1[5],s2[5],s4[5],*ps;//s3[5];
s1[0]='T'; s1[1]=':'; s1[2]=Lcd_Code[sec/10]; s1[3]=Lcd_Code[sec%10]; s1[4]='\0';//总时间显示
ps=&s1;
Lcd_WS(ps,0,0); //Lcd第1行
s2[0]='t'; s2[1]=':'; s2[2]=Lcd_Code[sec1/10]; s2[3]=Lcd_Code[sec1%10]; s2[4]='\0';//各段时间显示
ps=&s2;
Lcd_WS(ps,8,0); //Lcd第1行
/*
if(flag_fuhao==1)
s3[0]='-';
else
s3[0]='+';
s3[1]=Lcd_Code[du[1]]; s3[2]=Lcd_Code[du[0]]; s3[3]=0xdf; s3[4]='\0';//角度显示//转换成ASCII
ps=&s3;
Lcd_WS(ps,0,1); //Lcd第2行
*/
s4[0]=SS1; s4[1]=SS2; s4[2]=SS3; s4[3]=SS4; s4[4]='\0';//总时间显示
ps=&s4;
Lcd_WS(ps,8,1); //Lcd第1行
}
void main(void)
{ Delay(1,30);
TMOD=0x12;
TH0=206; TL0=206; //须定时50us左右
TR0=1; ET0=1;
PT0=1; //优先级
TH1=0xf8; TL1=0x30; //2ms
TR1=1; ET1=1;
EA=1;
STK_DIR1=0; //电机前转
STK_DIR2=1;
p20=1;
p21=0;
AD_OE=0; //D7~D0对外成高阻态
Lcd_Init(); //LCD初始化
AD_START=0;
AD_START=1; //上升沿复位内部寄存器
AD_START=0; //下降沿开始A/D
while(1)
{ if(AD_EOC)
AD_chuli(); //查询法
Lcd_Display(); //数码管显示
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -