久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4887|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

帶插補計算的四象限步進電機控制仿真與單片機源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:366841 發(fā)表于 2018-7-7 15:03 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
51單片機使用ULN2003A芯片驅(qū)動步進電機程序加Proteus仿真。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include<reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit KEY1=P1^0;
  5. sbit KEY2=P1^1;
  6. sbit KEY3=P1^2;
  7. sbit KEY4=P1^3;
  8. sbit KEY5=P1^4;
  9. sbit KEY6=P1^5;
  10. sbit KEY7=P1^6;

  11. uchar code motor_1[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09,
  12.                                           0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90}; //第一象限
  13. uchar code motor_2[]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09,
  14.                                           0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90}; //第二象限
  15. uchar code motor_3[]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09,
  16.                                           0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90};        //第三象限
  17. uchar code motor_4[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09,
  18.                                           0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90};
  19. uchar code shuma[]={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //第四象限

  20. uchar bushu[50];  //路徑存儲
  21. int F,Xe=0,Ye=0,J,Xm=0,Ym=0,dat=0,xiangxian=0;
  22. uint key_flag=0,key_change=0,chabu_flag=0,motor_flag=1,start_flag=0;


  23. void keyscan(void);                                               //獲取按鍵
  24. void chabu(void);                                                //插補計算
  25. void start(void);                                                //步進電機執(zhí)行與數(shù)碼管顯示


  26. void main(void)
  27. {
  28.         EA = 1;                                           /*************************************/
  29.         ET0 = 1;                                                          
  30.         TMOD = 0x01;                                                 //定時器初始化//
  31.         TH0= (65536-1000) / 256;                        
  32.         TL0= (65536-1000)%256;          /*************************************/
  33.         TR0 = 1;
  34.         while(1)
  35.         {
  36.                   keyscan();                                                                  //按鍵計數(shù)獲取
  37.                 chabu();                                                                  //插補計算,生成步數(shù)軌跡
  38.                 start();                                                                  //電機按照軌跡運行
  39.         }
  40. }

  41. void keyscan(void)
  42. {
  43.         static uint key_up=1;
  44.         if(key_up&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0||KEY5==0||KEY6==0||KEY7==0))
  45.         {
  46.                 key_up=0;                                                      // 不支持連按。       
  47.                 if(key_change==1)                                                  //消抖,等待10ms
  48.                 {
  49.                         if(KEY1==0)         Xe++;
  50.                         if(KEY2==0)  Ye++;
  51.                         if(KEY3==0) {key_flag=1;xiangxian=1;}
  52.                         if(KEY4==0) {key_flag=1;xiangxian=2;}
  53.                         if(KEY5==0) {key_flag=1;xiangxian=3;}
  54.                         if(KEY6==0) {key_flag=1;xiangxian=4;}
  55.                         if(KEY7==0) {P0=0X99;}

  56.                 }
  57.         }
  58.         else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1&&KEY5==1&&KEY6==1)key_up=1;//按鍵松開       
  59. }

  60. void chabu(void)
  61. {
  62.         int i,a=0,b=0;
  63.        
  64.         if(key_flag==1)
  65.         {
  66.                 J=Xe+Ye;
  67.                 for(i=0;i<J;i++)
  68.                 {
  69.                         F=((Ym*Xe)-(Xm*Ye));                           //插補計算公式
  70.                         if(F==0||F>0)                                        //如果F大于等于零往X方向走
  71.                         {
  72.                                 a++;
  73.                                 if(a==8)a=0;
  74.                                 bushu[i]=(a-1);
  75.                                 Xm++;       
  76.                         }
  77.                         else                                                         //否則往Y方向走
  78.                         {
  79.                                 b++;
  80.                                 if(b==8)b=0;
  81.                                 bushu[i]=(b+7);
  82.                                 Ym++;
  83.                         }
  84.                         if(i==(J-1))                                         //判斷是否到達終點
  85.                         {
  86.                                 chabu_flag=1;
  87.                                 key_flag=0;
  88.                                 start_flag=1;       
  89.                         }       
  90.                 }
  91.                
  92.         }       
  93. }

  94. void start(void)
  95. {
  96.        
  97.         if(chabu_flag==1&&motor_flag==1&&start_flag==1&&xiangxian==1)//判斷是否為第一象限
  98.         {          
  99.                 motor_flag=0;
  100.                 P0=motor_1[bushu[dat]];
  101.                 if(bushu[dat]<8)
  102.                 {
  103.                         P2=shuma[bushu[dat]];
  104.                 }
  105.                 else
  106.                 {
  107.                         P3=shuma[(bushu[dat]-8)];
  108.                 }
  109.                 if(dat==(J-1))
  110.                 {
  111.                         Xe=0;Ye=0;Xm=0;Ym=0;dat=0;              //初始化變量
  112.                         key_flag=0;key_change=0;chabu_flag=0;
  113.                         motor_flag=1;start_flag=0;              //初始化標(biāo)志量
  114.                 }       
  115.         }


  116.         if(chabu_flag==1&&motor_flag==1&&start_flag==1&&xiangxian==2)//判斷是否為第二象限
  117.         {          
  118.                 motor_flag=0;
  119.                 P0=motor_2[bushu[dat]];
  120.                 if(bushu[dat]<8)
  121.                 {
  122.                         P2=shuma[bushu[dat]];
  123.                 }
  124.                 else
  125.                 {
  126.                         P3=shuma[(bushu[dat]-8)];
  127.                 }
  128.                 if(dat==(J-1))
  129.                 {
  130.                         Xe=0;Ye=0;Xm=0;Ym=0;dat=0;              //初始化變量
  131.                         key_flag=0;key_change=0;chabu_flag=0;
  132.                         motor_flag=1;start_flag=0;              //初始化標(biāo)志量
  133.                 }       
  134.         }

  135.         if(chabu_flag==1&&motor_flag==1&&start_flag==1&&xiangxian==3)//判斷是否為第三象限
  136.         {          
  137.                 motor_flag=0;
  138.                 P0=motor_3[bushu[dat]];
  139.                 if(bushu[dat]<8)
  140.                 {
  141.                         P2=shuma[bushu[dat]];
  142.                 }
  143.                 else
  144.                 {
  145.                         P3=shuma[(bushu[dat]-8)];
  146.                 }
  147.                 if(dat==(J-1))
  148.                 {
  149.                         Xe=0;Ye=0;Xm=0;Ym=0;dat=0;              //初始化變量
  150.                         key_flag=0;key_change=0;chabu_flag=0;
  151.                         motor_flag=1;start_flag=0;              //初始化標(biāo)志量
  152.                 }       
  153.         }

  154.    if(chabu_flag==1&&motor_flag==1&&start_flag==1&&xiangxian==4) //判斷是否為第四象限
  155.         {          
  156.                 motor_flag=0;
  157.                 P0=motor_4[bushu[dat]];
  158.                 if(bushu[dat]<8)
  159.                 {
  160.                         P2=shuma[bushu[dat]];
  161.                 }
  162.                 else
  163.                 {
  164.                         P3=shuma[(bushu[dat]-8)];
  165.                 }
  166.                 if(dat==(J-1))
  167.                 {
  168.                         Xe=0;Ye=0;Xm=0;Ym=0;dat=0;              //初始化變量
  169.                         key_flag=0;key_change=0;chabu_flag=0;
  170.                         motor_flag=1;start_flag=0;              //初始化標(biāo)志量
  171.                 }       
  172.         }
  173. }

  174. void Timer0( ) interrupt 1
  175. {
  176.         static uchar key_jishu=0,motor_jishu=0,motor_jishu_a=0;
  177.         TR0 = 0;
  178.         TH0= (65536-1000) / 256;                                                 //定時1ms
  179.         TL0= (65536-1000)%256;
  180.         key_jishu++;       
  181.         if(key_jishu==10&&key_change==0)                                 //按鍵延時
  182.         {
  183.                 key_change=1;                                                                 //按鍵標(biāo)志量置1
  184.                 key_jishu=0;                                                                 //計數(shù)清零
  185.         }                                                               
  186.         if(chabu_flag==1)                                                                   //計數(shù)10ms的次數(shù),因為500太大
  187.         {
  188.                 motor_jishu++;
  189.                 if(motor_jishu==10)
  190.                 {
  191.                         motor_jishu_a++;
  192.                         motor_jishu=0;
  193.                 }
  194.         }

  195.         if(motor_flag==0&&motor_jishu_a==50)                                 //50ms計時
  196.         {
  197.                 motor_flag=1;                                                                        //電機標(biāo)志量置1
  198.                 dat++;                                                                                         //數(shù)組位置,電機步數(shù)
  199.                 motor_jishu_a=0;                                                                 //計數(shù)值清零
  200.         }
  201.         TR0 = 1;       
  202. }
