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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4172|回復: 1
收起左側

STC12C5A60S2單片機+控制步進電機和舵機實現物料搬運程序

[復制鏈接]
ID:900977 發表于 2021-4-15 16:15 | 顯示全部樓層 |閱讀模式
#include <STC12C5A60S2.h>
/*
  使用元件:42兩向步進電機              1個
                  TB6600盒式步進電機驅動器    1個
                                                SG90舵機                    2個
                                                限位開關                    1個
            STC12C5A60S2最小系統        1個
        42電機接線:無論從哪邊開始數,我們只接1 34 6這四個相位
        TB6600接線:共陽極接法,PUL-》P1^0  ENA-》P1^1 DIR-》P1^2
        SG90接線:爪子》P1^3   上下舵機》P1^4
        限位開關:
*/
/*調速等級表,5個檔位。1細分, 200脈沖一圈。         一個脈沖是1.8度。
計算:
4000,8ms一個脈沖(高電平4MS,低電平4MS,共是8MS)。 200個脈沖就是:1.6秒, 即1.6秒步進電機走一圈。37.5圈/分
4000 起步會失步在1細分的情況下。
3000        6ms                                                                                                                        1.2                                                          50圈/分
2000, 4ms一個脈沖(高電平2MS,低電平2MS,共是4MS)。 200個脈沖就是:0.8秒, 即0.8秒步進電機走一圈。75圈/分
1000,就是0.4秒/圈, 150圈/分。
500       0.2秒/圈,  300圈/分
250       0.1秒/圈   600圈/分。  500US一個脈沖。1S就是2000個脈沖,IO輸出就是2MHZ.在STC89C52的范圍內。
再細分下去,超出C52的范圍。

我這步進最佳最快有效是600轉/分。最快1000圈/分*/
//電機控制引腳
sbit CLK  = P1^0;          //PUL-
sbit ENA  = P1^1;           //ENA-
sbit DIR  = P1^2;          //DIR-
//限位控制端
sbit StopStart  = P1^5;           //限位開關
sbit SG_PWM=P1^3;
sbit SG_PWM1=P1^4;
unsigned char USARTbuf[10];    //設置8位的unsigend char型寄存器用來暫存串口接收內容
unsigned int counttemp=0;                                   //暫存停止前的COUNT計數
unsigned int count=0,flag=0,flag1=0,flag2=0,flag3=0;
unsigned int SPEED=0;
bit Run_Status=1;                                                   //默認是電機啟動狀態
unsigned int Tspeed[5]={250,500,1000,2500,3000};
unsigned int setspeed=6,cespeed; // 2 4 6 10 12
unsigned char count1=0;
unsigned char PWM_count;//1--0度,2--45度,3--90度,4--135度,5--180度
unsigned char PWM_count1;
unsigned char a=0;

void delay(unsigned int n);
void bujin(int fanxiang,int bushu);
void Timer_Init()
{
        TMOD&=0x0F;            //把TMOD高4位清0
        TMOD=0X21;//T0定時方式1
        TH1=0xFD;              //設置波特率為9600  22m為fa
  TL1=0xFD;              //設置波特率為9600
        TR1=1;
        SCON=0x50;
        TH0=(65536-250)/256; //2500=2.5ms
        TL0=(65536-250)%256;
        ET0=1;//打開定時器0的中斷
        TR0=1;//打開定時器0
        EA=1;//開總中斷
}

