找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5767|回复: 3
收起左侧

单片机28BYJ-48步进电机控制器仿真+代码

[复制链接]
ID:430087 发表于 2018-11-30 23:29 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
无标题.jpg
0.png

单片机源程序如下:



  1. #include  "macro.h"
  2. typedef unsigned int  u16;
  3. u16 un;
  4. uchar  buf_Direction;                  //?????????
  5. uint  set_speed;                          //?????????
  6. uchar step_motor_loop[8]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};//28byj-48电机时序


  7. //uchar step_motor_loop[4]={0x09,0x06,0x03,0x0c};//42步进时序


  8. uchar step_index;


  9. #define CST_STEP_MOTOR_Z      10                                  //??
  10. #define CST_STEP_MOTOR_F       20                                  //??
  11. #define CST_STEP_MOTOR_ST     0                            //?
  12. #define     fosc_12MHz                  12  
  13. #define     fosc_24MHz                  24     
  14. #define     fosc_setting                 fosc_12MHz
  15. //????1
  16. #define CST_TIME_MS    200   
  17. #define CST_TH0          (65536-CST_TIME_MS*fosc_setting/fosc_12MHz)/256
  18. #define CST_TL0          (65536-CST_TIME_MS*fosc_setting/fosc_12MHz)%256
  19. uchar buf_SpeedString[]="    ";


  20. //void iniLCD(void);                                                           
  21. //void list_write_HZ_Str( int x1,int y1,  uchar *point ) ;
  22. void delay(u16 num)
  23. {
  24.         u16 x,y;
  25.         for(x=num; x>0; x--)
  26.                 for(y=110; y>0; y--)
  27.                 {
  28.                         ;//??1ms
  29.                 }
  30. }
  31. void step_motor_driver(void)
  32. {
  33. static uint speed_delay=0;

  34. speed_delay++;
  35. if( buf_Direction==CST_STEP_MOTOR_Z)
  36.    {
  37.    P0=step_motor_loop[step_index];
  38.    if(speed_delay >=set_speed )
  39.      {
  40.       speed_delay =0;
  41.       step_index--;                                                   
  42.       if(step_index <=0)
  43.              step_index =7;
  44. //=================================================转1圈                        
  45.                         un++;
  46.                         if(un>=3600)
  47.                         {
  48.                                 un=0;
  49.                                 step_index=3;
  50.                                 buf_Direction=0;
  51.                                 
  52.                         }
  53.                         //=================================================
  54.           }


  55.    }
  56. else if( buf_Direction==CST_STEP_MOTOR_F)
  57.    {
  58.   
  59.    P0=step_motor_loop[step_index];
  60.    if(speed_delay >=set_speed)
  61.      {
  62.       speed_delay =0;
  63.       step_index++;                                                   //??7,????
  64.       if(step_index >7)
  65.              step_index =0;
  66.                         //=================================================转1圈
  67.                         un++;
  68.                         if(un>=4100)
  69.                         {
  70.                                 un=0;
  71.                                 step_index=3;
  72.                                 buf_Direction=0;
  73.                                 
  74.                         }
  75.                         //============================================
  76.           }
  77.         }
  78. else
  79.     {
  80.       speed_delay =0;
  81.                                 un=0;
  82.                                 step_index=3;
  83.       P0=0x00;
  84.     }

  85. }




  86. //*********************************************************
  87. //******************??????****************************
  88. //************************************************************
  89. void key_Scan (void)
  90. {
  91. static uchar key_loose=0;
  92. uchar temp=0;


  93.   P1=0XFF;
  94. temp=P1&0xFF;
  95. if(key_loose >0)
  96.   {
  97.   if(temp==0xFF)
  98.      key_loose=0;
  99.   return;
  100.   }
  101. else if(temp !=0xFF)
  102.   {
  103.   key_loose=10;
  104.   temp=P1&0xFF;
  105.   switch(temp)
  106.          {
  107.           case 0xFE:      
  108.                         buf_Direction=CST_STEP_MOTOR_Z;
  109.                       //  list_write_HZ_Str(6,20,"??");
  110.                         // caluate();

  111.                           break;           
  112.                           
  113.           case 0xFD:   
  114.                         buf_Direction=CST_STEP_MOTOR_F;
  115.                          // list_write_HZ_Str(6,20,"??");
  116.                            // caluate();
  117.                           break;                          
  118.            case 0xFB:   
  119.                         buf_Direction=CST_STEP_MOTOR_ST;
  120.                          // list_write_HZ_Str(6,20,"??");
  121.                 //          list_write_HZ_Str(6,60,"     ");
  122.                           break;                  
  123.           case 0xEF:   
  124.                         if(buf_Direction !=CST_STEP_MOTOR_ST)
  125.                                      {
  126.                                           if(set_speed <100)
  127.                                              set_speed +=5;;      //??
  128.                                              // caluate();
  129.                                          }
  130.                        
  131.                                         break;
  132.           case 0xF7:   
  133.                        if(buf_Direction !=CST_STEP_MOTOR_ST)
  134.                                      {
  135.                                           if(set_speed >2)
  136.                                              set_speed -=5;      //??
  137.                                            // caluate();
  138.                                          }
  139.                      
  140.                                         break;
  141.           default:         
  142.                         break;                                //?????
  143.          }

  144.   }
  145. }

  146. void isr_timer0 (void) interrupt 1 using 1
  147. {


  148. TH0=CST_TH0;
  149. TL0=CST_TL0;

  150. step_motor_driver();
  151. }



  152. void init_timer0(void)
  153. {
  154. TCON=0x00;
  155. TMOD=0x00;
  156. TL0=0x00;
  157. TH0=0x00;
  158. TCON=0x00;
  159. // Timer 0 C/T=0,??????
  160. //Timer 0 M1,M0=0,1 .work  mode 1 www.gdzs.si.gov.cn
  161. TMOD=0x01; //GATE=0,??????TR0 ?????0 ?C/T=0,??????
  162. TH0=CST_TH0;
  163. TL0=CST_TL0;
  164. TF0=0;//clear 0. count over flag.
  165. TR0=1;// enable TIMER0 ,start count
  166. ET0=1; //enable accept interrupt

  167. }

  168. //***********************?***?****?********?********************
  169. void main(void)
  170. {  
  171.    P2=0xff;
  172.    P1=0xff;
  173.    P0=0Xff;
  174.    init_timer0();
  175.    //iniLCD();                                      //??? LCD

  176.    buf_Direction=CST_STEP_MOTOR_ST;
  177.    set_speed=30;
  178.    step_index=3;
  179.    EA=1;                                               //???
  180.    while(1)
  181.      {
  182.      key_Scan();
  183.    }
  184. }
复制代码

所有资料51hei提供下载:
步进控制.zip (25.13 KB, 下载次数: 87)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:260698 发表于 2018-12-10 19:58 | 显示全部楼层
尴尬,你的版本太高了
回复

使用道具 举报

ID:865245 发表于 2020-12-23 16:03 | 显示全部楼层
P1端口不用上拉电阻,好像也是可以的吧?
回复

使用道具 举报

ID:143767 发表于 2020-12-23 18:17 | 显示全部楼层
P1口接的电阻不是上拉,是稳定工作点的,阻值最好在4.7K到10K之间
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表