復(fù)制代碼

所有資料51hei提供下載:
步進電機控制.rar (63.11 KB, 下載次數(shù): 71)


評分

參與人數(shù) 2黑幣 +55 收起 理由
MrXirt + 5 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:367194 發(fā)表于 2018-7-10 09:25 | 只看該作者
小白有個問題想要問一下,F(xiàn),Xe=0,Ye=0,J,Xm=0,Ym=0,dat=0,xiangxian=0這些變量從  int  改為  uchar
型為什么就只有X電機運動啊??
回復(fù)

使用道具 舉報

板凳
ID:367194 發(fā)表于 2018-7-10 09:38 | 只看該作者
int F,Xe=0,Ye=0,J,Xm=0,Ym=0,dat=0,xiangxian=0;這條語句把 int 改為 uchar 就只有
回復(fù)

使用道具 舉報

地板
ID:367194 發(fā)表于 2018-7-10 09:39 | 只看該作者
int F,Xe=0,Ye=0,J,Xm=0,Ym=0,dat=0,xiangxian=0;
這條語句將 int 改為 uchar 為什么只有電機X運動??
回復(fù)

使用道具 舉報

5#
ID:218113 發(fā)表于 2018-7-14 10:35 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報

6#
ID:89286 發(fā)表于 2018-7-25 07:52 | 只看該作者
thanks for sharing
回復(fù)