void Timer() interrupt 1//特別注意此處,0--外部中斷0,1--定時器中斷0,2--外部中斷1,3--定時器中斷1,4--串行口中斷1
{
        TR0=0;
        TH0=(65536-250)/256; //250=0.25ms
        TL0=(65536-250)%256;
  count1++;
        if(count1>=40)
        {
        count1=0;
        }
        if(count1<=PWM_count*2){SG_PWM=1;}
        else{SG_PWM=0;}
        if(count1<=PWM_count1*2){SG_PWM1=1;}
        else{SG_PWM1=0;}
        count++;
        if(count==setspeed){CLK=~CLK;count=0;cespeed++;}                                          //發送脈沖……
        
        if(RI==1)               //如果接收標志位為1,說明有數據接收完畢
        {                       
                        USARTbuf[0]=SBUF;      //將發送區數據保存
                        if(USARTbuf[0]=='r'&&flag1==0){ENA=1;delay(200);flag1=1;}
                        if(USARTbuf[0]=='r'&&flag1==2){ENA=1;delay(200);flag1=3;}
                        if(USARTbuf[0]=='B'){flag3=1;ENA=1;DIR=0;}  //ENA=1;DIR=0;delay(200);
                        if(USARTbuf[0]=='e'&&flag2==0){flag2=1;}
                        if(USARTbuf[0]==0x31&&flag2==1){setspeed=2;flag2=11;}
                        if(USARTbuf[0]==0x32&&flag2==1){setspeed=4;flag2=12;}
                        if(USARTbuf[0]==0x33&&flag2==1){setspeed=6;flag2=13;}
                        if(USARTbuf[0]==0x34&&flag2==1){setspeed=10;flag2=14;}
                        if(USARTbuf[0]==0x35&&flag2==1){setspeed=12;flag2=15;}
                        RI=0;               //清除接收標志位
        }
        TR0=1;
}

void main()
{
  CLK=0;
        ENA=0;                                   //ENA-接的控制口,但一樣的,如果ENA=0,步進電機卡起
        DIR=0;                                  //DIR-接的控制口。初始化電機        低電平有效,測試,DIR=1,是正轉, DIR=0反轉。
  Timer_Init();
        PWM_count=3;
        PWM_count1=3;
while(1)
{
                        
                        if(StopStart==0&&flag1==1)//A到B
            {
                                flag1=0;
                    delay(10);
                                if(StopStart==0)
              {        
                                        while(1)
                                        {
                                                if(setspeed==2)bujin(1,100);
                                                else if(setspeed==4)bujin(1,50);
                                                else if(setspeed==6)bujin(1,50);
                                                else if(setspeed==10)bujin(1,100);
                                                else if(setspeed==12)bujin(1,100);
                                                if(flag3==1)break;          //到達指定A點行程時間 1000步 b13000步
                                                ENA=0;                         //步進電機停止
                                                PWM_count1=1;delay(300);if(flag3==1)break;              //到達A點下降
                                                PWM_count=1;delay(300);if(flag3==1)break;             //到達A點抓取
                                                PWM_count1=3;               //舵機2抬起
                                                ENA=1;
                                                if(setspeed==2)bujin(1,1080);
                                                else if(setspeed==4)bujin(1,1150);
                                                else if(setspeed==6)bujin(1,1200);
                                                else if(setspeed==10)bujin(1,1150);
                                                else if(setspeed==12)bujin(1,1150);
                                                ENA=0; if(flag3==1)break;            //到達B點
                                                PWM_count1=1;delay(300);if(flag3==1)break;PWM_count=3;delay(300);if(flag3==1)break;        
                                                ENA=1; DIR=~DIR;   //回原點
                                                while(1){if(StopStart==0){ENA=0;TI=0;SBUF='B';while(!TI);TI=0;SBUF='a';while(!TI);TI=0;SBUF='c';while(!TI);TI=0;SBUF='k';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);break;}}
                                                break;       //結束行程
                                        }
                                }
                        }
                        if(StopStart==0&&flag3==1)//B到A
            {
                                flag3=0;
                    ENA=0;
                                PWM_count=3;
                                TI=0;SBUF='B';while(!TI);TI=0;SBUF='a';while(!TI);TI=0;SBUF='c';while(!TI);TI=0;SBUF='k';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='P';while(!TI);TI=0;SBUF=':';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);
                        }
                        if(flag2==11){flag2=0;TI=0;SBUF='S';while(!TI);TI=0;SBUF='e';while(!TI);TI=0;SBUF='t';while(!TI);TI=0;SBUF=' ';while(!TI);TI=0;SBUF='S';while(!TI);TI=0;SBUF='P';while(!TI);TI=0;SBUF='1';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);}
                        else if(flag2==12){flag2=0;TI=0;SBUF='S';while(!TI);TI=0;SBUF='e';while(!TI);TI=0;SBUF='t';while(!TI);TI=0;SBUF=' ';while(!TI);TI=0;SBUF='S';while(!TI);TI=0;SBUF='P';while(!TI);TI=0;SBUF='2';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);}
                        else if(flag2==13){flag2=0;TI=0;SBUF='S';while(!TI);TI=0;SBUF='e';while(!TI);TI=0;SBUF='t';while(!TI);TI=0;SBUF=' ';while(!TI);TI=0;SBUF='S';while(!TI);TI=0;SBUF='P';while(!TI);TI=0;SBUF='3';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);}
                        else if(flag2==14){flag2=0;TI=0;SBUF='S';while(!TI);TI=0;SBUF='e';while(!TI);TI=0;SBUF='t';while(!TI);TI=0;SBUF=' ';while(!TI);TI=0;SBUF='S';while(!TI);TI=0;SBUF='P';while(!TI);TI=0;SBUF='4';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);}
                        else if(flag2==15){flag2=0;TI=0;SBUF='S';while(!TI);TI=0;SBUF='e';while(!TI);TI=0;SBUF='t';while(!TI);TI=0;SBUF=' ';while(!TI);TI=0;SBUF='S';while(!TI);TI=0;SBUF='P';while(!TI);TI=0;SBUF='5';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);}
}
}
void delay(unsigned int n)                           //delay幾個毫秒,入口參數為幾個毫秒                                                                          //正反轉切換時速度太快了。延時保護電機
{
        unsigned int i,y;
        for(i=n;i>0;i--)
        {
                for(y=1140;y>0;y--){if(flag3==1)break;}
                if(flag3==1)break;
        }
}
void bujin(int fanxiang,int bushu)
{
  ENA=1;
        DIR=fanxiang;
        cespeed=0;
        while(1)
        {
                if(bushu==cespeed){break;}
                if(flag3==1)break;
        }
        ENA=0;
        if(flag3==1)ENA=1;
}



