找回密码
 立即注册
查看: 492|回复: 0

使用STC15W408AS单片机设计的可遥控的步进电机正反转控制带停止抱死程序

[复制链接]
  • TA的每日心情
    开心
    2024-3-29 12:03
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    24

    主题

    6

    回帖

    247

    积分

    荣誉版主

    积分
    247
    发表于 2023-8-27 14:45:34 | 显示全部楼层 |阅读模式
    微信图片_20210226113706.png

    微信图片_20210226113738.png

    微信图片_20210226113743.png

    标示图.jpg

    接线图.jpg


    【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!     
    *********************************************************************/
    #include<STC15W408AS.h>
    #include<math.h>                  //计算小数点的头文件
    #include <intrins.h>          //用nop函数延时的头文件
    #define uchar unsigned char//宏定义无符号字符型
    #define uint unsigned int  //宏定义无符号整型
    /*数据类型定义*/
    typedef signed char        int8;
    typedef signed int        int16;
    typedef signed long        int32;
    typedef unsigned char        uint8;
    typedef unsigned int        uint16;
    typedef unsigned long        uint32;

    #define ENABLE_IAP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值
    #define CMD_IDLE 0
    #define CMD_READ 1
    #define CMD_PROGRAM 2
    #define CMD_ERASE 3
    #define ENABLE_IAP 0x83//SYSCLK<12MH
    #define IAP_ADDRESS 0x0000        //存储地址

    #define FOSC 11059200L  
    #define BAUD 9600   
    /**************************************************
                     IO口定义
    ***************************************************/
    sbit D1 = P1^2; //遥控D
    sbit D2 = P1^3; //遥控D
    sbit D3 = P5^4; //遥控D
    sbit D4 = P5^5; //遥控D

    sbit IN1 = P3^2; //左限位
    sbit IN2 = P3^3; //右限位

    sbit KZ1 = P1^4; //扩展1
    sbit KZ2 = P1^5; //扩展2

    sbit DIR = P3^7;     //方向
    sbit PW  = P3^6;         //脉冲
    sbit EN  = P1^0;         //使能
    sbit OUT = P1^1;     //抱闸

    uchar dat;
    uchar sudu;
    uint sdz=0;
    bit sjbz1=0;
    uint sj1=0;
    bit sjbz2=0;
    uint sj2=0;
    bit write=0;
    bit sdbz=0;
    uchar sendBuf[10];          //发送缓冲区
    bit xsdbz=0;
    bit bz1=0;
    bit bz2=0;
    bit bz3=0;
    bit bz4=0;
    bit bz5=0;

    bit zzjsbz=0;//正转按下计数标志
    bit fzjsbz=0;//反转按下计数标志
    bit CLK_EN=0;//脉冲使能
    /********************************************************************
                        初始定义
    *********************************************************************/
    uint sec; //定义计数值,每过1/10 秒,sec 加一
    uchar keycnt=0;//按下次数值
    uint tcnt; //键值判断

    uchar k=1;
    uchar k1=50;
    /********************************************************************
                        定义 ISP/IAP/EEPROM 命令
    *********************************************************************/

    void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
    uint8 IapReadByte(uint16 addr);//读数据
    void IapProgramByte(uint16 addr, uint8 dat);//写数据
    void IapEraseSector(uint16 addr);//擦除数据
    void key();
    void Init_Com(void);
    void delay(uchar date);
    void tssz();
    void senduart1();
    void senduart2();
    /********************************************************************
                        定时器
    *********************************************************************/
    void Init_Com(void)
    {
    SCON = 0x50;
    T2L = (65536 - (FOSC/4/BAUD));
    T2H = (65536 - (FOSC/4/BAUD))>>8;
    AUXR = 0x14;               
    AUXR |= 0x01;              
    //ES = 1;                  
    //EA = 1;

    //AUXR |= 0x80;                //定时器时钟1T模式
    //TMOD &= 0xF0;                //设置定时器模式
    //TL0 = 0x50;                //设置定时初值
    //TH0 = 0xFB;                //设置定时初值
    //TF0 = 0;                //清除TF0标志
               TMOD=0x02; //定时器工作在方式2
            TH0=0xf6; //对TH0 TL0 赋值
            TL0=0xf6;
            TR0=1; //开始定时
            ET0=1;
            EA=1;
            sec=0;
    }
    /********************************************************************
                        延时函数
    *********************************************************************/
    void delay(uchar date)//延时程序
    {
    uchar m,n,s;
    for(m=date;m>0;m--)
    for(n=2 ;n>0;n--)
    for(s=248;s>0;s--);                                                                       
    }

    /*******************************************************************
    *                        按键
    ********************************************************************/
    void key()
    {
    if(KZ2==1)
    {
    if((D1==1)&&(D2==0)&&(D3==0)&&(D4==0)&&(bz1==0)&&(IN1==1)){delay(k);if((D1==1)&&(D2==0)&&(D3==0)&&(D4==0))
    {
    zzjsbz=!zzjsbz;        bz1=1;sj1=0;sjbz1=0;if(zzjsbz==1){OUT =0;CLK_EN=1;delay(k1);EN =1;}else{OUT =1;delay(k1);EN =0;CLK_EN=0;}DIR =1;}}//A        正转  
    if((D1==0)&&(D2==1)&&(D3==0)&&(D4==0)&&(bz1==0)&&(IN2==1)){delay(k);if((D1==0)&&(D2==1)&&(D3==0)&&(D4==0))
    {
    fzjsbz=!fzjsbz;        bz1=1;sj1=0;sjbz1=0;if(fzjsbz==1){OUT =0;delay(k1);EN =1;CLK_EN=1;}else{OUT =1;delay(k1);EN =0;CLK_EN=0;}DIR =0;}}//B        反转
    }       
           
    if((D1==0)&&(D2==0)&&(D3==1)&&(D4==0)&&(bz1==0)){delay(k);if((D1==0)&&(D2==0)&&(D3==1)&&(D4==0)){sec=0;bz1=1;sj2=0;sjbz2=1;sdbz=1;}}//C        加速
    if((D1==0)&&(D2==0)&&(D3==0)&&(D4==1)&&(bz1==0)){delay(k);if((D1==0)&&(D2==0)&&(D3==0)&&(D4==1)){sec=0;bz1=1;sj2=0;sjbz2=1;sdbz=0;}}//D        减速
    if((D1==0)&&(D2==0)&&(D3==0)&&(D4==0)&&(bz1==1)){delay(k);if((D1==0)&&(D2==0)&&(D3==0)&&(D4==0)&&(bz1==1)){if((D1==0)&&(D2==0)&&(D3==0)&&(D4==0)&&(bz1==1)){sjbz1=1;bz1=0;}}}

    if((IN1==0)&&(bz2==0)){delay(k);if((IN1==0)&&(bz2==0)){EN =0;bz2=1;}}        if((IN1==1)&&(bz2==1)){delay(k);if((IN1==1)&&(bz2==1)){bz2=0;}}
    if((IN2==0)&&(bz3==0)){delay(k);if((IN2==0)&&(bz3==0)){EN =0;bz3=1;}}        if((IN2==1)&&(bz3==1)){delay(k);if((IN2==1)&&(bz3==1)){bz3=0;}}
    }
    void tssz()
    {
    if(KZ2==0)
    {
    if((D1==1)&&(D2==0)&&(D3==0)&&(D4==0)&&(bz1==0)&&(IN1==1)){delay(k);if((D1==1)&&(D2==0)&&(D3==0)&&(D4==0)){bz1=1;sj1=0;sjbz1=0;OUT =0;delay(k1);EN =1;DIR =1;}}//A        正转  
    if((D1==0)&&(D2==1)&&(D3==0)&&(D4==0)&&(bz1==0)&&(IN2==1)){delay(k);if((D1==0)&&(D2==1)&&(D3==0)&&(D4==0)){bz1=1;sj1=0;sjbz1=0;OUT =0;delay(k1);EN =1;DIR =0;}}//B        反转       
    if(sjbz1==1){sj1++;if(sj1>=5000){sjbz1=0;sj1=0;EN =0;OUT =1;}}
    }
    if(sjbz2==1){sj2++;if(sj2>=500)

    {
    if(sdbz==0){if(sudu<45){sudu++;write=1;}}
    if(sdbz==1){if(sudu>=2){sudu--;write=1;}}
    switch(sudu)
    {
    //case 0:        sdz=10;dat=0x01;senduart1();break;
    case 1:        sdz=1;dat=0x01;senduart1();break;
    case 2:        sdz=2;dat=0x02;senduart1();break;
    case 3:        sdz=3;dat=0x03;senduart1();break;
    case 4:        sdz=4;dat=0x04;senduart1();break;
    case 5:        sdz=5;dat=0x05;senduart1();break;
    case 6:        sdz=6;dat=0x06;senduart1();break;
    case 7:        sdz=7;dat=0x07;senduart1();break;
    case 8:        sdz=8;dat=0x08;senduart1();break;
    case 9:        sdz=9;dat=0x09;senduart1();break;
    case 10:sdz=10;dat=0x10;senduart1();break;
    case 11:sdz=11;dat=0x10;senduart1();break;
    case 12:sdz=12;dat=0x12;senduart1();break;
    case 13:sdz=13;dat=0x13;senduart1();break;
    case 14:sdz=14;dat=0x14;senduart1();break;
    case 15:sdz=15;dat=0x15;senduart1();break;
    case 16:sdz=16;dat=0x16;senduart1();break;
    case 17:sdz=17;dat=0x17;senduart1();break;
    case 18:sdz=18;dat=0x18;senduart1();break;
    case 19:sdz=19;dat=0x19;senduart1();break;
    case 20:sdz=20;dat=0x20;senduart1();break;
    case 21:sdz=23;dat=0x21;senduart1();break;
    case 22:sdz=26;dat=0x22;senduart1();break;
    case 23:sdz=30;dat=0x23;senduart1();break;
    case 24:sdz=34;dat=0x24;senduart1();break;
    case 25:sdz=38;dat=0x25;senduart1();break;
    case 26:sdz=42;dat=0x26;senduart1();break;
    case 27:sdz=46;dat=0x27;senduart1();break;
    case 28:sdz=50;dat=0x28;senduart1();break;
    case 29:sdz=55;dat=0x29;senduart1();break;
    case 30:sdz=60;dat=0x30;senduart1();break;
    case 31:sdz=65;dat=0x31;senduart1();break;
    case 32:sdz=70;dat=0x32;senduart1();break;
    case 33:sdz=75;dat=0x33;senduart1();break;
    case 34:sdz=80;dat=0x34;senduart1();break;
    case 35:sdz=90;dat=0x35;senduart1();break;
    case 36:sdz=100;dat=0x36;senduart1();break;
    case 37:sdz=110;dat=0x37;senduart1();break;
    case 38:sdz=120;dat=0x38;senduart1();break;
    case 39:sdz=130;dat=0x39;senduart1();break;
    case 40:sdz=145;dat=0x40;senduart1();break;
    case 41:sdz=165;dat=0x41;senduart1();break;
    case 42:sdz=180;dat=0x42;senduart1();break;
    case 43:sdz=200;dat=0x43;senduart1();break;
    case 44:sdz=220;dat=0x44;senduart1();break;
    case 45:sdz=250;dat=0x45;senduart1();break;
    default:break;
    }
    sjbz2=0;
    sj2=0;
    }
    }
    }
    /****************发送函数*********************/
    void senduart1()
    {          
    SBUF=0xAA;while(!TI);TI=0;
    SBUF=0x00;while(!TI);TI=0;
    SBUF=0x02;while(!TI);TI=0;
    SBUF=dat;while(!TI);TI=0;
    SBUF=0xBB;while(!TI);TI=0;
    }
    /****************发送函数*********************/
    void senduart2()
    {          
    SBUF=0xAA;while(!TI);TI=0;
    SBUF=0x00;while(!TI);TI=0;
    SBUF=0x05;while(!TI);TI=0;
    SBUF=0x00;while(!TI);TI=0;
    SBUF=0xBB;while(!TI);TI=0;
    }

    /**************************************************
                    主函数
    ***************************************************/
    void main()
    {
    Init_Com();
    sec=0;
    sudu=IapReadByte(0x01);//读取存储的值
    if(sudu>=45){sudu=10;}
    KZ1 = 1;
    KZ2 = 1;
    EN =0;
    switch(sudu)
    {
    //case 0:        sdz=10;dat=0x01;senduart1();break;
    case 1:        sdz=1;dat=0x01;senduart1();break;
    case 2:        sdz=2;dat=0x02;senduart1();break;
    case 3:        sdz=3;dat=0x03;senduart1();break;
    case 4:        sdz=4;dat=0x04;senduart1();break;
    case 5:        sdz=5;dat=0x05;senduart1();break;
    case 6:        sdz=6;dat=0x06;senduart1();break;
    case 7:        sdz=7;dat=0x07;senduart1();break;
    case 8:        sdz=8;dat=0x08;senduart1();break;
    case 9:        sdz=9;dat=0x09;senduart1();break;
    case 10:sdz=10;dat=0x10;senduart1();break;
    case 11:sdz=11;dat=0x10;senduart1();break;
    case 12:sdz=12;dat=0x12;senduart1();break;
    case 13:sdz=13;dat=0x13;senduart1();break;
    case 14:sdz=14;dat=0x14;senduart1();break;
    case 15:sdz=15;dat=0x15;senduart1();break;
    case 16:sdz=16;dat=0x16;senduart1();break;
    case 17:sdz=17;dat=0x17;senduart1();break;
    case 18:sdz=18;dat=0x18;senduart1();break;
    case 19:sdz=19;dat=0x19;senduart1();break;
    case 20:sdz=20;dat=0x20;senduart1();break;
    case 21:sdz=23;dat=0x21;senduart1();break;
    case 22:sdz=26;dat=0x22;senduart1();break;
    case 23:sdz=30;dat=0x23;senduart1();break;
    case 24:sdz=34;dat=0x24;senduart1();break;
    case 25:sdz=38;dat=0x25;senduart1();break;
    case 26:sdz=42;dat=0x26;senduart1();break;
    case 27:sdz=46;dat=0x27;senduart1();break;
    case 28:sdz=50;dat=0x28;senduart1();break;
    case 29:sdz=55;dat=0x29;senduart1();break;
    case 30:sdz=60;dat=0x30;senduart1();break;
    case 31:sdz=65;dat=0x31;senduart1();break;
    case 32:sdz=70;dat=0x32;senduart1();break;
    case 33:sdz=75;dat=0x33;senduart1();break;
    case 34:sdz=80;dat=0x34;senduart1();break;
    case 35:sdz=90;dat=0x35;senduart1();break;
    case 36:sdz=100;dat=0x36;senduart1();break;
    case 37:sdz=110;dat=0x37;senduart1();break;
    case 38:sdz=120;dat=0x38;senduart1();break;
    case 39:sdz=130;dat=0x39;senduart1();break;
    case 40:sdz=145;dat=0x40;senduart1();break;
    case 41:sdz=165;dat=0x41;senduart1();break;
    case 42:sdz=180;dat=0x42;senduart1();break;
    case 43:sdz=200;dat=0x43;senduart1();break;
    case 44:sdz=220;dat=0x44;senduart1();break;
    case 45:sdz=250;dat=0x45;senduart1();break;
    default:break;
    }
    delay(200);
    senduart2();
    delay(100);
    while(1)
    {
    key();
    tssz();

    if(write==1)  //存储数据
    {
    EA=0;
    write=0;
    IapEraseSector(0);  //擦除扇区
    IapProgramByte(0x01,sudu);//写入新的地址
    delay(k);
    EA=1;
    }
    }}

    /********************************************************************
                        定时中断服务函数
    *********************************************************************/
    void t0(void) interrupt 1 using 0 //定时中断服务函数
    {
    //tcnt++; //每过250ust tcnt 加一
    //
    //if(tcnt>=2000) //计满4000 次(1/10 秒)时
    //{
    //tcnt=0; //重新再计
    //OUT=!OUT;
    //}
    //sec++;
    //
    //if(sec>=sdz) //设置4秒到时电机停止
    //{
    //sec=0;
    //PW=!PW;
    //}
    sec++;

    if(sec>=sdz) //设置4秒到时电机停止
    {
    sec=0;
    if(CLK_EN==1)//脉冲使能       
    {
    PW=!PW;
    }}
    }
    //}

    void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
    IAP_CONTR = 0;           //
    IAP_CMD = 0;           //
    IAP_TRIG = 0;           //
    IAP_ADDRH = 0x80;  //
    IAP_ADDRL = 0;           //
    }
    uint8 IapReadByte(uint16 addr){//读数据
    uint8 dat;
    IAP_CONTR = ENABLE_IAP;
    IAP_CMD = CMD_READ;
    IAP_ADDRL = addr;
    IAP_ADDRH = addr >> 8;
    IAP_TRIG = 0x5A;
    IAP_TRIG = 0xA5;
    _nop_();
    dat = IAP_DATA;
    IapIdle();
    return dat;
    }
    void IapProgramByte(uint16 addr, uint8 dat){//写数据
    IAP_CONTR = ENABLE_IAP;
    IAP_CMD = CMD_PROGRAM;
    IAP_ADDRL = addr;
    IAP_ADDRH = addr >> 8;
    IAP_DATA = dat;
    IAP_TRIG = 0x5A;
    IAP_TRIG = 0xA5;
    _nop_();
    IapIdle();
    }
    void IapEraseSector(uint16 addr){//擦除数据
    IAP_CONTR = ENABLE_IAP;
    IAP_CMD = CMD_ERASE;
    IAP_ADDRL = addr;
    IAP_ADDRH = addr >> 8;
    IAP_TRIG = 0x5A;
    IAP_TRIG = 0xA5;
    _nop_();
    IapIdle();
    }
    /********************************************************************
                          结束
    *********************************************************************/

    GYJ-0185 步进电机正反转控制带停止程序 - 带数码管20221226.zip

    2.77 KB, 下载次数: 29

    回复 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-20 11:39 , Processed in 0.058149 second(s), 31 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表