微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新手求助 是关于单片机控制步进电机的

新手求助 是关于单片机控制步进电机的

时间:10-02 整理:3721RD 点击:
下面是原来的代码 想让电机先以一定速度正转两圈再过几秒钟再以另外一个速度逆转三圈 各个大神帮忙写下代码   小弟感激不尽!
#include<reg52.h>
#include "lcd1602.h"
#include "eeprom.h"
unsigned char T0_NUM;
unsigned char END_FLAG = 0;
sbit SW1=P3^0;                        //四个独立按键定义
sbit SW2=P3^1;
sbit SW3=P3^2;
sbit SW4=P3^3;       

sbit MotorEn = P2^1;     // 使能
sbit FX = P2^0;          // 方向
sbit CLK = P2^2;         // 脉冲

unsigned char g_MotorSt = 0;     // 启停
unsigned char g_MotorDir = 0;    // 正反
unsigned int CLK_OUT_NUM = 0;         // 脉冲计数
signed int MotorSpedNum = 0;      // 速度档
unsigned int CUR_MotorSpedQuan = 0;   // 当前圈数
unsigned int SET_MotorSpedQuan = 0;   // 设定圈数

unsigned char cMode = 0;
unsigned char s1_num;
unsigned int iSetData;
signed char RL = 0;         // 方向
signed char iSet[3];
unsigned int SYS_NUM = 0;
unsigned char MotorTab[10] = {63, 42, 27, 18, 12, 8, 5, 3, 2};
unsigned int MotorSpedTab[6] = {400, 800, 1600, 3200, 6400, 12800};

signed char g_MotorNum = 0;
//--------------
void delayms(xms);
void mDelay(unsigned int DelayTime);                //延时函数
void EEPROM_Init();
void T0_Init();
void LCD_Init();
void KeyScan(void);
void KeyProcess();
void SecondPro();
//void Display(void);

// 主程序  main()
void main(void)
{
        EEPROM_Init();    // 读取数据
        T0_Init();             // 定时器0 初始化
        LCD_Init();      // 显示初始化
        MotorEn = 0;     // L297 使能(只有智能,才能正常工作,否则停止)
        while(1)
        {
                if (!g_MotorSt)           // 只有在空闲状态按键操作才有效;否则不能打断电机工作
                {
                        KeyScan();              // 按键
                        KeyProcess();
                        if (SYS_NUM >= 100)          // 10ms
                        {
                                SYS_NUM = 0;
                                write_com(0x80+0x40+8);
                                write_sfm(2,7,CUR_MotorSpedQuan);
                        }         
                }
                if (SYS_NUM >= 100)          // 10ms
                {
                        SYS_NUM = 0;
                        write_com(0x80+0x40+8);
                        write_sfm(2,7,CUR_MotorSpedQuan);
                }
        }
}
/************存储初始化*****************/
void EEPROM_Init()
{
                iSet[0]=byte_read(0x2000);//程序开始时读取EEPROM中数据
                iSet[1]=byte_read(0x2200);
                iSet[2]=byte_read(0x2400);
                if((iSet[0] > 9) || (iSet[0] < 0))                        //防止首次上电时读取出错
                        iSet[0] = 0;
                if((iSet[1] > 9) || (iSet[1] < 0))
                        iSet[1] = 0;
                if((iSet[2] > 9) || (iSet[2] < 0))
                        iSet[2] = 0;
                iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
                MotorSpedNum=byte_read(0x2600);
                if((MotorSpedNum > 9) || (MotorSpedNum < 0))
                        MotorSpedNum = 0;
                RL = byte_read(0x2800);
                if((RL > 2) || (RL < 0))
                        RL = 0;
}
/********定时器初始化***********************************************************/
void T0_Init()
{
        TMOD = 0x01;
        TH0 = (65535-100)/256;  // 1ms
        TL0 = (65535-100)%256;
        EA = 1;
        ET0 = 1;
//        TR0 = 1;
}

