步進(jìn)電機(jī)控制程序(c語言+51單片機(jī))
#include
#define uint? unsigned int
#define uchar unsigned char
#define ms *77
// f = 12 M
#define LEDLen 4
#define Dj_star() {IE=0x81; pri_dj=0; }
#define Dj_stop() {IE=0x00; pri_dj=1; P1=0xff; shache="0"; delay(800ms); delay(800ms);delay(400ms); shache = 1; }
#define Chilun_Num 8
/* 齒輪數(shù) 8 個*/
#define set_display_num() { LEDBuf[0] = tmp / 1000;???? LEDBuf[1] = tmp / 100 % 10;? \
??????????????????????????? LEDBuf[2] = tmp / 10 % 10;? LEDBuf[3] = tmp % 10;??????? }
uchar LEDBuf[LEDLen] = {0,0,0,0};
void? read_num ();??????????????? /* 讀播碼盤 到 set_round_num? * 8 */
void? display? ();
void? delay(uint? delay_time) { uint? i; for (i=0; i < delay_time ; i++) ; }
void? run ();
void? fx_run();
uint? round_num???? = 0;?????????? /* 記錄已轉(zhuǎn)的 齒輪數(shù) , 中斷1次 加 1*/
uint? set_round_num = 0;?????????? /* 播碼盤設(shè)置 圈數(shù) */
uint? set_pwm_width = 0;?????????? /* 播碼盤設(shè)置 步進(jìn)電機(jī) 正向速度 */
bit?? one_round_flg = 0;
sbit? led_1000????? = P0^7;??????? //use for display
sbit? led_100?????? = P0^6;??????? //use for display
sbit? led_10??????? = P0^5;??????? //use for display
sbit? led_1???????? = P0^4;??????? //use for display
sbit? key_start???? = P3^0;
sbit? key_puse????? = P3^0;
sbit? key_clear???? = P3^1;
?????????????????????????????????? /*? P3^2 接齒輪傳感器 中斷? */
sbit? bujin_zx_stop = P3^3;??????? /* 接步進(jìn)電機(jī) ,正向到位傳感器 ,為 0 停機(jī) */
sbit? bujin_fx_stop = P3^4;??????? /* 接步進(jìn)電機(jī) ,反向到位傳感器 ,為 0 停機(jī) */
sbit? shache??????? = P3^5;??????? /* 接剎車控制繼電器?? 0 電位有效 */
sbit? pri_dj??????? = P3^6;??????? /* 接主電機(jī)控制繼電器 0 電位有效 */
void main(){
??????? TCON = 0x01;
??????? display();
??????? while(1) {
??????????? IE="0x00";
??????????? round_num = 0;
??????????? display();
??????????? if ( bujin_fx_stop ) fx_run();
??????????? while ( key_start );
??????????? delay ( 8ms );
??????????? if(!key_start){
??????????????? read_num();
??????????????? //set_round_num? = 8;
??????????????? while ( !key_start );
??????????????? run ();
??????????????? fx_run();
??????????? }
??????? }
}
void run () {
??? #define Delay_time?? 180
??? /* 轉(zhuǎn)一圈 50 次循環(huán),每循環(huán) 4 步 ,50 * 4 = 200 , 200 * 1。8 = 360 */
??? uchar i ;
??? P1 = 0xff;
??? set_pwm_width = 15 + set_pwm_width / 10;
??? while ( 1 ) {
??????????? while( !shache | !key_start );
??????????? Dj_star();
??????????? for ( i="0" ; bujin_zx_stop & !pri_dj;i++ ){
??????????????? P1 =? 0xf9;
??????????????? delay ( Delay_time? );??????? // bujin_zx_stop = P3^3;
??????????????? P1 =? 0xfc;?????????????????? // bujin_fx_stop = P3^4;
??????????????? delay ( Delay_time);????????? // key_puse????? = P3^0;
??????????????? P1 =? 0xf6;?????????????????? // key_clear???? = P3^1;
??????????????? delay ( Delay_time? );??????? // shache??????? = P3^5;
??????????????? P1 =? 0xf3;?????????????????? // pri_dj??????? = P3^6;
??????????????? delay ( Delay_time );
??????????????? if( i == set_pwm_width ) { P1 = 0xff; i = 0; one_round_flg = 0; while ( !one_round_flg & key_puse );}
??????????????? if(!key_puse) { delay(4ms);? if(!key_puse) break;? }
??????????? }
??????????? P1 = 0xff;
??????????? if ( pri_dj )? break;
??????????? if ( !key_puse ) {
??????????????? delay ( 8ms );
??????????????? if ( !key_puse? ) {
??????????????????? Dj_stop();
??????????????????? while ( !key_puse );
??????????????????? // next pree key
??????????????????? while( !shache );
??????????????????? while(1){
??????????????????????? while (? key_puse &? key_clear );
??????????????????????? delay ( 8ms );
??????????????????????? if ( !key_clear )? { round_num = 0; display(); }
??????????????????????? if ( !key_puse? )? break;
??????????????????? }
??????????????????? while( !key_puse );
??????????????????? delay(8ms);
??????????????????? while( !key_puse );
???????????????? }
??????????? }
??? }
}
void ext_int0(void) interrupt 0? {?? /* 主電機(jī) 齒輪 中斷 */
??? uint tmp;
??? EA = 0;
??? if( !pri_dj ){
??????????? round_num ++;
??????????? if (round_num % Chilun_Num == 0 ){
??????????????? one_round_flg = 1;
??????????????? tmp = round_num? / Chilun_Num ;
??????????????? set_display_num();
??????????????? P0 = 0xf0;
??????????????? P0 = P0 | LEDBuf[0] ;
??????????????? led_1000? = 0;
??????????????? P0 |= 0xf0;
??????????????? P0 = 0xf0;
??????????????? P0 = P0 | LEDBuf[1] ;
??????????????? led_100?? = 0;
??????????????? P0 |= 0xf0;
??????????????? P0 = 0xf0;
??????????????? P0 = P0 | LEDBuf[2] ;
??????????????? led_10??? = 0;
??????????????? P0 |= 0xf0;
??????????????? P0 = 0xf0;
??????????????? P0 = P0 | LEDBuf[3] ;
??????????????? led_1???? = 0;
??????????????? P0 |= 0xf0;
??????????????? P0 = 0xf0;
??????????? }
??????????? if ( round_num >= set_round_num? ) Dj_stop();
??????? }
??? EA = 0x81;
}
void display(){
???? uchar i;
???? uint tmp = 0;
???? tmp = round_num? / Chilun_Num ;
???? set_display_num();
???? for(i = 0; i < LEDLen ; i ++){
?????????? P0 = 0xf0;
?????????? P0 = P0 | LEDBuf[i] ;
?????????? if(i==0) led_1000? = 0;??????? //P0^4
?????????? if(i==1) led_100?? = 0;??????? //P0^5
?????????? if(i==2) led_10??? = 0;??????? //P0^6
?????????? if(i==3) led_1???? = 0;??????? //P0^7
?????????? P0 |= 0xf0;
???? }
???? P0 = 0xf0;
}
void read_num(){
???? /* 讀播碼盤 到 set_round_num? ,set_pwm_width? */
???? uchar tmp;
???? P2 =? 0xFF;
???? P2 =? 0xEF;??? // 1110 1111
???? delay ( 1ms? );
???? tmp =?? ~(P2? | 0xF0);
???? P2 =? 0xDF;??? // 1101 1111
???? delay ( 1ms? );
???? tmp = (~(P2 | 0xF0 )) * 10?? + tmp;
???? set_round_num = tmp;
???? P2 =? 0xBF;??? // 1011 1111
???? delay ( 1ms? );
???? tmp = (~(P2 | 0xF0));
???? P2 =? 0x7F;??? // 0111 1111
???? delay ( 1ms? );
???? tmp = (~(P2 | 0xF0)) * 10 + tmp;
???? set_round_num = set_round_num? + tmp * 100;
???? set_round_num = set_round_num? * Chilun_Num;
???? P2 =? 0xFF;
???? P1 =? 0xbF;??? // 0111 1111
???? delay ( 1ms );
???? tmp =?? ~(P2? | 0xF0) ;
???? P1? =? 0xFF;
???? P2? =? 0xFF;
???? P1 &=? 0x7F;??? // 1011 1111
???? delay ( 1ms );
???? tmp = (~(P2 | 0xF0)) * 10 + tmp ;
???? set_pwm_width = tmp ;
???? P1? = 0xFF;
???? P2? = 0xFF;
}
void? fx_run(){
??? #define f_Delay_time 180
??? while ( bujin_fx_stop ) {?? /* 反向 回車 直到 傳感器 動作*/
??????? P1 =? 0xf3;?????????????????? //0011
??????? delay ( f_Delay_time );
??????? P1 =? 0xf6;?????????????????? //0110
??????? delay ( f_Delay_time );
??????? P1 =? 0xfc;?????????????????? //1100
??????? delay ( f_Delay_time );
??????? P1 =? 0xf9;?????????????????? //1001
??????? delay ( f_Delay_time );
??? }
??? P1 = 0xff;
}
評論
查看更多