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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6449|回復: 21
收起左側

步進電機程序

  [復制鏈接]
ID:68659 發表于 2014-11-11 12:51 | 顯示全部樓層 |閱讀模式
                         #include <reg52.h>
/********IO引腳定義***********************************************************/
sbit SW1=P1^0;                        //四個獨立按鍵定義
sbit SW2=P1^1;
sbit SW3=P1^2;
sbit SW4=P1^3;       
sbit SMG1 = P1^4;                                        //數碼管第一位定義
sbit SMG2 = P1^5;                                        //數碼管第二位定義
sbit SMG3 = P1^6;                                        //數碼管第三位定義
sbit SMG4 = P1^7;                                        //數碼管第四位定義
int table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40};           //共陰極數碼管段值
unsigned char flag;                   //right(lhj[i+1],lhj[i+2]);        //正轉,兩個參數代表步進量和轉速
/********數據定義***********************************************************/
// 512個脈沖    90
unsigned char dataout[8]={0xf1,0xf2,0xf4,0xf8};
                //這里我們定義4組數,分別對應四拍:A-B-C-D  從板上設計來分配,選擇P2口的低四位輸出
                //P20A相,P21B相,P22C相,P23D相,將高四位都置1,也就是F
                //我們用索引的方式輸出,比如正轉,元素由03這樣的循環,反轉則由30的循環
                //程序中我們保存索引號,比如上次轉在第2元素停下,則下次的正轉由3開始向后計數,反轉則由1開始向前計數
                //這樣,電機的轉角度就會很精確
