weixin_43372515 2019-12-13 20:20 采纳率: 100%
浏览 368

单片机控制电机的转向问题

51单片机怎么保证二项电机的转动方向?
我的想法是先按一次正向按钮电机开始正向转动,到一定距离时停止一段时间,再按反向按钮让电机反向转动。
但是现在每次按按钮,电机的转动方向都会不同而且是随机的,这是为什么?

#include<reg51.h> 
#define MotorTabNum 5
unsigned char T0_NUM;
sbit K1 = P3^1;        // 正向
sbit K2 = P3^0;          //反向
sbit K3 = P3^2;           //停止
sbit FX      = P2^4;     // 方向

sbit CLK     = P2^6;     // 脉冲

int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};           

unsigned char g_MotorSt = 0;     
unsigned char g_MotorDir = 0;   
unsigned char MotorTab[7] = {12, 10, 8, 6, 4, 2,1};

signed char g_MotorNum = 0;

void delayms(xms);
void mDelay(unsigned int DelayTime);                
void T0_Init();               

void KeyScan(void);



void main(void)
{
        T0_Init();            

        FX = 0;
        while(1)
        {
                KeyScan();            
        }


}

void T0_Init()
{
        TMOD = 0x01;
        TH0 = (65535-1)/256;  
        TL0 = (65535-1)%256;
        EA = 1;
        ET0 = 1;


}

void T0_time() interrupt 1
{
//        TR0 = 0;
        TH0 = (65535-1)/256;   
        TL0 = (65535-1)%256;


         T0_NUM++ ;

         if(T0_NUM >= MotorTab[g_MotorNum])        
        {
                T0_NUM = 0;
                CLK=CLK^0x01;                  
        }


}         



void KeyScan(void)
{



        if(K1 == 0)   
        {               
                delayms(10);  
                if(K1 == 0)
                {             
                        g_MotorSt = g_MotorSt ^ 0x01;
                        TR0 = 1; 
                        FX =0; 
                        g_MotorNum = 7;
                }
        }
         if(K2 == 0)   
        {               
                delayms(10);  
                if(K2 == 0)
                {             
                        g_MotorDir = g_MotorDir ^ 0x01;
                        TR0 = 1; 
                        FX = 1; 
                        g_MotorNum = 7;
                }
        }
        if(K3==0)       
        {
                delayms(10);   
                if(K3==0)
                { 

                          TR0 = 0; 

                }
        }
}

void delayms(xms)
{
         unsigned int x,y;
         for(x=xms;x>0;x--)
                 for(y=110;y>0;y--);
}


  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥15 安卓adb backup备份应用数据失败
    • ¥15 eclipse运行项目时遇到的问题
    • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
    • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
    • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
    • ¥50 成都蓉城足球俱乐部小程序抢票
    • ¥15 yolov7训练自己的数据集
    • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
    • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
    • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)