找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 327|回复: 0
打印 上一主题 下一主题
收起左侧

STC15W408AS单片机实现步进电机遥控控制程序设计分享

[复制链接]
跳转到指定楼层
楼主







【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!     
*********************************************************************/
#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 步进电机正反转控制带停止抱死程序 - 带数码管20230615.rar (57.5 KB, 下载次数: 15)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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