📄 motor_main.c
字号:
#define uchar unsigned char
#define uint unsigned int
#define low_speed 10
#define high_speed 100
#include<reg52.h>
#include<Key_Define.h>
#include<Get_Key_Declare.h>
#include<Lcd_Init_Declare.h>
//#include<Main_Define.h>
bit SData_flag=0;
bit step_permit=0;
bit direction,sisdf;//set direction flag
bit stepflag=0; //步进标志
bit run=0; //全带运行标志
bit stopflag=0;
uchar int_cnt;
uchar speed=50,step_length=7,thdata,tldata;
sbit AA= P3^4;
sbit AB= P3^5;
sbit BA= P3^6;
sbit BB= P3^7;
uchar cnt;
uchar sicnt=0;
//产生脉冲波形
void Timer0(void)interrupt 1 using 1
{
TL0=(tldata+10);
TH0=thdata;
if(step_permit) int_cnt++;
if(direction) //反转
{
switch(cnt)
{
case 0:AA=1;AB=1;BA=0;BB=0; break;
case 1:AA=0;AB=1;BA=1;BB=0; break;
case 2:AA=0;AB=0;BA=1;BB=1; break;
case 3:AA=1;AB=0;BA=0;BB=1; break;
default: break;
}
}
else {
switch(cnt)
{
case 0:AA=1;AB=1;BA=0;BB=0; break;
case 1:AA=1;AB=0;BA=0;BB=1; break;
case 2:AA=0;AB=0;BA=1;BB=1; break;
case 3:AA=0;AB=1;BA=1;BB=0; break;
default: break;
}
}
++cnt;
if(cnt==4)cnt=0;
}
void SeriCab(void)interrupt 4 using 2
{
uchar sda;
/*if(RI)*/RI=0;
sda=SBUF;
if(sda>=64)
{
if((sda<95)&&(run==0)){step_length=sda*3;stepflag=1;}
else if((sda==0x61)&&(SData_flag==1)){run=1;stopflag=0;}
else if(sda==0x63){direction=0;sisdf=1;}
else if(sda==0x64){direction=1;sisdf=1;}
else if((sda==0x62)&&(SData_flag==1)){run=0;stopflag=1;}
else if((sda==0x65)&&(SData_flag==1)){step_permit=1;}
}
else speed=sda*2;
++sicnt;
//if((sicnt==1)&&(stepflag==0))SData_flag=1;
if(sicnt==2){sicnt=0;SData_flag=1;}
}
void ST_Convert(void)//将转速转换为T0常数
{
//unsigned long tdata;
uint tdbuf;
tdbuf=(1000000/speed)/192;
tdbuf=0xffff-tdbuf;
tldata=(uchar)(tdbuf&0xff);
thdata=(uchar)((tdbuf>>8)&0xff);
}
void Get_Speed(void)//转速设置子程序
{
uchar spl,sph,spk,key,spd;
spd=speed;
do {
//key=0;
key=GetKey();
spk=spd/100;
sph=(spd%100)/10;
spl=spd%10;
if(spk==0)
{
spk=10;
if(sph==0)sph=10;
}
Right_Show_Figure(5,16,spk);
Right_Show_Figure(5,24,sph);
Right_Show_Figure(5,32,spl);
if((key==UP)&&(spd<high_speed))spd+=1;
else if((key==DOWN)&&(spd>low_speed))spd-=1;
}while(key!=ENTER);
speed=spd;
}
void Get_Step_Length(void)//预置步长
{
uchar length=10,key,lthh,lthl;
do {
key=GetKey();
lthh=length/10;
lthl=length%10;
if(lthh==0)
lthh=10;
Right_Show_Figure(5,24,lthh);
Right_Show_Figure(5,32,lthl);
if((key==UP)&&(length<45))length+=1;
else if((key==DOWN)&&(length>7))length-=1;
}while(key!=ENTER);
length&=0x3f;
step_length=length;
}
bit Operating(void) //开机初始化程序
{ uchar key;
bit step_flag=0;
Show_Null();
key=0;
Show_Sign(); //显示===========
Show_Speed_Set(); //显示"请预置转速 "
Get_Speed(); //转速设置子程序
//ST_Convert(); //将转速转换为T0常数
Show_Null();
Show_Operation_Model();
while(key!=LEFT&&key!=RIGHT)
key=GetKey();
Show_Null();
if(key==RIGHT) //步进
{
key=0;
step_flag=1;
Show_Sign(); //显示===========
Show_Step_Length(); //显示"请预置步长: "
Get_Step_Length(); //预置步长
}
return step_flag;
}
void main(void)
{
uchar key,stl;
IntRst();
Lcd_SetZ(1);
Lcd_Off();
Show_Null();
Show_Sign(); //显示===========
Show_Greet();
Lcd_On();
TMOD=0x21; //T0工作在方式1,T1工作在方式2自动重装
TH1=0xF3; //波特率设置;晶振12MHz;波特率为2400
TL1=0xF3;
SCON=0X50; //串行口工作在方式1,八位方式,允许接收
PCON=0; //SMOD设置为0
EA=1;
ES=1; //串行中断允许
ET0=0; //T0中断禁止
TR1=1;
while((key==0)&&(SData_flag==0))
key=GetKey();
if(key)stepflag=Operating();
ST_Convert(); //将转速转换为T0常数
TH0=thdata;
TL0=tldata;
TR0=1;
Show_Null();
Show_Sign(); //显示===========
Show_Ready(); //显示"准备好:"
Show_Direction(direction);
key=0;
while((key!=START)&&(run==0))
{ key=0;
key=GetKey();
}
if(stepflag) //步进方式
{ stl=step_length;
Show_Null(); //清屏
Show_Sign(); //显示===
Show_Step(); //显示"步进"
while(1)
{
if(int_cnt==stl)
{ ET0=0;
int_cnt=0;
step_permit=0;
}
key=0;
key=GetKey();
if(key==STEP)
{
step_permit=1;
key=0;
ET0=1;
}
else if((key==DIR)||sisdf)
{
direction=(~direction);
Show_Direction(direction);
sisdf=0;
}
}
}
else //全速运行方式
{
ET0=1;
//Show_Null(); //清屏
//Show_Sign(); //显示===
//Show_Start(); //显示"启动"
Show_Null(); //清屏
Show_Sign(); //显示===
Show_Running(); //显示"运行中"
Show_Direction(direction);
while(1)
{
key=0;
key=GetKey();
if((key==DIR)||sisdf)
{
direction=(~direction);
Show_Direction(direction);
sisdf=0;
}
else if((key==STOP)||stopflag)
{
ET0=0;
Show_Null(); //清屏
Show_Sign(); //显示===
Show_Stop(); //显示"停止"
Show_Direction(direction);
stopflag=0;
}
else if((key==START)||run)
{
ET0=1;
//Show_Null(); //清屏
//Show_Sign(); //显示===
//Show_Start(); //显示"启动"
Show_Null(); //清屏
Show_Sign(); //显示===
Show_Running(); //显示"运行中"
Show_Direction(direction);
run=0;
}
}
}
}
/*
void Show_Null (void);//清屏
void Show_Sign (void);//显示===========
void Show_Greet (void);//显示电机控制系统湖南师范大学XXX制作
void Show_Operation_Model(void);//显示"请预置工作方式"1全速2步进
void Show_Speed_Set (void);//显示"请预置转速 "
void Show_Step_Length (void); //显示"请预置步长: "
void Show_Ready (void);//显示"准备好:"
void Show_Start (void);//显示"启动"
void Show_Running (void);//显示"运行中"
void Show_Stop (void);//显示"停止"
void Show_Step (void);//显示"步进"
void Show_Direction (bit a)//显示"正反向"
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -