仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
_CQBYIHP`@[)B[0Y$)@TV}L.png (116.19 KB, 下載次數: 42)
下載附件
2019-6-11 16:25 上傳
步進電機和直流電機能夠單獨工作,仿真開始,兩個電機均不轉動,然后通過按鍵控制對應的點擊正反轉,代碼清晰,作者留有添加電機控速的代碼空間,并且可以很簡單的加入代碼控速模塊。
其中還有一些小細節,直流電機反轉的時候,無法對步進電機進行操作,即在直流電機反轉過程中,控制步進電機正反轉的按鈕無效。其余情況下,可隨意控制直流電機和步進電機的正反轉
系統還有工作指示燈,對應步進電機和直流電機工作情況。
此外,還提供了一個聲光報警系統,當單刀雙擲開關撥至阻塞時,電路報警,電路警示燈亮,蜂鳴器響,兩個電機立刻停止工作。
單片機源程序如下:
- #include<reg52.h>
- #include<stdio.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit key1=P3^0; //用戶按鍵
- sbit key2=P3^1;
- sbit key3=P3^5;
- sbit key4=P3^6;
- sbit danger=P3^2;
- sbit beez=P2^2;
- sbit PWM1=P3^3;
- sbit PWM2=P3^4;
- sbit led1=P2^0;
- sbit led2=P2^1;
- uchar code F_Rotation[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //步進電機驅動
- uchar i;
- uint flag1,flag2,flag3,flag4;
- /******************************************************************/
- /* 延時函數Xms */
- /******************************************************************/
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /******************************************************************/
- /* 獨立按鍵掃描函數 */
- /******************************************************************/
- void keyscan()
- {
- P3=0xff;//拉高P3,以讀取P3口值
- if(key1==0)//鍵1被按下
- {
- delay(5);//延時消抖
- if(key1==0)
- {
- flag1++;
- flag1%=2;
- }
- while(!key1);
- delay(5);//延時消抖
- while(!key1);//松手檢測
- }
- if(key2==0)
- {
- delay(5);
- if(key2==0)
- {
- flag2++;
- flag2%=2;
- }
- while(!key2);
- delay(5);
- while(!key2);
- }
- if(key3==0)
- {
- delay(5);
- if(key3==0)
- {
- flag3++;
- flag3%=2;
- }
- while(!key3);
- delay(5);
- while(!key3);
- }
- if(key4==0)
- {
- delay(5);
- if(key4==0)
- {
- flag4++;
- flag4%=2;
- }
- while(!key4);
- delay(5);
- while(!key4);
- }
- }
- void main()
- {
- TMOD=0x01;
- EA=1;
- EX0=1;
- ET0=0;
- TH0=(65536-(14648))/256;
- TL0=(65536-(14648))%256;
- TR0=0;
-
- while(1)
- {
- //步進正轉
- keyscan();
- while(flag1==1)
- {
- led1=0;
- keyscan();
- if(!flag1){ led1=1; led2=1; break;}
- if(flag2){ led1=1; led2=1; flag1=0; break;}
- if(flag3){ led1=1; led2=1; flag1=0; break;}
- if(flag4){ led1=1; led2=1; flag1=0; break;}
- for(;i<8;i++)
- {
- keyscan();
- P1 = F_Rotation[i];
- if(!flag1){ led1=1; led2=1; break;}
- if(flag2){ led1=1; led2=1; flag1=0; break;}
- if(flag3){ led1=1; led2=1; flag1=0; break;}
- if(flag4){ led1=1; led2=1; flag1=0; break;}
- delay(100);
- }
- i=0;
- led1=1;
- }
- //步進反轉
- keyscan();
- while(flag2==1)
- {
- led1=0;
- keyscan();
- if(flag1){ led1=1; led2=1; flag2=0; break;}
- if(!flag2){ led1=1; led2=1; break;}
- if(flag3){ led1=1; led2=1; flag2=0; break;}
- if(flag4){ led1=1; led2=1; flag2=0; break;}
- for(;i>0;i--)
- {
- keyscan();
- P1 = F_Rotation[i];
- if(flag1){ led1=1; led2=1; flag2=0; break;}
- if(!flag2){ led1=1; led2=1; break;}
- if(flag3){ led1=1; led2=1; flag2=0; break;}
- if(flag4){ led1=1; led2=1; flag2=0; break;}
- delay(100);
- }
- i=8;
- led1=1;
- }
- //直流正轉
- keyscan();
- while(flag3==1)
- {
- led2=0;
- keyscan();
- if(flag1){ led1=1; led2=1; flag3=0; break;}
- if(flag2){ led1=1; led2=1; flag3=0; break;}
- if(!flag3){ led1=1; led2=1; break;}
- if(flag4){ led1=1; led2=1; flag3=0; break;}
- PWM1=0;
- PWM2=0;
- delay(100);
- PWM1=1;
- delay(100);
- led2=1;
- }
- //直流反轉
- keyscan();
- while(flag4==1)
- {
- led2=0;
- keyscan();
- if(flag1);
- if(flag2);
- if(flag3){ led1=1; led2=1; flag4=0; break;}
- if(!flag4){ led1=1; led2=1; break;}
- PWM1=0;
- PWM2=0;
- delay(100);
- PWM2=1;
- delay(100);
- led2=1;
- }
- }
- }
- void int0(void) interrupt 0
- {
- while(danger==0)
- {
- beez=0;
- led1=1;
- led2=1;
- while(!danger);
- beez=1;
- }
- }
復制代碼
所有資料51hei提供下載:
步進電機加直流電機.rar
(69.73 KB, 下載次數: 42)
2019-6-11 16:32 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|