一方面,由于同类的东西网上这方面的资料很少,而项目中大多东西都是经过自己探索或者验证过的,对于想搞单片机控制类的朋友来说,个人认为还是有很大帮助的;另一方面,源代码是自己研究了很长时间才写出来的,感觉可能会大家的编程有所帮助吧;

总之,希望能够帮助大家。


源代码:点击下载附件

#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit A1=P1^0; //定义步进电机连接端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;
sbit A2=P1^4; //定义步进电机连接端口
sbit B2=P1^5;
sbit C2=P1^6;
sbit D2=P1^7;
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
sbit K4=P3^3;
sbit key_up = P2^0;
sbit key_right = P2^1;
sbit key_left = P2^2;
sbit key_down = P2^3;
sbit x2 = P2^4;
sbit x3 = P2^5;
sbit LATCH1=P2^6;
sbit LATCH2=P2^7;
uint up=0;
uint down=0;
uint left=0;
uint right=0;
#define Coil_A1{A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF1 {A1=0;B1=0;C1=0;D1=0;}//全部断电
#define Coil_A2{A2=1;B2=0;C2=0;D2=0;}//A相通电,其他相断电
#define Coil_B2 {A2=0;B2=1;C2=0;D2=0;}//D相通电,其他相断电
#define Coil_C2 {A2=0;B2=0;C2=1;D2=0;}//C相通电,其他相断电
#define Coil_D2 {A2=0;B2=0;C2=0;D2=1;}//D相通电,其他相断电
#define Coil_OFF2 {A2=0;B2=0;C2=0;D2=0;}//全部断电
void Init_Timer0(void);
uchar code Duan_Ma[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code Wei_Ma[]= {0xfe,0xfd,0xfb,0xf7};  //1~4选中数码管
uchar TempData[8];
unsigned FFW[8]= {0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //反转
void DelayUs2x(uchar t)
{
    while(--t);
}
/* 1Ms延时 */
void Delay_Ms(uchar t)
{

    while(t--)
    {
        //大致延时1mS
        DelayUs2x(245);
        DelayUs2x(245);
    }
}
void Init_Timer0(void)
{
    TMOD |= 0x01;   //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
    EA=1;           //总中断打开
    ET0=1;           //定时器中断打开
    TR0=1;           //定时器开关打开
    PT0=1;           //优先级打开
}
void Display(unsigned char FirstBit,unsigned char Num)
{
    static uchar i=0;

    P0=0;   //清空数据,防止有交替重影
    LATCH1=1;     //段锁存
    LATCH1=0;
    P0=Wei_Ma[i+FirstBit]; //取位码
    LATCH2=1;     //位锁存
    LATCH2=0;
    P0=TempData[i]; //取显示数据,段码
    LATCH1=1;     //段锁存
    LATCH1=0;

    i++;
    if(i==Num)
        i=0;

}
void turn_up(num)
{
    Coil_A1;//A相通电,其他相断电
    Delay_Ms(num);
    Coil_B1;//B相通电,其他相断电
    Delay_Ms(num);
    Coil_C1;//C相通电,其他相断电
    Delay_Ms(num);
    Coil_D1;//D相通电,其他相断电
    Delay_Ms(num);
    Coil_OFF1;//全部断电
}
void turn_down(num)
{
    Coil_D1;//D相通电,其他相断电
    Delay_Ms(num);
    Coil_C1;//C相通电,其他相断电
    Delay_Ms(num);
    Coil_B1;//B相通电,其他相断电
    Delay_Ms(num);
    Coil_A1;//A相通电,其他相断电
    Delay_Ms(num);
    Coil_OFF1;//全部断电
}
void turn_right(num)
{
    Coil_A2;//A相通电,其他相断电
    Delay_Ms(num);
    Coil_B2;//B相通电,其他相断电
    Delay_Ms(num);
    Coil_C2;//C相通电,其他相断电
    Delay_Ms(num);
    Coil_D2;//D相通电,其他相断电
    Delay_Ms(num);
    Coil_OFF2;//全部断电
}
void turn_left(num)
{
    Coil_D2;//D相通电,其他相断电
    Delay_Ms(num);
    Coil_C2;//C相通电,其他相断电
    Delay_Ms(num);
    Coil_B2;//B相通电,其他相断电
    Delay_Ms(num);
    Coil_A2;//A相通电,其他相断电
    Delay_Ms(num);
    Coil_OFF2;//全部断电
}
void  motorf1()
{
    unsigned char i;
    unsigned int a;
    if(K1==1)
    {
        for (i=0; i<8; i++)       //一个周期转30度
        {   P1 = FFW[i]&0x1f;
            Delay_Ms(8);
        }
    }
    if(K3==1)
    {
        for (i=0; i<8; i++)
        {
            a= FFW[i]&0x1f;
            a = (a>>4 | a<<4);
            P1 = a;
            Delay_Ms(8);
        }
    }
}
//调节转速
void  motorf2()
{
    unsigned char i;
    unsigned int a;

    if(K3==1)
    {
        for (i=0; i<8; i++)       //一个周期转30度
        {   P1 = FFW[8-i]&0x1f;
            Delay_Ms(8);
        }
    }
    if(K4==1)
    {
        for (i=0; i<8; i++)
        {
            a= FFW[8-i]&0x1f;
            a = (a>>4 | a<<4);
            P1=a;
        }
        Delay_Ms(8);                  //调节转速
    }
}

main()
{
    uchar k=0;
    uchar num;
    uchar n=0;
    uint flag=1;
    Init_Timer0();
    Coil_OFF1;
    Coil_OFF2;
    while(1)
    {
        motorf1();
        motorf2();

        if(x2 == 0) {
            num = 60;
        }
        if(x3 == 0) {
            num = 10;
        }
        else {
            num=30;
        }
        /* 上步进电机控制 */
        if(up>down)
        {
            if(key_up == 0)
            {
                Delay_Ms(50);
                if(key_up==0)
                {
                    k++;
                    up++;
                    turn_up(num);
                }
            }
            else if (key_down == 0)
            {
                Delay_Ms(50);
                if(key_down==0)
                {
                    k--;
                    down++;
                    turn_down(num);
                }
            }
        }
        else if(up<down)
        {
            if(key_up == 0)
            {
                Delay_Ms(50);
                if(key_up==0)
                {
                    k--;
                    up++;
                    turn_up(num);
                }
            }
            else if(key_down == 0)
            {
                Delay_Ms(50);
                if(key_down==0)
                {
                    k++;
                    down++;
                    turn_down(num);
                }
            }
        }
        else  if(up==down)
        {
            if(key_up == 0)
            {
                Delay_Ms(50);
                if(key_up==0)
                {
                    k++;
                    up++;
                    turn_up(num);
                }
            }
            else if (key_down == 0)
            {
                Delay_Ms(50);
                if(key_down==0)
                {
                    k++;
                    down++;
                    turn_down(num);
                }
            }
        }

        /* 左右步进电机控制  */
        if(left>right)
        {
            if(key_left == 0)
            {
                Delay_Ms(50);
                if(key_left==0)
                {
                    n++;
                    left++;
                    turn_left(num);
                }
            }
            else if (key_right == 0)
            {
                Delay_Ms(50);
                if(key_right==0)
                {
                    n--;
                    right++;
                    turn_right(num);
                }
            }
        }
        else if(left<right)
        {
            if(key_left == 0)
            {
                Delay_Ms(50);
                if(key_left==0)
                {
                    n--;
                    left++;
                    turn_left(num);
                }
            }
            else if(key_right == 0)
            {
                Delay_Ms(50);
                if(key_right==0)
                {
                    n++;
                    right++;
                    turn_right(num);
                }
            }
        }
        else  if(left==right)
        {
            if(key_left == 0)
            {
                Delay_Ms(50);
                if(key_left==0)
                {
                    n++;
                    left++;
                    turn_left(num);
                }
            }
            else if (key_right == 0)
            {
                Delay_Ms(50);
                if(key_right==0)
                {
                    n++;
                    right++;
                    turn_right(num);
                }
            }
        }
        TempData[0]=Duan_Ma[k/10];//分解显示信息,如要显示68,则68/10=6  68%10=8
        TempData[1]=Duan_Ma[k%10];
        TempData[2]=Duan_Ma[n/10];//分解显示信息,如要显示68,则68/10=6  68%10=8
        TempData[3]=Duan_Ma[n%10];
    }
}
void Timer0_isr(void) interrupt 1
{
    TH0=(65536-1000)/256;    //重新赋值 1ms
    TL0=(65536-1000)%256;
    Display(0,8);
}
注意:本站所有文章除特别说明外,均为原创,转载请务必以超链接方式并注明作者出处。 标签:LM393芯片使用,电路开发,MCU使用,MCU探讨