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

標題: 51單片機有沒有辦法用一個定時器來完成對兩個步進電機的控制 [打印本頁]

作者: heheheaaa    時間: 2019-5-5 14:32
標題: 51單片機有沒有辦法用一個定時器來完成對兩個步進電機的控制
我是用51單片機來控制兩個步進電機的運動,同時還要用串口通訊發(fā)送數(shù)據(jù)給串口助手顯示,但是單片機的兩個定時器都被步進電機占用了,有什么解決辦法嗎。程序如下:
#include<reg52.h>
#include<stdio.h>
#include "PCF8591.H"
#define uchar unsigned char
#define uint  unsigned int
#define del   2 //速度調節(jié)
#define ydl   5 //移動量調節(jié)
#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;

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

       
        Delay_ms(200);
        UART_Init();
        SCON = 0x50;    //串口方式1,允許接收
        TMOD = 0x20;    //定時器1定時方式2
        TCON = 0x40;    //設定時器1開始計數(shù)
        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;                               
                        }
                }
        }
}


作者: 1255230    時間: 2019-5-5 23:29
能用兩個還是用兩個好,用一個的話可以設置兩個變量,在中斷里不斷遞加或不斷遞減到一個數(shù)值
作者: 斯拉單片機    時間: 2019-5-6 00:55
功能雙設、擴展定時、并聯(lián)分布?
作者: QZQ1973    時間: 2019-5-6 08:28
我想應該可以的,要多少路就設置多少路的變量 ,然后都放在定時器里面執(zhí)行.
作者: dsew027    時間: 2019-5-6 11:09
放幾個變量就可以了,看下OS里面的多定時器設計,一個硬件定時器可以延伸N個軟件定時器,當然用到回調函數(shù)的概念。
作者: PBL    時間: 2019-5-6 12:18
一個硬件定時代N多個軟定時,可代N多個步進。
作者: 1qdeuuu000    時間: 2019-5-6 16:52
在中斷函數(shù)里每個電機設兩個變量,一個控制是否轉,另一個控制正反轉。通過操作這4個變量來控制兩個電機。
作者: Sarmu    時間: 2019-5-8 17:54
可以的,關鍵要看以什么作為觸發(fā)源




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 偷偷操视频 | 国产精品亚洲一区 | 中文字幕在线观看精品 | 亚洲狠狠丁香婷婷综合久久久 | 国产成人jvid在线播放 | 国产精品一区一区三区 | 欧美精品久久久 | 亚洲视频三| 在线婷婷 | 国产黄色av网站 | 欧美jizzhd精品欧美巨大免费 | 欧美不卡视频 | 国产婷婷在线视频 | 97视频网站 | 高清黄色网址 | 久久久久久免费毛片精品 | h视频在线观看免费 | av中文字幕在线播放 | 成人欧美一区二区 | 日本特黄a级高清免费大片 成年人黄色小视频 | 中文字幕在线欧美 | 亚洲精品国产成人 | 欧美在线不卡 | 99久久亚洲| 99爱在线视频 | 精品视频国产 | 欧美日韩精品在线免费观看 | 国产在线精品一区二区三区 | 羞羞的视频在线观看 | 免费成人在线网站 | 久久福利电影 | 国产精品一区二区久久 | 91成人免费观看 | www国产成人免费观看视频,深夜成人网 | 97精品国产一区二区三区 | 午夜视频在线视频 | 国产精品久久久久久婷婷天堂 | 综合久久久 | 天天躁日日躁狠狠的躁天龙影院 | 欧美日韩国产不卡 | 风间由美一区二区三区在线观看 |