欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5078|回復(fù): 8
收起左側(cè)

帶插補(bǔ)計(jì)算的四象限步進(jìn)電機(jī)控制仿真與單片機(jī)源程序

[復(fù)制鏈接]
ID:366841 發(fā)表于 2018-7-7 15:03 | 顯示全部樓層 |閱讀模式
51單片機(jī)使用ULN2003A芯片驅(qū)動(dòng)步進(jìn)電機(jī)程序加Proteus仿真。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
TIM截圖20180707150244.png 0.png

單片機(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)


評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:367194 發(fā)表于 2018-7-10 09:25 | 顯示全部樓層
小白有個(gè)問(wèn)題想要問(wèn)一下,F(xiàn),Xe=0,Ye=0,J,Xm=0,Ym=0,dat=0,xiangxian=0這些變量從  int  改為  uchar
型為什么就只有X電機(jī)運(yùn)動(dòng)啊??
回復(fù)

使用道具 舉報(bào)

ID:367194 發(fā)表于 2018-7-10 09:38 | 顯示全部樓層
int F,Xe=0,Ye=0,J,Xm=0,Ym=0,dat=0,xiangxian=0;這條語(yǔ)句把 int 改為 uchar 就只有
回復(fù)

使用道具 舉報(bào)

ID:367194 發(fā)表于 2018-7-10 09:39 | 顯示全部樓層
int F,Xe=0,Ye=0,J,Xm=0,Ym=0,dat=0,xiangxian=0;
這條語(yǔ)句將 int 改為 uchar 為什么只有電機(jī)X運(yùn)動(dòng)??
回復(fù)

使用道具 舉報(bào)

ID:218113 發(fā)表于 2018-7-14 10:35 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:89286 發(fā)表于 2018-7-25 07:52 | 顯示全部樓層
thanks for sharing
回復(fù)

使用道具 舉報(bào)

ID:317629 發(fā)表于 2018-9-7 14:46 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:748774 發(fā)表于 2020-5-15 02:25 來(lái)自觸屏版 | 顯示全部樓層
請(qǐng)問(wèn)怎么輸入坐標(biāo)呀
回復(fù)

使用道具 舉報(bào)

ID:748774 發(fā)表于 2020-5-15 02:46 來(lái)自觸屏版 | 顯示全部樓層
MrXirt 發(fā)表于 2018-7-10 09:39
int F,Xe=0,Ye=0,J,Xm=0,Ym=0,dat=0,xiangxian=0;
這條語(yǔ)句將 int 改為 uchar 為什么只有電機(jī)X運(yùn)動(dòng)??

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表