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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機有沒有辦法用一個定時器來完成對兩個步進電機的控制

[復制鏈接]
回帖獎勵 60 黑幣 回復本帖可獲得 20 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
ID:368637 發表于 2019-5-5 14:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我是用51單片機來控制兩個步進電機的運動,同時還要用串口通訊發送數據給串口助手顯示,但是單片機的兩個定時器都被步進電機占用了,有什么解決辦法嗎。程序如下:
#include<reg52.h>
#include<stdio.h>
#include "PCF8591.H"
#define uchar unsigned char
#define uint  unsigned int
#define del   2 //速度調節
#define ydl   5 //移動量調節
#define  PCF8591 0x90    //PCF8591 地址

uint   s=0,x=0;   //s表示上,x表示下
uint   z=0,y=0;    //
uint   sx=0,zy=0;

sbit ENTER = P3^3;
sbit UP = P3^4;
sbit DOWN = P3^5;
sbit LEFT = P3^6;
sbit RIGHT = P3^7;
sbit LED1 = P1^2;
sbit LED2 = P1^3;
uchar Motor_Up[4]={0x08,0x04,0x02,0x01};
uchar Motor_Down[4]={0x01,0x02,0x04,0x08};

uchar Motor_Left[4]={0x10,0x20,0x40,0x80};
uchar Motor_Right[4]={0x80,0x40,0x20,0x10};

unsigned char AD_CHANNEL;

uchar AD_Up,AD_Down,AD_Left,AD_Right;
uchar i,j,k;
uchar Table[4];
uint alt,alt1;

//延時函數
void Delay_ms(uint jj)
{
        uint ii;
        while(jj--)
                for(ii=0;ii<125;ii++);
}
void delay(unsigned int time)
{
  unsigned int o,p;
        for(o=0;o<1000;o++)
        for(p=0;p<time;p++);
}
void UART_Init(void)
{
     TMOD = 0x11;   //定時器模式選擇               
     TH0 = (65535-50000)%256;   
     TL0 = (65535-50000)/256;
        ET0=1;         //使能定時器0
        TR0 = 1;                //啟動定時器1
       
        TH1 = (65535-50000)%256;   
  TL1 = (65535-50000)/256;
        ET1=1;         //使能定時器0
        TR1 = 1;                //啟動定時器1       
   EA=1;         //開啟總中斷

}
/********************************************************************
* 名稱   : PSend_Hex()
* 功能   : 發送字符串函數,可控制發送長度
* 變量   : 無
* 返回值 : 無
********************************************************************/
void Send_Hex(unsigned char *p,unsigned char num)
{
           while(num--)   //剩余發送的字符數
        {
        SBUF = *p; //將要發送的數據賦給串口緩沖寄存器
                while(!TI);//等待發送結束
                TI = 0;    //軟件清零
                p++;       //指針加一
        }       
}
void main()           //函數功能:主函數
{          

       
        Delay_ms(200);
        UART_Init();
        SCON = 0x50;    //串口方式1,允許接收
        TMOD = 0x20;    //定時器1定時方式2
        TCON = 0x40;    //設定時器1開始計數
        TH1 = 0XFD;     //11.0592MHz 9600波特率
        TI = 1;
        TR1 = 1;        //啟動定時器       
        while(1)
        {
               
                if(!ENTER)
                {
                        Delay_ms(20);
                        while(!ENTER);
                        k++;       
                }
               
                if(k%2 == 0)
                {
                LED1 = 1;
                LED2 = 0;
                for(i=0;i<8;i++)
                {
                        switch(AD_CHANNEL)
                        {
                                case 0: PCF8591_ISendByte(PCF8591,0x41);
                                AD_Up=PCF8591_IRcvByte(PCF8591)*2;  //模擬輸入口1A/D轉換
                                break;  
                               
                                case 1: PCF8591_ISendByte(PCF8591,0x42);
                                AD_Down=PCF8591_IRcvByte(PCF8591)*2;  //模擬輸入口2A/D轉換
                                break;  
                                case 2: PCF8591_ISendByte(PCF8591,0x43);
                                AD_Left=PCF8591_IRcvByte(PCF8591)*2;  //模擬輸入口3A/D轉換
                                break;  
                               
                                case 3: PCF8591_ISendByte(PCF8591,0x40);
                                AD_Right=PCF8591_IRcvByte(PCF8591)*2;  //模擬輸入口4A/D轉換
                                break;
                        }

                        Send_Hex(Table,4);
                        if(++AD_CHANNEL>3)
                        {
                         AD_CHANNEL=0;
                         Table[0] = AD_Up;
                        Table[1] = AD_Down;
                        Table[2] = AD_Left;
                        Table[3] = AD_Right;
                         }
                }
                }
               
                if(k%2 == 1)
                {
                        LED1 = 0;
                        LED2 = 1;
                        AD_Up = 0;        //上
                        AD_Down = 0;//下
                        AD_Left = 0;//左
                        AD_Right = 0;//右       
                }       
                zy=y-z;
                zy=zy*5.625;
                sx=x-s;
                sx=sx*5.625;
                printf("fangxiang:%d\n",zy);
                printf("fujjiao:%d\n",sx);
                delay(100);
               
            
        ///////////////////////////
          
               
               
                ////////////////////////////////////
                //Delay_ms(100);//延時,可適當修改
        }
}
void timer0() interrupt 1
{
        TH0 = (65535-50000)%256;   
  TL0 = (65535-50000)/256;
        alt++;
        if(alt==3)
        {
                alt=0;
                if(((AD_Up<AD_Down)&&(AD_Down-AD_Up>10))||(!UP))//上轉
                {
                        for(i=0;i<ydl;i++)
                        {
                                for(j=0;j<4;j++)
                                {
                                        P2=Motor_Up[j];
                                        Delay_ms(del);
                                }       
       s=s+1;                                       
                        }       
                }
                //////////////////////////////////////
                if(((AD_Up>AD_Down)&&(AD_Up-AD_Down>10))||(!DOWN))//下轉
                {
                        for(i=0;i<ydl;i++)
                        {
                                for(j=0;j<4;j++)
                                {
                                        P2=Motor_Down[j];
                                        Delay_ms(del);
                                }               
                                x=x+1;
                        }
                }
        }
}

