| 
 
| 请高手看下程序有那些漏洞,请赐教 #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);
 }
 
 
 
 
 
 | 
 |