51单片机之lcd1602步进电机控制
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] != ) { lcd_wdat(cdis5[m]); //RUNNING m++; } motor_DR(); // } else { TR0=0; P1 =0xf0;
lcd_pos(0); //设置显示位置为第一行的第1个字符 m = 0; while(cdis3[m] != ) { lcd_wdat(cdis3[m]); //STOP m++; } motor_DR(); //
snum=snum1; //
number1=0; //清圈数计数器 } }
main() { LCD_init_DIS();
TMOD = 0x01; //T0定时方式1
TL0 = 0x33; TH0 = 0xf5;
EA = 1;
ET0 = 1;
P1 = 0xf0; while(1) { if(K1==0) { beep(); while(K1==0); //等待键释放 on_off=~on_off; motor_RUN(); } //K1 end if(K2==0) { beep();
if(snum_dr==1) { snum++; snum1=snum; if(snum==0x14) { snum_dr=~snum_dr;} }
else {snum--;
snum1=snum; if(snum==0x01)
{ snum_dr=~snum_dr; } } } //K2 end if(K3==0) { beep();
direction=~direction; motor_DR(); }//K3 end if(K4==0) { beep();
if(rate_dr==1) { rate++; if(rate==0x10) { rate_dr=~rate_dr;} } else { rate--; if(rate==0x01)
{ rate_dr=~rate_dr; } }
} //K4 end if(number1==snum1) //与设定圈数是否相等 { number1=0; on_off=0; TR0=0; snum=snum1;
P1 =0xf0; motor_RUN(); } data_dis();
} // while(1) end } //main end
void motor_onoff() interrupt 1 { TL0 = 0x33; TH0 = 0xf5; q++; if(q < rate) { return; } else { q=0; number++; //脉冲计数 if(number==96) //96个脉冲电机转一圈 { snum--; number=0; number1++; } //电机转动圈数 if(direction==1) //方向标志 { if(v<8) {P1 = FFW[v];v++;} //取数据,正转 if(v==8) { v=0; }
评论