unsigned char datac=0;        //存放索引號(元素號)
unsigned int gStep = 0;
unsigned long gMainchong = 0;
unsigned int gJd = 0;
unsigned int gKey_flag = 0;
unsigned int b1,b2,b3;                                        //臨時變量
void delayms(xms);
void Timer0_Init();
void Display();
void rightAll();
void leftAll();
void stepAll();
void Ang();
void KeyScan();
/********函數聲明*************************************************************/
void right(unsigned int Speed,unsigned int road);        //正轉
void left(unsigned int Speed,unsigned int road);        //反轉
void mDelay(unsigned int DelayTime);                //延時函數
/***********主函數開始********************************************************/
void main()
{  
        unsigned char i=0;
        P2&=0XF0;                        //ULN2003A直接驅動,為高電平輸出,初始時為低電平,這里一定不能少了
   mDelay(100);
   Timer0_Init();
        while(1)
        {
                KeyScan();
                Ang();
        }
               
}
/******************************************************************************
* 名稱: Timer0_Init()
* 功能: 定時器0初始化
* 輸入: 無
* 輸出: 無
* 說明:
******************************************************************************/
void Timer0_Init()
{
        TMOD=0x01;                    //定時器方式一
        TH0=(65536-500)/256;                                //定義高字節
        TL0=(65536-500)%256;                          //定義低字節
        ET0=1;                                    //計數器中斷
        EA=1;                            //開總中斷
//        TR0 = 1;
}
/******************************************************************************
/******************************************************************************
* 名稱: Set_Display()
* 功能: 數碼管顯示函數
* 輸入: 無
* 輸出: 無
* 說明:
******************************************************************************/
void Display()
{                                                              //以下把num值區分開 以便數碼管顯示
        b1=gJd%1000/100;                         //百位
    b2=gJd%1000%100/10;                         //十位
        b3=gJd%1000%100%10;                         //個位
        P0=0x40;
    SMG1=0;                                                         //顯示"-"
    delayms(3);
    SMG1=1;
        P0=table[b1];
    SMG2=0;                                                         //顯示百位
    delayms(3);
    SMG2=1;
       
P0=table[b2];
        SMG3=0;                                                         //顯示十位
        delayms(3);
        SMG3=1;
        P0=table[b3];
    SMG4=0;
    delayms(3);                                                 //顯示個位
    SMG4=1;
}
/***********左轉,兩個參數代表步進量和轉速*************************************/
void right(unsigned int Speed,unsigned int road)
{
        //步進節拍:A-B-C-D
        do{               
                if(datac==3)                //索引號超出3回到0
                        datac=0;
                else
                        datac++;
                P2=dataout[datac];        //這里就在P2口輸出我們定義好的相序步進,P20A相,P21B相,P22C相,P23D
                                                        //這里我們不考慮P2的高四位,直接賦值
                mDelay(road);                //這里的延時就可控制轉速
                Speed--;
        }       
        while(Speed);
        P2&=0XF0;                //將四個腳復位0
}
/***********右轉,兩個參數代表步進量和轉速*************************************/
void rightAll()
{
        if(gStep == 3)
                gStep = 0;
        else
                gStep++;
        P2=dataout[gStep];
        if(gMainchong == 2048)
                gMainchong = 0;
        else
       
       
gMainchong++;
}
/***********整體左轉*************************************/
void leftAll()
{
        if(gStep == 0)
                gStep = 3;
        else
                gStep--;
        P2=dataout[gStep];
        if(gMainchong == 0)
//                gMainchong = 4096;
                gMainchong = 2048;
        else
                gMainchong--;
}
/***********固定動作*************************************/
void  stepAll()
{
        right(512, 50);
        left(1024, 50);
        right(215, 50);
}
/***********計算并顯示角度*************************************/
void Ang()          // 計算角度
{
        unsigned int i;
//        gJd = gMainchong*5.625/32.0;
        gJd = gMainchong*11.25/64.0;
       
        b1=gJd%1000/100;                          //將得到的數據拆分,以便數碼管顯示 百位
        b2=gJd%1000%100/10;                          //十位4
        b3=gJd%1000%100%10;                          //個位
    for(i=0;i<20;i++)  Display(); //顯示20遍,防止顯示數據抖動,變化太快               
}
/***********反轉,兩個參數代表步進量和轉速*************************************/
void left(unsigned int Speed,unsigned int road)
{
        //步進節拍A-D-C-B
        do{               
                if(datac==0)                //索引號超出0回到3
                        datac=3;
                else
                        datac--;
                P2=dataout[datac];        //這里就在P2口輸出我們定義好的相序步進,P20A相,P21B相,P22C相,P23D
                                                        //這里我們不考虛P2的低四位,直接賦值
                mDelay(road);                //這里的延時就可控制轉速
                Speed--;
        }       
        while(Speed);
        P2&=0XF0;                //將四個腳復位0
}
/***********延時函數*******************************************************/
void mDelay(unsigned int DelayTime)                         // 10ms
{   
        unsigned char j=0;
     while(DelayTime--)
         {
                 for(j=0;j<10;j++){}
         }
}
// 延時函數
void delayms(xms)
{
         
     unsigned int x,y;
         for(x=xms;x>0;x--)
                 for(y=110;y>0;y--)
                        ;
}
/***********按鍵掃描函數*************************************/
void KeyScan()
{
        if(SW1 == 0)
        {
                delayms(10);
                if(SW1 == 0)        // 正傳
                {
                        TR0 = 0;
                        gKey_flag = 1; //
                        Timer0_Init();
                        TR0 = 1;
                }       
        }
        if(SW2 == 0)
        {
                delayms(10);
                if(SW2 == 0)        // 反傳
                {
                        TR0 = 0;
                        gKey_flag = 2;
                        Timer0_Init();
                        TR0 = 1;
                }       
        }
        if(SW3 == 0)
        {
                delayms(10);
                if(SW3 == 0)        // 自定義動作
                {
                        TR0 = 0;
                        gKey_flag = 3;
                        Timer0_Init();
                        TR0 = 1;
                }       
        }
        if(SW4 == 0)
        {
                delayms(10);
                if(SW4 == 0)        // 停止
                {
                        TR0 = 0;
                        gKey_flag = 0;
                        Timer0_Init();
                        TR0 = 1;
                }       
        }
}
/******************************************************************************
* 名稱:  T0_int() interrupt 1
* 功能:  定時器0 中斷函數
* 輸入:  無
* 輸出:  無
* 說明:
******************************************************************************/
void T0_int() interrupt 1
{       
//        flag=1;                           //標志位之一          
        TR0 = 0;
        switch(gKey_flag)
        {
                case 0x00:
                                P2&=0XF0;
                                break;
                case 0x01:
                                rightAll();
                                TH0=(65536-10000)/256;                                //定義高字節
                                TL0=(65536-10000)%256;                          //定義低字節
                               
              TR0 = 1;
                                break;
                case 0x02:
                                leftAll();
                               
TH0=(65536-10000)/256;                                //定義高字節
                                TL0=(65536-10000)%256;                          //定義低字節
                                TR0 = 1;
                                break;
                case 0x03:
                                stepAll();
                                break;
                default:
                        break;
        }
}

回復

使用道具 舉報

ID:51088 發表于 2014-11-11 13:13 來自手機 | 顯示全部樓層
51單片機按鈕,控制,步進電機,,有電路圖共享嗎
回復

使用道具 舉報

ID:67573 發表于 2014-11-15 13:58 | 顯示全部樓層
有電路圖共享
回復

使用道具 舉報

ID:66729 發表于 2014-12-12 21:10 | 顯示全部樓層

電路圖發上來看一看吧
回復

使用道具 舉報

ID:68659 發表于 2014-12-24 21:23 | 顯示全部樓層
回復

使用道具 舉報

ID:68659 發表于 2014-12-24 21:26 | 顯示全部樓層
nojiya88 發表于 2014-12-12 21:10
電路圖發上來看一看吧

電路圖
QQ截圖20141224212140.png
回復

使用道具 舉報

ID:67573 發表于 2014-12-25 14:00 | 顯示全部樓層
51單片機按鈕,控制,步進電機,,有電路圖共享嗎
回復

使用道具 舉報

ID:70769 發表于 2014-12-26 02:34 | 顯示全部樓層
GOOD!!!
回復

使用道具 舉報

ID:71359 發表于 2014-12-30 12:37 | 顯示全部樓層
謝謝樓主分享
回復

使用道具 舉報

ID:56948 發表于 2015-5-8 14:26 | 顯示全部樓層

謝謝樓主分享
回復

使用道具 舉報

ID:95360 發表于 2015-11-11 04:01 | 顯示全部樓層
收藏學習,謝謝樓主。
回復

使用道具 舉報

ID:46091 發表于 2015-11-21 18:39 | 顯示全部樓層
能不能設成按一下起動步進半圈松開停止啊
回復

使用道具 舉報

ID:16003 發表于 2015-11-23 00:51 來自手機 | 顯示全部樓層
謝謝樓主分享,認真學習學習。
回復

使用道具 舉報

ID:102611 發表于 2016-1-10 12:21 | 顯示全部樓層
謝謝   很好的資料
回復

使用道具 舉報

ID:104183 發表于 2016-6-17 18:49 | 顯示全部樓層
數碼管連接的電路可否共享呢
回復

使用道具 舉報

ID:119261 發表于 2016-7-18 15:40 | 顯示全部樓層
怎么平穩轉動
回復

使用道具 舉報

ID:134543 發表于 2016-7-29 20:14 | 顯示全部樓層
樓主好人啊
回復

使用道具 舉報

ID:185661 發表于 2017-5-17 22:09 | 顯示全部樓層
很好的資料
回復

使用道具 舉報

ID:192534 發表于 2017-5-18 08:38 | 顯示全部樓層
謝謝樓主分享,認真學習學習。
回復

使用道具 舉報

ID:217754 發表于 2017-7-22 22:55 | 顯示全部樓層
謝謝分享。明天試一下。。感覺學一樣東西好難呀。
回復

使用道具 舉報

ID:224536 發表于 2017-8-5 11:57 | 顯示全部樓層
求步進電機的點動控制程序,,現在才只能控制正反轉
回復

使用道具 舉報

ID:224939 發表于 2017-8-5 12:27 | 顯示全部樓層
新手,學習了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天操伊人 | 久久久久久久综合 | 日韩欧美福利视频 | 国产一区二区三区精品久久久 | 99视频入口 | 91精品久久久久久综合五月天 | 亚洲精品久久久久久国产精华液 | 99国产精品99久久久久久粉嫩 | аⅴ资源新版在线天堂 | 久久久免费电影 | 国产999精品久久久久久绿帽 | 国产精品久久久久久久久久久久冷 | 女同videos另类 | 美女在线观看国产 | 久久亚洲精品国产精品紫薇 | 一区二区在线看 | 欧美日韩专区 | 欧美国产一区二区 | 日韩在线观看一区二区三区 | 精品一区二区三区91 | 国产999精品久久久久久 | 国产精品国产三级国产aⅴ中文 | 欧美不卡一区二区 | 午夜精品久久久 | 啪啪毛片 | 日韩在线免费 | 欧美三级在线 | 亚洲国产片| 不卡在线视频 | 亚洲精品久久久久中文字幕欢迎你 | 国产91av视频在线观看 | 国产成人jvid在线播放 | 自拍 亚洲 欧美 老师 丝袜 | 一级毛片黄片 | 亚洲人人 | 日本aa毛片a级毛片免费观看 | 在线观看国产网站 | 九九久久久 | 亚洲国产成人久久综合一区,久久久国产99 | 99tv| 日本视频中文字幕 |