基于51单片机的步进电机控制系统-单片机课程设计报告 下载本文

个字符

m = 0;

while(cdis2[m] != '\\0') {

lcd_wdat(cdis2[m]); //显示字符 m++; }

delay(3000); //延时

lcd_pos(0); //设置显示位置为第一行的第1个字符

m = 0;

while(cdis3[m] != '\\0')

{ //显示字符 lcd_wdat(cdis3[m]); m++; }

lcd_pos(0x40); //设置显示位置为第二行第1个字符

m = 0;

while(cdis4[m] != '\\0') {

lcd_wdat(cdis4[m]); //显示字符 m++; }

for(m=0;m<2;m++) {

lcd_pos(0x0c+m); //显示方向符号 lcd_wdat(0x3e); } }

/********************************************************/ /*

/*数据转换子程序 /*

/********************************************************/ void data_conv() {

data_temP1=data_temp/10; //高位 if(data_temP1==0)

{data_temP1=0x20;} //高位为0不显示 else

{data_temP1=data_temP1+0x30;}

data_temp2=data_temp; //低位 data_temp2=data_temp2+0x30; }

/********************************************************/ /*

/*数据显示子程序 /*

/********************************************************/ void data_dis()

{

data_temp = snum; //显示圈数 data_conv();

lcd_pos(0x44);

lcd_wdat(data_temP1); lcd_pos(0x45);

lcd_wdat(data_temp2);

data_temp = rate; //显示速率 data_conv();

lcd_pos(0x4d);

lcd_wdat(data_temP1); lcd_pos(0x4e);

lcd_wdat(data_temp2); }

/******************************************************** /*

/* 显示运行方向符号 /*

/********************************************************/ void motor_DR() {

if(direction==1) //正转方向标志 { for(m=0;m<2;m++) {

lcd_pos(0x0c+m); //显示方向符号 lcd_wdat(0x3e); } }

else

{ for(m=0;m<2;m++) //反转方向标志 {

lcd_pos(0x0c+m); //显示方向符号 lcd_wdat(0x3c); } } }

/******************************************************** /*

/* 显示运行状态 /*

/********************************************************/ void motor_RUN() {

if(on_off==1) { TR0=1;

lcd_pos(0); //设置显示位置为第一行的第1个字符 m = 0;

while(cdis5[m] != '\\0')

{ lcd_wdat(cdis5[m]); //RUNNING m++; }

motor_DR(); // }

else

{ TR0=0; P1 =0x0f;

lcd_pos(0); //设置显示位置为第一行的第1个字符 m = 0;

while(cdis3[m] != '\\0')

{ lcd_wdat(cdis3[m]); //STOP m++; }

motor_DR(); // snum=snum1; //

number1=0; //清圈数计数器 } }

void motor_RUN1() {

if(on_off1==1) { TR1=1; rate_ctr=0;

lcd_pos(0); //设置显示位置为第一行的第1个字符 m = 0;

while(cdis6[m] != '\\0')

{ lcd_wdat(cdis6[m]); //DIANDONG m++; }

motor_DR(); // }

else { TR1=0; P1 =0x0f;

lcd_pos(0); //设置显示位置为第一行的第1个字符 m = 0;

while(cdis3[m] != '\\0')

{ lcd_wdat(cdis3[m]); //STOP m++; }

motor_DR(); // snum=snum1; //

number1=0; //清圈数计数器 } }

/******************************************************** * * 主程序 * *********************************************************/

main() {

LCD_init_DIS();

TMOD = 0x11; //T0定时方式1 TL0 = 0xff; TH0 = 0xf5; TL1 = 0xff; TH1 = 0xf5; EA = 1; ET0 = 1; ET1=1;

P1 = 0x0f;

while(1) {

if(K1==0)

{

delay(20); if(K1==0) {

while(K1==0); //等待键释放 on_off=~on_off; motor_RUN(); }

} //K1 end

/********************************************************/ if(K2==0) {

delay(20); if(K2==0) {

if(snum_dr==1) { snum++;

snum1=snum;

if(snum==0x14) //14H=20 { snum_dr=~snum_dr;} }

else {snum--; snum1=snum;

if(snum==0x01) { snum_dr=~snum_dr; } } } delay(100); } //K2 end

/********************************************************/ if(K3==0) {

delay(20); if(K3==0) {

direction=~direction; motor_DR(); } delay(100); }//K3 end

/********************************************************/ if(K4==0) {

delay(20); if(K4==0) {

if(rate_dr==1) { rate++;

if(rate==0x10)

{ rate_dr=~rate_dr;} }

else {

rate--;

if(rate==0x01) { rate_dr=~rate_dr; }

} } delay(100); } //K4 end

/********************************************************/

if(number1==snum1) //与设定圈数是否相等 { number1=0; on_off=0; TR0=0; snum=snum1; P1=0x0f;

motor_RUN(); }

data_dis();

/********************************************************/ if(K5==0) //点动 { on_off1=1; motor_RUN1(); while(K5==0) { ; } on_off1=0; motor_RUN1(); }

} // while(1) end } //main end

/********************************************************/ /*

/* 定时器 0 中断 /*

/********************************************************/

void motor_onoff() interrupt 1 {

TL0 = 0xff; TH0 = 0xf5; q++;

if(q < rate) { return; } else

{ q=0;

number++; //脉冲计数加一

if(number==4096) //8*8个脉冲电机转一圈,又减速比为1/64,故电机外轴转一圈为64*64个脉冲

{ snum--; number=0;

number1++; } //电机已转动圈数加一