使用道具 舉報

7#
ID:317629 發(fā)表于 2018-9-7 14:46 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報

8#
ID:748774 發(fā)表于 2020-5-15 02:25 來自觸屏版 | 只看該作者
請問怎么輸入坐標(biāo)呀
回復(fù)

使用道具 舉報

9#
ID:748774 發(fā)表于 2020-5-15 02:46 來自觸屏版 | 只看該作者
MrXirt 發(fā)表于 2018-7-10 09:39
int F,Xe=0,Ye=0,J,Xm=0,Ym=0,dat=0,xiangxian=0;
這條語句將 int 改為 uchar 為什么只有電機X運動??

你好,我想請問下怎么把xy的坐標(biāo)輸入進去,是通過改程序還是按鍵
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人a免费| 国产精品国产成人国产三级 | 国产精品久久久久久久久久久久午夜片 | 日朝毛片 | 欧美一区二区三区在线观看视频 | 国产精品成人一区二区 | 久久久一区二区三区四区 | 国产免费自拍 | 久久福利电影 | www.天天操.com | 欧美日韩精品一区 | 日韩免费av网站 | 国产一区二区在线播放视频 | 日本不卡一区二区三区在线观看 | 亚洲精品中文字幕在线观看 | 最新黄色毛片 | 国产成人精品一区二区三区在线观看 | 午夜视频在线观看视频 | 欧美日韩国产一区二区三区不卡 | 久久久久久一区 | 日韩精品久久久久久 | 精品日韩一区二区 | 国产欧美日韩在线 | 我爱操 | 久久久激情 | 亚洲导航深夜福利涩涩屋 | 在线午夜 | 欧美精品一区二区蜜桃 | 中文字幕av在线播放 | 亚洲av毛片成人精品 | 日韩中文字幕一区 | 一区二区三区国产 | 精品国产一区二区在线 | 日本精品一区二区三区在线观看视频 | 一级特黄色毛片 | 一级久久久久久 | 欧美日韩在线视频一区二区 | 久久亚洲一区 | 日韩欧美专区 | 日韩一区二区免费视频 | 在线视频亚洲 |