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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6681|回復: 21
打印 上一主題 下一主題
收起左側

步進電機程序

  [復制鏈接]
跳轉到指定樓層
樓主
                         #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;
        }
}

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

使用道具 舉報

沙發
ID:51088 發表于 2014-11-11 13:13 來自觸屏版 | 只看該作者
51單片機按鈕,控制,步進電機,,有電路圖共享嗎
回復

使用道具 舉報

板凳
ID:67573 發表于 2014-11-15 13:58 | 只看該作者
有電路圖共享
回復

使用道具 舉報

地板
ID:66729 發表于 2014-12-12 21:10 | 只看該作者

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

使用道具 舉報

5#
ID:68659 發表于 2014-12-24 21:23 | 只看該作者
回復

使用道具 舉報

6#
ID:68659 發表于 2014-12-24 21:26 | 只看該作者
nojiya88 發表于 2014-12-12 21:10
電路圖發上來看一看吧

電路圖

QQ截圖20141224212140.png (13.97 KB, 下載次數: 195)

QQ截圖20141224212140.png
回復

使用道具 舉報

7#
ID:67573 發表于 2014-12-25 14:00 | 只看該作者
51單片機按鈕,控制,步進電機,,有電路圖共享嗎
回復

使用道具 舉報

8#
ID:70769 發表于 2014-12-26 02:34 | 只看該作者
GOOD!!!
回復

使用道具 舉報

9#
ID:71359 發表于 2014-12-30 12:37 | 只看該作者
謝謝樓主分享
回復

使用道具 舉報

10#
ID:56948 發表于 2015-5-8 14:26 | 只看該作者

謝謝樓主分享
回復

使用道具 舉報

11#
ID:95360 發表于 2015-11-11 04:01 | 只看該作者
收藏學習,謝謝樓主。
回復

使用道具 舉報

12#
ID:46091 發表于 2015-11-21 18:39 | 只看該作者
能不能設成按一下起動步進半圈松開停止啊
回復

使用道具 舉報

13#
ID:16003 發表于 2015-11-23 00:51 來自觸屏版 | 只看該作者
謝謝樓主分享,認真學習學習。
回復

使用道具 舉報

14#
ID:102611 發表于 2016-1-10 12:21 | 只看該作者
謝謝   很好的資料
回復

使用道具 舉報

15#
ID:104183 發表于 2016-6-17 18:49 | 只看該作者
數碼管連接的電路可否共享呢
回復

使用道具 舉報

16#
ID:119261 發表于 2016-7-18 15:40 | 只看該作者
怎么平穩轉動
回復

使用道具 舉報

17#
ID:134543 發表于 2016-7-29 20:14 | 只看該作者
樓主好人啊
回復

使用道具 舉報

18#
ID:185661 發表于 2017-5-17 22:09 | 只看該作者
很好的資料
回復

使用道具 舉報

19#
ID:192534 發表于 2017-5-18 08:38 | 只看該作者
謝謝樓主分享,認真學習學習。
回復

使用道具 舉報

20#
ID:217754 發表于 2017-7-22 22:55 | 只看該作者
謝謝分享。明天試一下。。感覺學一樣東西好難呀。
回復

使用道具 舉報

21#
ID:224536 發表于 2017-8-5 11:57 | 只看該作者
求步進電機的點動控制程序,,現在才只能控制正反轉
回復

使用道具 舉報

22#
ID:224939 發表于 2017-8-5 12:27 | 只看該作者
新手,學習了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 婷婷在线视频 | 黑人精品欧美一区二区蜜桃 | 青青久久久 | 操久久 | 高清免费av| 精品一区二区三区在线播放 | 美国十次成人欧美色导视频 | 久久久久久一区 | 国产片淫级awww | av在线一区二区三区 | 殴美成人在线视频 | 99爱免费| 亚洲伊人精品酒店 | 久久久久久久久99精品 | aaaa一级毛片 | 国产成人精品一区二区 | 欧美一区二区在线观看 | 国产精品二区三区 | 天天干天天草 | 国产精品久久久久国产a级 欧美日韩国产免费 | 久久精品在线免费视频 | 国产成人网 | 亚洲午夜精品久久久久久app | 人操人人 | 日本三级黄视频 | 国产伦精品一区二区三区精品视频 | 欧美久久免费观看 | 狠狠操狠狠干 | 一区精品在线观看 | 午夜影院在线观看 | 亚洲一区二区在线视频 | 国产伦精品一区二区三区高清 | 国产一级精品毛片 | 成人精品一区二区三区中文字幕 | 在线a视频 | 午夜合集| 日本午夜免费福利视频 | 久久久久网站 | 亚洲久视频 | 91毛片在线观看 | 国产激情三区 |