// 液晶显示初始化
void LCD_Init()
{
        init_1602();                             //lcd1602初始化
        write_string(1, 2, "set:");
        write_sfm(1,7,iSetData);
        write_string(2, 2, "cur:");
        write_sfm(2,7,0);
//        mDelay(1);
        write_string(1, 13, "S:");
        write_one_data(1, 15, MotorSpedNum);
        if(RL == 0)
        {
                FX = 0;
                write_string(2, 13, "R");
        }
        else
        {
                FX = 1;
                write_string(2, 13, "L");
        }           
}
/********定时器中断*****************/
void T0_time() interrupt 1
{
//        TR0 = 0;
        TH0 = (65535-100)/256;   
        TL0 = (65535-100)%256;
        T0_NUM++;
        SYS_NUM++;
        if(T0_NUM >= MotorTab[MotorSpedNum])        // 增加按键g_MotorNum++   减小按键g_MotorNum--
        {
                T0_NUM = 0;
                CLK=CLK^0x01;               //   输出脉冲
                CLK_OUT_NUM++;
                if(CLK_OUT_NUM >= MotorSpedTab[1])        // 一圈
                {
                        CLK_OUT_NUM = 0;
                        CUR_MotorSpedQuan++;
                        if(CUR_MotorSpedQuan >= iSetData)          // 达到设定圈数
                        {
                                TR0 = 0;
                                cMode = 0;
                                g_MotorSt = 0;
                                MotorEn = 1;   
                                write_com(0x80+0x40+8);
                                write_sfm(2,7,CUR_MotorSpedQuan);
                                END_FLAG = 1;
                        //        SecondPro();
                        }
                }
        }
//        TR0 = 1;
}         

/********按键扫描函数***********************************************************/
void KeyScan()
{
        if(SW1 == 0)
        {
                delayms(10);
                if(SW1 == 0)   // 功能键
                {
                        while(!SW1);   // 等待松开
                        cMode = 1;     // 功能模式       
               
                }
       
        }
        if(SW2 == 0)
        {
                delayms(10);
                if(SW2 == 0)   // 增加
                {
                        while(!SW2);   // 等待松开
                    cMode = 2;
                }
       
        }
        if(SW3 == 0)
        {
                delayms(10);
                if(SW3 == 0)   // 减小
                {
                        while(!SW3);   // 等待松开
                        cMode = 3;
                }
       
        }
        if(SW4 == 0)
        {
                delayms(10);
                if(SW4 == 0)   // 启停
                {
                        while(!SW4);   // 等待松开
                        cMode = 4;
                       
                        g_MotorSt = 1;
                        MotorEn = 1;
                        CUR_MotorSpedQuan = 0;
                        TR0 = 1;
                          
                }
       
        }

}

/********按键处理函数***********************************************************/
void KeyProcess()
{
        switch(cMode)
        {
                case 0: // 无模式
                        break;
                case 1:         // 功能模式
                        {
                                s1_num++;       
                                cMode = 0;        // 功能模式
                                if(s1_num ==1)          // 第1次被按下
                                {
                                        write_com(0x80+7);          // 角度 百位
                                        write_com(0x0f);      // 光标闪烁
                                }
                                if(s1_num ==2)
                                {
                                        write_com(0x80+8);
                                }
                                if(s1_num == 3)
                                {
                                        write_com(0x80+9);
                                }
                                if(s1_num == 4)
                                {
                                        write_com(0x80+15);
                                }
                                if(s1_num == 5)
                                {
                                        write_com(0x80+0x40+13);
                                }
                                if(s1_num == 6)
                                {
                                        s1_num = 0;            // 记录按键清零
                                        cMode = 0;             // 退出模式
                                        write_com(0x0c);           // 取消光标闪烁
                                        // 保存数据
                                        SectorErase(0x2000);//擦除扇区
                                        byte_write(0x2000,iSet[0]);//重新写入数
                                        SectorErase(0x2200);//擦除扇区
                                        byte_write(0x2200,iSet[1]);//重新写入数
                                        SectorErase(0x2400);//擦除扇区
                                        byte_write(0x2400,iSet[2]);//重新写入数
                                        SectorErase(0x2600);//擦除扇区
                                        byte_write(0x2600,MotorSpedNum);//重新写入数
                                        SectorErase(0x2800);//擦除扇区
                                        byte_write(0x2800,RL);//重新写入数
                                }
                       
                        }
                        break;
                case 2:         // 增加
                        {
//                                s2_num++;
                                cMode = 0;
                                if(s1_num == 1)                          // 百
                                {
                                        iSet[0]++;
                                        if(iSet[0] >= 10)
                                                iSet[0] = 0;
                                        iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
                                        write_sfm(1, 7, iSetData);
                                    write_com(0x80+7);
                                }
                                if(s1_num == 2)
                                {
                                        iSet[1]++;
                                        if(iSet[1] >= 10)
                                                iSet[1] = 0;
                                        iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
                                        write_sfm(1, 7, iSetData);
                                    write_com(0x80+8);
                                }
                                if(s1_num == 3)
                                {
                                        iSet[2]++;
                                        if(iSet[2] >= 10)
                                                iSet[2] = 0;
                                        iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
                                        write_sfm(1, 7, iSetData);
                                    write_com(0x80+9);
                                }
                                if(s1_num == 4)          // 速度档
                                {
                                        MotorSpedNum++;
                                        if(MotorSpedNum >= 10)
                                        {
                                                MotorSpedNum = 9;
                                        }
                                        write_one_data(1, 15, MotorSpedNum);
                                        write_com(0x80+15);
                                }
                                if(s1_num == 5)          // 方向
                                {
                                        RL++;
                                        if(RL > 1)
                                                RL = 0;
                                        if(RL == 0)
                                        {
                                                FX = 0;
                                                write_string(2, 13, "R");
                                        }
                                        else
                                        {
                                                FX = 1;
                                                write_string(2, 13, "L");
                                        }
                                        write_com(0x80+0x40+13);
                                }
                        }
                        break;
                case 3:         // 减小
                        {
//                                s3_num++;
                                cMode = 0;
                                if(s1_num == 1)
                                {
                                        iSet[0]--;
                                        if(iSet[0] < 0)
                                                iSet[0] = 9;
                                        iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
                                        write_sfm(1, 7, iSetData);
                                        write_com(0x80+7);
                                }
                                if(s1_num == 2)
                                {
                                        iSet[1]--;
                                        if(iSet[1] < 0)
                                                iSet[1] = 9;
                                        iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
                                        write_sfm(1, 7, iSetData);
                                    write_com(0x80+8);
                                }
                                if(s1_num == 3)
                                {
                                        iSet[2]--;
                                        if(iSet[2] < 0)
                                                iSet[2] = 9;
                                        iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
                                        write_sfm(1, 7, iSetData);
                                        write_com(0x80+9);
                                }
                                if(s1_num == 4)          // 速度档
                                {
                                        MotorSpedNum--;
                                        if(MotorSpedNum < 0)
                                        {
                                                MotorSpedNum = 0;
                                        }
                                        write_one_data(1, 15, MotorSpedNum);
                                        write_com(0x80+15);                               
                                }
                                if(s1_num == 5)          // 方向
                                {
                                        RL--;
                                        if(RL < 0)
                                                RL = 1;
                                        if(RL == 0)
                                        {
                                                FX = 0;
                                                write_string(2, 13, "R");
                                        }
                                        else
                                        {
                                                FX = 1;
                                                write_string(2, 13, "L");
                                        }
                                        write_com(0x80+0x40+13);
                                }
                        }
                        break;
                        case 4:           //
                                {
       
                                        //  运行程序
                                        g_MotorSt = 1;
                                        cMode = 0;
                                /*        if (SYS_NUM >= 100)          // 10ms
                                        {
                                                SYS_NUM = 0;
                                                write_com(0x80+0x40+8);
                                                //        write_string(1, 2, "set:");
                                                write_sfm(2,7,CUR_MotorSpedQuan);
                                        }*/
                                }
                                break;
                default:
                        break;
       
        }
}

void SecondPro()
{
        if (END_FLAG)          // 到达目的
        {
                END_FLAG = 0;

                if(RL == 0)
                {
                        RL = 1;
                        FX = 1;
                        write_string(2, 13, "L");
                }
                else
                {
                        FX = 0;
                        write_string(2, 13, "R");
                }
                g_MotorSt = 1;
                MotorEn = 1;
                CUR_MotorSpedQuan = 0;
                TR0 = 1;
                       
        }
}

/********延时函数***********************************************************/
void delayms(xms)
{
         unsigned int x,y;
         for(x=xms;x>0;x--)
                 for(y=110;y>0;y--)
                        ;
}


你这代码不是写好了吗?哪里有问题呢?还是哪里不明白。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top