请高手看下程序有那些漏洞,请赐教 #include <reg51.h> //51芯片管脚定义头文件 #include <intrins.h> //内部包含延时函数 _nop_() ; #define uchar unsigned char #define uint unsigned int
uchar code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6} ; uchar code REV[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe} ; bit bzhi1 ;//上升标志位 bit bzhi2 ;//下降标志位 bit bzhi3 ;//半旗升标志位 bit bzhi4 ;//半旗降标志位 sbit K1 = P3^0 ; //正转 sbit K2 = P3^1 ; //反转 sbit K3 = P3^2 ; //停止 sbit K4 = P3^3 ; //半旗升 sbit K5 = P3^4; //半旗降 sbit BEEP = P2^0 ; //蜂鸣器 sbit dian=P2^1; uint LL=0; uchar v=1; uint r,g,m,N=40; //N 步进电机运转圈数 /********************************************************/ // 11.0592MHz时钟,延时约1ms /********************************************************/ void delay(uint t) { uint 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++) {}; } } /**********************************************************/ void beep() { uchar i ; for (i=0 ;i<100 ;i++) { delayB(4) ; BEEP=!BEEP ; //BEEP取反 } BEEP=1 ; //关闭蜂鸣器 }
/********************************************************/ /*步进电机正转 /********************************************************/ void motor_ffw(v) { uchar i; uint j; for(j=0;j<12;j++) //转1*n圈 { if(j==3) { LL=LL+6;} if(j==7) { LL=LL+6;} if(K3==0) {break;} //退出此循环程序 for(i=0;i<8;i++) //一个周期转30度 { P1=FFW; //取数据 delay(3); //调节转速 } if(j==11) { LL=LL+6;} } } /********************************************************/ /*步进电机反转 /********************************************************/ void motor_rev(v) { uchar i; uint j; for(j=0;j<12;j++) //转1×n圈 {if(j==3) LL=LL-6; if(j==7) LL=LL-6; if(K3==0) {break;} //退出此循环程序 for(i=0;i<8;i++) //一个周期转30度 { P1=REV; //取数据 delay(3); //调节转速 } if(j==11) LL=LL-6; } } /************提一位数显示*********************************/ gewei(g) { uchar y,h0,h1; y=g&0x0f; P0=y; dian=1; delay(2); h0=0&0x0f; h0=h0|0x10; P0=h0; dian=0; delay(2); h1=0&0x0f; h1=h1|0x20; P0=h1; dian=1; delay(2); } /************提两位数显示*********************************/ shiwei(g) { uchar k,M,h; k=g%10; k=k&0x0f; P0=k; dian=1; delay(2); M=g/10; M=M&0x0f;//屏蔽高四位 M=M|0x10;//0x10选中十位 P0=M; dian=0; delay(2); h=0&0x0f; h=h|0x20; P0=h; dian=1; delay(2); } /************提三位数显示*********************************/ baiwei(g) { uint k1,M1,M0; k1=g%10; k1=k1&0x0f; P0=k1; dian=1; delay(2); M1=g/10; M1=M1%10; M1=M1&0x0f;//屏蔽高四位 M1=M1|0x10;//0x10选中十位 P0=M1; dian=0; delay(2); M0=g/100; M0=M0&0x0f; M0=M0|0x20; P0=M0; dian=1; delay(2); } /************************************************/ void display(m) {if(m<10) gewei(m); else if(m>=10&&m<100) shiwei(m); else if(m>=100&&m<1000) baiwei(m); } /************************************************/ // 主程序 /**************************************************/ main() { TMOD=0x01; TH0=0xb8; TL0=0x00; EA=1; ET0=1; TR0=1; while(1) { //**************正转************* if(K1==0) { // hh=0; LL=0; bzhi2=0; bzhi3=0; bzhi4=0; for(r=0;r<=N;r++) { if(bzhi1==1) {break;} else beep(); motor_ffw(v); //电机正转 if(r==40) { bzhi1=1; break; } } } //**************反转************************* else if(K2==0) { LL=738; bzhi1=0; bzhi3=0; bzhi4=0; for(r=N;r>=0;r--) { if(bzhi2==1) {break;} else BEEP=1; motor_rev(v); //电机反转 if(r==0) {bzhi2=1; break; } } } //*****************半旗升************************ else if(K4==0) { LL=0; bzhi1=0; bzhi2=0; bzhi4=0; for(r=0;r<=N;r++) {if(bzhi3==1) {break;} else { beep(); motor_ffw(v); //电机正转 if(r==40) {for(r=N;r>=2*N/3;r--) { BEEP=1; motor_rev(v); //电机反转 if(r==2*N/3) {bzhi3=1; break;} } } } } } //*****************半旗降************************ else if(K5==0) { LL=468; bzhi1=0; bzhi2=0; bzhi3=0; for(r=2*N/3;r<=N;r++) { if(bzhi4==1) {break;} else { motor_ffw(v); //电机正转 if(r==40) { for(r=40;r>=0;r--) { if(bzhi4==1) break; BEEP=1; motor_rev(v); //电机反转 if(r==0) {bzhi4=1; break;} } } } } } } } timer0() interrupt 1 { TH0=0xb8; TL0=0x00; display(LL); }
|