📄 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>
uchar speed=50,step_length=10,thdata,tldata;
#include<Start.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;
bit spdset;
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;
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;spdset=1;}
++sicnt;
if(sicnt==2){sicnt=0;SData_flag=1;}
}
void ST_Convert(void)//将转速转换为T0常数
{
uint tdbuf;
tdbuf=(1000000/speed)/192;
tdbuf=0xffff-tdbuf;
tldata=(uchar)(tdbuf&0xff);
thdata=(uchar)((tdbuf>>8)&0xff);
}
bit Operating(void) //开机初始化程序
{ uchar key;
bit step_flag=0;
Show_Null();
key=0;
Show_Sign(); //显示===========
Show_Speed_Set(); //显示"请预置转速 "
speed=Get_Speed(speed); //转速设置子程序
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(); //显示"请预置步长: "
step_length=Get_Step_Length(step_length); //预置步长
}
return step_flag;
}
void main(void)
{
uchar key,stl,stepcnt=0;
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*4;
Show_Null(); //清屏
Show_Sign(); //显示===
//Show_Step(); //显示"步进"
Show_Direction(direction);
Show_Speed(speed);
Show_StepCnt(stepcnt);//"显示"步进:XXX""步进数
while(1)
{
if(int_cnt==stl)
{ ET0=0;
int_cnt=0;
step_permit=0;
}
if(spdset){ST_Convert();Show_Speed(speed);spdset=0;}
key=0;
key=GetKey();
if(key==STEP)
{
step_permit=1;
int_cnt=0;
ET0=1;
Show_StepCnt(++stepcnt);//"显示":XXX""步进数
}
else if((key==DIR)||sisdf)
{
direction=(~direction);
Show_Direction(direction);
sisdf=0;
}
else if(key==RESET)(*(void(*)())0)();//热启动
}
}
else //全速运行方式
{
ET0=1;
run=0;
//Show_Null(); //清屏
//Show_Sign(); //显示===
//Show_Start(); //显示"启动"
Show_Null(); //清屏
Show_Sign(); //显示===
Show_Running(); //显示"运行中"
Show_Direction(direction);
Show_Speed(speed);
while(1)
{
if(spdset)
{
ST_Convert();
Show_Speed(speed);
spdset=0;
}
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);
Show_Speed(speed);
run=0;
}
else if(key==RESET)(*(void(*)())0)();//热启动
}
}
}
/*
void Right_Show_Figure (uchar x,uchar y,uchar figure_num);
void Left_Show_Figure (uchar x,uchar y,uchar figure_num);
void Lcd_SetZ (uchar z);
void Lcd_Off (void);
void Lcd_On (void);
void IntRst (void);
void Show_Null (void);//清屏
void Show_Sign (void);//显示===========
void Show_Greet (void);//显示电机控制系统湖南师范大学XXX制作
bit 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_Direction (bit a);//显示"正反向"
void Show_Speed (uchar sp);//显示"转速:XX"
void Show_StepCnt (uchar stp);//"显示"步进:XXX""步进数
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -