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

標(biāo)題: 帶插補(bǔ)計(jì)算的四象限步進(jìn)電機(jī)控制仿真與單片機(jī)源程序 [打印本頁]

作者: 夏雨右下    時(shí)間: 2018-7-7 15:03
標(biāo)題: 帶插補(bǔ)計(jì)算的四象限步進(jìn)電機(jī)控制仿真與單片機(jī)源程序
51單片機(jī)使用ULN2003A芯片驅(qū)動(dòng)步進(jìn)電機(jī)程序加Proteus仿真。

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


單片機(jī)源程序如下:
  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];  //路徑存儲(chǔ)
  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);                                                //插補(bǔ)計(jì)算
  25. void start(void);                                                //步進(jìn)電機(jī)執(zhí)行與數(shù)碼管顯示


  26. void main(void)
  27. {
  28.         EA = 1;                                           /*************************************/
  29.         ET0 = 1;                                                          
  30.         TMOD = 0x01;                                                 //定時(shí)器初始化//
  31.         TH0= (65536-1000) / 256;                        
  32.         TL0= (65536-1000)%256;          /*************************************/
  33.         TR0 = 1;
  34.         while(1)
  35.         {
  36.                   keyscan();                                                                  //按鍵計(jì)數(shù)獲取
  37.                 chabu();                                                                  //插補(bǔ)計(jì)算,生成步數(shù)軌跡
  38.                 start();                                                                  //電機(jī)按照軌跡運(yùn)行
  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));                           //插補(bǔ)計(jì)算公式
  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))                                         //判斷是否到達(dá)終點(diǎn)
  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;                                                 //定時(shí)1ms
  179.         TL0= (65536-1000)%256;
  180.         key_jishu++;       
  181.         if(key_jishu==10&&key_change==0)                                 //按鍵延時(shí)
  182.         {
  183.                 key_change=1;                                                                 //按鍵標(biāo)志量置1
  184.                 key_jishu=0;                                                                 //計(jì)數(shù)清零
  185.         }                                                               
  186.         if(chabu_flag==1)                                                                   //計(jì)數(shù)10ms的次數(shù),因?yàn)?00太大
  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計(jì)時(shí)
  196.         {
  197.                 motor_flag=1;                                                                        //電機(jī)標(biāo)志量置1
  198.                 dat++;                                                                                         //數(shù)組位置,電機(jī)步數(shù)
  199.                 motor_jishu_a=0;                                                                 //計(jì)數(shù)值清零
  200.         }
  201.         TR0 = 1;       
  202. }
復(fù)制代碼

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



作者: MrXirt    時(shí)間: 2018-7-10 09:25
小白有個(gè)問題想要問一下,F(xiàn),Xe=0,Ye=0,J,Xm=0,Ym=0,dat=0,xiangxian=0這些變量從  int  改為  uchar
型為什么就只有X電機(jī)運(yùn)動(dòng)啊??
作者: MrXirt    時(shí)間: 2018-7-10 09:38
int F,Xe=0,Ye=0,J,Xm=0,Ym=0,dat=0,xiangxian=0;這條語句把 int 改為 uchar 就只有
作者: MrXirt    時(shí)間: 2018-7-10 09:39
int F,Xe=0,Ye=0,J,Xm=0,Ym=0,dat=0,xiangxian=0;
這條語句將 int 改為 uchar 為什么只有電機(jī)X運(yùn)動(dòng)??
作者: quzhihong    時(shí)間: 2018-7-14 10:35
謝謝分享
作者: faridzled    時(shí)間: 2018-7-25 07:52
thanks for sharing
作者: sheep0736    時(shí)間: 2018-9-7 14:46
謝謝分享
作者: 廖滴滴滴    時(shí)間: 2020-5-15 02:25
請(qǐng)問怎么輸入坐標(biāo)呀
作者: 廖滴滴滴    時(shí)間: 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 為什么只有電機(jī)X運(yùn)動(dòng)??

你好,我想請(qǐng)問下怎么把xy的坐標(biāo)輸入進(jìn)去,是通過改程序還是按鍵




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产精品99久久久久久久久 | 一级片在线播放 | 亚洲欧美日韩另类 | 日韩视频免费在线观看 | 国产成人三级一区二区在线观看一 | 婷婷俺也去| 日韩在线不卡视频 | 国产一区在线观看视频 | 国产日韩综合 | 91插插插插插| 欧美日韩在线视频观看 | 黄色三级在线 | 久久亚洲综合 | 自拍偷拍中文字幕 | 日韩视频免费看 | 国产成人午夜精品 | 天天操夜夜摸 | 91蜜桃在线观看 | 国产不卡在线观看 | 久久国产精品一区二区三区 | 国产在线天堂 | 在线观看欧美日韩视频 | 天天天操 | 在线观看黄色小视频 | 91性高潮久久久久久久久 | 手机在线看片1024 | 成人欧美日韩 | 日本丰满肉感bbwbbwbbw | 在线不卡av| 亚洲欧美日韩国产 | 91日韩在线 | 蜜臀久久99精品久久久久宅男 | 亚洲伊人av| 四虎在线免费观看 | 亚洲国产第一页 | 一区二区三区四区在线 | 天天爽天天操 | 四虎四虎 | 成人福利在线 | 欧美日在线 | 精品国产伦一区二区三区 |