完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我是一个纯新手,根据网上的LCD程序和正反转程序,自己稍微弄了个程序,但是仿真时候LCD是亮了,却没有显示数据;而电机根本没有运转。求高手解答,我是一个新手,真新手。 /*直流电机的PWM速度控制程序*/ /*晶振采用11.0592M,产生pwm的频率约为91hz*/ /*LCD程序*/ #include #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 K3 = P3^2; //方向转换 ***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; //速率标志 uchar code cdis1[ ] = {" STEPPING MOTOR "}; uchar code cdis2[ ] = {"CONTROL PROCESS"}; uchar code cdis3[ ] = {" STOP "}; uchar code cdis4[ ] = {"NO: RATE: TEXT: "}; uchar code cdis5[ ] = {" RUNNING "}; uchar m,v=0,q=0,q1; uchar data_temp,data_temp1,data_temp2; ***it en1=P2^7; /*L298 Enable A*/ ***it en2=P3^0; /*L298 Enable B*/ ***it s1=P2^3; /*L298 input 1*/ ***it s2=P2^4; /*l298 input 2*/ ***it s3=P2^5; /*L298 Input 3*/ ***it s4=P2^6; /*L298 Inout 4*/ uchar t=0; /*中断计数器*/ uchar m1=0; /*电机1速度值*/ uchar m2=0; /*电机2速度值*/ uchar tmp1,tmp2; /*电机当前速度值*/ /*电机控制函数index-电机号(1,2);speed-电机速度(-100-100)*/ void motor_1(uchar index,char speed) { if(speed>=-100&&speed<=100) { if(index==1); /*电机1的处理*/ { m1=abs(speed); /*取速度值的绝对值*/ if(speed<0) /*速度值为负则反转*/ { s1=0; s2=1; } else /*不为负数则正转*/ { s1=1; s2=0; } } } } void motor_2(uchar index,char speed) { if(speed>=-100&&speed<=100) { if(index==2) /*电机2的处理*/ { m2=abs(speed); /*电机2的速度控制*/ if(speed<0) /*电机2的方向控制*/ { s3=0; s4=1; } else { s3=1; s4=0; } } } } void motor_12(uchar index,char speed) { if(speed>=-100&&speed<=100) { if(index==1); /*电机1的处理*/ { m1=abs(speed); /*取速度值的绝对值*/ if(speed<0) /*速度值为负则反转*/ { s1=0; s2=1; } else /*不为负数则正转*/ { s1=1; s2=0; } } if(index==2) /*电机2的处理*/ { m2=abs(speed); /*电机2的速度控制*/ if(speed<0) /*电机2的方向控制*/ { s3=0; s4=1; } else { s3=1; s4=0; } } } } void delayA(uint j)/*简易延时函数*/ { for(j;j>0;j--); } /********************************************************/ /* /* 延时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] != ' |