📄 motor_1_1.c
字号:
void transmit_byte(unsigned char send_byte)
{
ES=0;
SBUF=send_byte;
while(TI==0);
TI=0;
ES=1;
}
//-----------------串口中断程序 -------------------------
void com_int() interrupt 4 using 1
{
cmd=SBUF;
RI=0;
}
//--------------写一个字节到液晶------------------------
void lcd_write(bit slr,unsigned char write_dat)
{
RS=slr;
E=1;
lcd_dat_port=write_dat;
E=0;
delay(2);
}
//--------------液晶初始化-----------------------------
void ini_lcd()
{
//RW=0;
delay(10);
lcd_write(0,0x38);
lcd_write(0,0x0c);
lcd_write(0,0x06);
lcd_write(0,0x01);
}
//-------------------------液晶显示--------------------------
void display() //将显示缓存lcd_buf[16]的内容显示
{unsigned char ii;
lcd_write(0,2);
delay(10);
for(ii=0;ii<16;ii++)
{
if (ii==8) lcd_write(0,0xc0);
lcd_write(1,lcd_buf[ii]);
}
}
//-------------- 按键子程序 ----------------------
unsigned char get_key()
{unsigned char key1,key2,ii;
key1=key_port;
delay(100); //10ms消抖动
if(key1==key_port) //延时10ms后键不变
{
key_port=0x0f;
key2=key_port;
key1=key1|key2;
key_port=0xf0;
for(ii=0;ii<16;ii++)
{if(key1==key_index[ii])
return(ii);
}
return(0xff);
}
else return(0xff);
}
//-------------- 菜单 -----------------------
void menu()
{unsigned char key_val,ii;
unsigned int setup_val; //设置值,指步进电机转速设置值或直流电机PWM设置值
static unsigned char selection=1;
key_val=get_key(); //选择一级菜单,打"*"项为选中项
if(key_val==0x0e) //功能键
{
menu_level=1;choice=0;selection=1;
strcpy(lcd_buf,"Measure* Setup "); //显示一级菜单
display();
}
else if(menu_level==1&&key_val==0x0c) //一级菜单下,左键
{selection=1;lcd_buf[7]='*';lcd_buf[15]=' ';display();} //选中Measure,测速菜单项
else if(menu_level==1&&key_val==0x0d) //一级菜单下,右键
{selection=2;lcd_buf[7]=' ';lcd_buf[15]='*';display();} //选中Setup,设转速或脉冲频率
else if(menu_level==1 && selection==1 &&key_val==0x0f) //一级菜单下,选中Measure
{
choice=1;
strcpy(lcd_buf,"Rotation: r/m");
display();
}
else if(menu_level==1 && selection==2 &&key_val==0x0f) //一级菜单下,选中Setup进入二级菜单
{
menu_level=2;selection=1;
strcpy(lcd_buf,"Step.* DC_motor "); //显示二级菜单
display();
}
else if(menu_level==2&&key_val==0x0c) //二级菜单下,左键
{selection=1;lcd_buf[5]='*';lcd_buf[15]=' ';display();} //选中Step.,设定步进电机
else if(menu_level==2&&key_val==0x0d) //二级菜单下,右键
{selection=2;lcd_buf[5]=' ';lcd_buf[15]='*';display();} //选中DC_motor,设定直流电机
else if(menu_level==2&&selection==1&&key_val==0x0f) //二级菜单下,确认键
{menu_level=3;choice=2;strcpy(lcd_buf,"Stepper.rot: ");display();} //选中Stepper,设定步进电机转速
else if(menu_level==2&&selection==2&&key_val==0x0f) //二级菜单下,确认键
{menu_level=3;
strcpy(lcd_buf,"PWM: . %");
choice=3;
display();
}
else if(choice==2&&key_val<10) //数字键,设PWM值
{if(setup_val!=0)
{
setup_val=0;
lcd_buf[12]=' ';lcd_buf[13]=' ';lcd_buf[14]=' ';lcd_buf[15]=' ';//数字清掉从来
}
lcd_buf[12]=lcd_buf[13]; //数字逐位左移
lcd_buf[13]=lcd_buf[14];
lcd_buf[14]=lcd_buf[15];
lcd_buf[15]='0'+key_val;
display();
} //选中Stepper,设定步进电机转速
else if(choice==3&&key_val<10) //数字键,设定步进电机速度
{if(setup_val!=0)
{
setup_val=0;
lcd_buf[11]=' ';lcd_buf[12]=' ';lcd_buf[13]='.';lcd_buf[14]=' ';//数字清掉从来
}
lcd_buf[11]=lcd_buf[12]; //数字逐位左移
lcd_buf[12]=lcd_buf[14];
lcd_buf[14]='0'+key_val;
display();
}
else if(choice==2&&key_val==15) //步进电机速度设置完毕
{
for(setup_val=0,ii=0;ii<4;ii++)
{if(lcd_buf[12+ii]!=' ')
setup_val=setup_val*10+lcd_buf[12+ii]-'0';
}
stepping_int(setup_val);
}
else if(choice==3&&key_val==15) //直流电机PWM设置完毕
{if(lcd_buf[11]!=' '){setup_val=(lcd_buf[11]-'0')*100;}
if(lcd_buf[12]!=' '){setup_val=setup_val+(lcd_buf[12]-'0')*10;}
if(lcd_buf[14]!=' '){setup_val=setup_val+(lcd_buf[14]-'0');}
PWM=setup_val/2;
}
while(key_port!=0xf0); //等待按键释放
delay(100);
while(key_port!=0xf0); //等待按键释放
}
//----------------------主程序------------------------------
main()
{
unsigned char n1=0,n2=0; //命令字的后续两字节
unsigned char loop_times=1;//主程序大循环次数,主要用于确定占空比用
//unsigned char PWM=0; //直流电机脉宽调制系数(1到10000)10^-2,精确到0.01%
//例如PWM=213表示2.13%
ini_com(); //串口设置,设波特率19200等
ini_lcd(); //初始化液晶
set_T0T1(); //设置T1,T0: T1定时器作定时100us并控制步进电机,
// T0作计数以测定直流电机或步进电机转速
P1=0;EA=1;ES=1;cmd=0;//初始化,开串口中断
strcpy(lcd_buf,"Mechatronics V1"); //显示题头,版本
display();
//delay_1s(2);
while(1)
{key_port=0xf0;
if (key_port!=0xf0)
{
menu();
}
else if (cmd==0xc0) //软件分配步进电机,转速n1n2
{
ES=0;
n1=receipt_byte();
n2=receipt_byte();
stepping_int(n1*256+n2);
cmd=0;
ES=1;
}
else if (cmd==0xc3||choice==1) //测电机转速
{
if (cmd==0xc3)
{
n1=speed/256;
transmit_byte(n1);
n2=speed%256;
transmit_byte(n2);
cmd=0;
}
else
{
lcd_buf[9]='0'+speed/1000;lcd_buf[10]='0'+(speed%1000)/100;
lcd_buf[11]='0'+(speed%100)/10;lcd_buf[12]='0'+speed%10;
if (count_display>5000) //0.5秒显示刷新一次,该变量在定时T0(100us)中断中累加
{count_display=0;
display();
}
}
}
else if (cmd==0xc2) //设直流电机PWM系数
{
ES=0;
n1=receipt_byte();
n2=receipt_byte();
ES=1;
PWM=n1*256+n2;
PWM=PWM/2;
cmd=0;
}
/*else if (cmd==0xc3);
else if (cmd==0xc4);*/
else if (cmd==0xc5) //停止步进电机
{
stepping_by_T0=0;
/*speed=0;*/
cmd=0;
}
/*else if (cmd==0xc6)
{
PWM=0;//停止直流电机
cmd=0;
}*/
/*if (loop_times<PWM)
DC_MOTOR=1;
else
DC_MOTOR=0;
loop_times++;
if (loop_times>100)
loop_times=1;
//#pragma ASM
//mov p1,#00H
//#pragma ENDASM */
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -