步进电机控制程序(c语言51单片机)

来源:本站
导读:目前正在解读《步进电机控制程序(c语言51单片机)》的相关信息,《步进电机控制程序(c语言51单片机)》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《步进电机控制程序(c语言51单片机)》的详细说明。
简介:本文主要介绍的是基于51单片机的进电机控制c语言程序

#i nclude<reg51.h>#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/* 齿轮数 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;            /* 记录已转的 齿轮数 , 中断1次 加 1*/uint   set_round_num = 0;            /* 播码盘设置 圈数 */uint   set_pwm_width = 0;            /* 播码盘设置 步进电机 正向速度 */bit    one_round_flg = 0;sbit   led_1000       = P0^7;         //use for displaysbit   led_100        = P0^6;         //use for displaysbit   led_10         = P0^5;         //use for displaysbit   led_1          = P0^4;         //use for displaysbit   key_start      = P3^0;sbit   key_puse       = P3^0;sbit   key_clear      = P3^1;                                    /*   P3^2 接齿轮传感器 中断   */sbit   bujin_zx_stop = P3^3;         /* 接步进电机 ,正向到位传感器 ,为 0 停机 */sbit   bujin_fx_stop = P3^4;         /* 接步进电机 ,反向到位传感器 ,为 0 停机 */sbit   shache         = P3^5;         /* 接刹车控制继电器    0 电位有效 */sbit   pri_dj         = P3^6;         /* 接主电机控制继电器 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     /* 转一圈 50 次循环,每循环 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   {    /* 主电机 齿轮 中断 */     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;}

提醒:《步进电机控制程序(c语言51单片机)》最后刷新时间 2024-03-14 01:05:03,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《步进电机控制程序(c语言51单片机)》该内容的真实性请自行鉴别。