完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我做的是基于stc51单片机通过按键控制28byj48步进电机运动,在LCD1602上显示。结果电机不转,有震动,lCD亮却没有数据。但是基本确定电路是正确的,问题估计在程序上。希望大神耐心看看,帮帮忙。很着急!! #include #include #define uchar unsigned char #define uint unsigned int #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //正转相序编码 uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; ***it K1 = P3^0; //运行与停止 ***it K2 = P3^1; //设圈数 ***it K3 = P3^2; //方向转换 ***it K4 = P3^3; //转速加 ***it K5 = P3^4; //点动 ***it K6 = P3^5; ***it K7 = P3^6; ***it K8 = P3^7; ***it LCD_RS = P2^0; ***it LCD_RW = P2^1; ***it LCD_EN = P2^2; bit on_off=0,on_off1=0; //运行与停止标志 bit direction=1; //方向标志 bit rate_dr=1; //速率标志 bit snum_dr=1; //圈数标志 uchar code cdis1[ ] = {" STEPPING MOTOR "}; uchar code cdis2[ ] = {"CONTROL PROCESS"}; uchar code cdis3[ ] = {" STOP "}; uchar code cdis4[ ] = {"NUM: RATE: "}; uchar code cdis5[ ] = {" RUNNING "}; uchar code cdis6[ ] = {" DIAN DONG "}; uchar m,v=0,q=0,q1; uint number=0,number1=0; uchar snum=10,snum1=10,number2=0; //预设定圈数 uchar rate=2,rate_ctr; //预设定速率 uchar data_temp,data_temp1,data_temp2; /********************************************************/ /* /* 延时t毫秒 /* 11.0592MHz时钟,延时约1ms /* /********************************************************/ void delay(uint t) //tms { uchar k; while(t--) { for(k=0; k<125; k++) { } } } /********************************************************/ void delayB(uchar x) //x*0.14MS { uchar i; while(x--) { for (i=0; i<13; i++) { } } } /********************************************************/ /********************************************************/ /* /*检查LCD忙状态 /*lcd_busy为1时,忙,等待。为0时,闲,可写指令与数据。 /* /********************************************************/ bit lcd_busy() { bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP(); result = (bit)(P0&0x80); LCD_EN = 0; return(result); } /********************************************************/ /* /*写指令数据到LCD /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 /* /********************************************************/ void lcd_wcmd(uchar cmd) { while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } /********************************************************/ /* /*写显示数据到LCD /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 /* /********************************************************/ void lcd_wdat(uchar dat) { while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } /********************************************************/ /* /* LCD初始化设定 /* /********************************************************/ void lcd_init() { delay(30); lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据 delay(5); lcd_wcmd(0x38); delay(5); lcd_wcmd(0x38); delay(5); lcd_wcmd(0x0c); //显示开,关光标 delay(5); lcd_wcmd(0x06); //写入新数据后光标右移 delay(5); lcd_wcmd(0x01); //清除LCD的显示内容 delay(5); } /********************************************************/ /* /* 设定显示位置 /* /********************************************************/ void lcd_pos(uchar pos) { lcd_wcmd(pos | 0x80); //数据指针=80+地址变量 } /********************************************************/ /* /* LCD1602初始显示子程序 /* /********************************************************/ void LCD_init_DIS() { delay(10); //延时 lcd_init(); //初始化LCD lcd_pos(0); //设置显示位置为第一行的第1个字符 m = 0; while(cdis1[m] != ' |