回復

使用道具 舉報

ID:889094 發表于 2021-4-28 20:55 | 顯示全部樓層
很有性格的程序,真想看看學習一下了,后面實在是看不下去了。
還困惑在于,用定時器0初值裝給定時器1,暈了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: www.色综合 | 日韩视频精品 | www.99热.com | 久久久久久综合 | 国产精品一区二区久久 | 最新国产精品 | 91在线观看免费 | 久久久99精品免费观看 | 日韩精品在线看 | 91精品国产综合久久久久久首页 | 国内精品久久精品 | 日本不卡一区 | 欧美视频一级 | 成人亚洲精品 | 国产欧美精品一区 | 日本不卡一区二区三区在线观看 | 久久9久 | 美女天堂| 福利片在线观看 | 国产欧美日韩一区二区三区 | 国产美女黄色片 | 亚洲传媒在线 | 亚洲一区二区三区免费在线观看 | 日本中出视频 | 亚洲成人国产综合 | 中文成人在线 | 伊人狠狠操 | 亚洲毛片| 国产精品久久久久久久久图文区 | 一区二区精品 | 成人欧美一区二区三区在线播放 | 精品欧美一区二区三区久久久 | 国产不卡一区 | 美日韩精品 | 国产一级精品毛片 | 精品真实国产乱文在线 | 精品欧美一区二区三区久久久 | 国产成人精品一区二区三区四区 | 午夜免费网 | 国产精品毛片无码 | 精品在线视频播放 |