找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 923|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)驅(qū)動(dòng)a4988和tb6600,加按鍵單機(jī)沒反映

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1042077 發(fā)表于 2024-1-27 21:37 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
大佬們,我兩個(gè)驅(qū)動(dòng)分別驅(qū)動(dòng),電機(jī)都能正常轉(zhuǎn)動(dòng),加上按鍵卻沒響應(yīng)

單片機(jī)源程序如下:
#include <reg51.h>
#include <intrins.h>  //微秒(_nop_)頭文件
#define uint  unsigned int
#define uchar unsigned char

sbit dir=P1^0;
sbit pul=P1^1;
sbit ena=P1^5;

sbit dir1=P1^2;
sbit step1=P1^3;

sbit key1 = P0^0;
sbit key2 = P0^1;
sbit key3 = P0^2;
sbit key4 = P0^3;

uint x,y;        
uchar flag = 0;

/*******************************************************************/
/***********             延時(shí)函數(shù)                     **************/
/*******************************************************************/
void Delay1000us()                //@11.0592MHz
{
        unsigned char i, j;

        _nop_();
        i = 2;
        j = 199;
        do
        {
                while (--j);
        } while (--i);
}
void Delay_xms(uint x)
{
uint i,j;
for(i=0;i<x;i++)
  for(j=0;j<112;j++);
}

void delay(uint x)
{
uint i,j;
for(i=0;i<x;i++)
  for(j=0;j<112;j++);
}
/*******************************************************************/
/***********                運(yùn)動(dòng)函數(shù)                    *************/
/*******************************************************************/
void up_1()
{
                  ena = 1;
                                                dir=1;       //dir為1時(shí)正轉(zhuǎn),dir為0時(shí)反轉(zhuǎn)
                                                 for( x = 0; x <=133; x++)
                  {        //一圈200個(gè)脈沖      兩個(gè)pul為一個(gè)脈沖    16個(gè)脈沖就是28.8°距離30°是1.2°,如果改成17個(gè)脈沖就是30.6°
                                                         pul=1;
                                                         Delay1000us();                 //修改微秒值可以調(diào)速
                                                         pul=0;
                                                         Delay1000us();              
                                                }

}
void do_1()
{
                                                  ena = 1;
              dir=0;       //dir為1時(shí)正轉(zhuǎn),dir為0時(shí)反轉(zhuǎn)
                                                 for( x = 0; x <=133; x++)
                  {        //一圈200個(gè)脈沖      兩個(gè)pul為一個(gè)脈沖    16個(gè)脈沖就是28.8°距離30°是1.2°,如果改成17個(gè)脈沖就是30.6°
                                                         pul=1;
                                                         Delay1000us();                 //修改微秒值可以調(diào)速
                                                         pul=0;
                                                         Delay1000us();              
                                                }

}

void up_2()
{
                            dir1=1;//電機(jī)正轉(zhuǎn)
                                                 for( x = 0; x <=100; x++) {     //一個(gè)圈200個(gè)脈沖
                                                         step1=1;
                                                         Delay1000us();
                                                         step1=0;
                                                         Delay1000us();
                                                }
}
void do_2()
{
                                                        dir1=0;//電機(jī)反轉(zhuǎn)
                                                        for( x = 0; x <=100; x++) {     
                                                         step1=1;
                                                         Delay1000us();//時(shí)間長(zhǎng)短會(huì)影響電機(jī)運(yùn)動(dòng)
                                                         step1=0;
                                                         Delay1000us();
                                                }
}
/*******************************************************************/
/***********              中斷函數(shù)                     *************/
/*******************************************************************/
void keyscan()
{
        
//按鍵一
                if(P0^0==0)                        //如果K1按鍵按下
                {
                        delay(20);                //延時(shí)消抖
                        while(P0^0==1);        //松手檢測(cè)
                        delay(20);                //延時(shí)消抖
      flag = 1;
                }               
//按鍵二        
                else if(P0^1==0)                        //如果K1按鍵按下
                {
                        delay(20);                //延時(shí)消抖
                        while(P0^1==1);        //松手檢測(cè)
                        delay(20);                //延時(shí)消抖
      flag = 2;
                }
//按鍵三
                else if(P0^2==0)                        //如果K1按鍵按下
                {
                        delay(20);                //延時(shí)消抖
                        while(P0^2==1);        //松手檢測(cè)
                        delay(20);                //延時(shí)消抖                        
      flag = 3;                                
                }
                else
                        flag =0;
        
}
void time0_init() //定時(shí)器T0初始化
{
        TMOD=0x01;          //設(shè)置定時(shí)器0工作方式1
        TH0=(65536-50000)/256;//定時(shí)50ms取高八位
        TL0=(65536-50000)%256; //取低八位
        ET0=1; //開定時(shí)器0中斷使能
        EA=1;  //開總中斷使能
        TR0=1; //開啟中斷
}

void time0() interrupt 1 //定時(shí)器T0入口函數(shù)
{
        TH0=(65536-50000)/256; //定時(shí)50ms重新賦初值
        TL0=(65536-50000)%256;
        keyscan();
}
/*******************************************************************/
/***********                主函數(shù)                     *************/
/*******************************************************************/
void main()
{
        time0_init();
                while(1){        
                if(flag != 0)
                {
                        
      if(flag == 1)
                        {
                                up_1();
                                         delay(1000);               
        do_1();               
                                         delay(1000);               
                                
                        }
      else if(flag == 2)
                        {
                                up_2();
                                         delay(1000);               
        do_2();               
                                         delay(1000);               
                        }
      else if(flag == 3)
                        {do_2();                                       
                                         delay(1000);               
        up_2();
        
                                         delay(1000);               
                        }
                }
        }        
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表