51单片机控制步进电机转动以及用lcd1602显示
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; }
评论