void timer1() interrupt 3
{
        TH1 = (65535-50000)%256;   
  TL1 = (65535-50000)/256;
        alt1++;
        if(alt1==3)
        {
                alt1=0;
                /////////////////////////////
                if(((AD_Left<AD_Right)&&(AD_Right-AD_Left>10))||(!LEFT))//左轉
                {
                        for(i=0;i<ydl;i++)
                        {
                                for(j=0;j<4;j++)
                                {
                                        P2=Motor_Left[j];
                                        Delay_ms(del);
                                }       
                                z=z+1;                               
                        }
               
                }
                //////////////////////////////////////
                if(((AD_Left>AD_Right)&&(AD_Left-AD_Right>10))||(!RIGHT))//右轉
                {
                        for(i=0;i<ydl;i++)
                        {
                                for(j=0;j<4;j++)
                                {
                                        P2=Motor_Right[j];
                                        Delay_ms(del);
                                }       
                                y=y+1;                               
                        }
                }
        }
}

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

使用道具 舉報

沙發
ID:525068 發表于 2019-5-5 23:29 | 只看該作者
能用兩個還是用兩個好,用一個的話可以設置兩個變量,在中斷里不斷遞加或不斷遞減到一個數值
回復

使用道具 舉報

板凳
ID:528003 發表于 2019-5-6 00:55 | 只看該作者
功能雙設、擴展定時、并聯分布?
回復

使用道具 舉報

地板
ID:512205 發表于 2019-5-6 08:28 | 只看該作者
我想應該可以的,要多少路就設置多少路的變量 ,然后都放在定時器里面執行.
回復

使用道具 舉報

5#
ID:528313 發表于 2019-5-6 11:09 | 只看該作者
放幾個變量就可以了,看下OS里面的多定時器設計,一個硬件定時器可以延伸N個軟件定時器,當然用到回調函數的概念。
回復

使用道具 舉報

6#
ID:345562 發表于 2019-5-6 12:18 | 只看該作者
一個硬件定時代N多個軟定時,可代N多個步進。
回復

使用道具 舉報

7#
ID:528677 發表于 2019-5-6 16:52 | 只看該作者
在中斷函數里每個電機設兩個變量,一個控制是否轉,另一個控制正反轉。通過操作這4個變量來控制兩個電機。
回復

使用道具 舉報

8#
ID:303841 發表于 2019-5-8 17:54 | 只看該作者
可以的,關鍵要看以什么作為觸發源
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品二区 | 男女深夜网站 | 中文字幕黄色大片 | 国产日韩欧美中文 | 日韩成人在线电影 | 日韩精品1区2区 | 99re| 久久成人精品视频 | 一区二区三区电影在线观看 | 国产日韩欧美中文 | 日韩国产精品一区二区三区 | 少妇一区在线观看 | 韩日一区二区三区 | 国产jizz女人多喷水99 | 中文字幕精品一区 | 九九九久久国产免费 | 日韩精品视频在线观看一区二区三区 | 久久久久亚洲 | 久久成人国产 | 午夜黄色 | 国产一区不卡在线观看 | 欧美激情久久久 | 午夜看电影在线观看 | 91在线视频网址 | 不卡一二区 | 亚洲国产aⅴ精品 | 香蕉久久久 | 成人免费在线视频 | 91影片| 久久久久久久久久久久久久av | 国产乱码久久久久久一区二区 | 国产一级特黄真人毛片 | 黄网免费 | 九九热这里只有精品6 | 巨大荫蒂视频欧美另类大 | 亚洲成人在线免费 | 欧美激情综合五月色丁香小说 | 精品视频在线观看 | 久久爱综合 | 亚洲www啪成人一区二区 | 一区二区三区国产在线观看 |