/*****************************************************************************************************************
File Name: Motor_Driver.c
Author: YangYuan
Version: Version 1.0
Start: 10 21,2009
Description: motor drive
******************************************************************************************************************/
#include <reg51.h>
#include <intrins.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned char
#define SLAVE 0xF1
#define BN 10
/**************************************************************
Description: 限位开关的位定义
***************************************************************/
sbit Motor1_key1 = P1^0;
sbit Motor1_key2 = P1^1;
sbit Motor2_key1 = P1^2;
sbit Motor2_key2 = P1^3;
sbit Motor3_key1 = P1^4;
sbit Motor3_key2 = P1^5;
/**************************************************************
Description: 步进电机控制模块位定义
***************************************************************/
sbit CP1 = P2^0;
sbit CP2 = P2^1;
sbit CP3 = P2^2;
sbit DIR1 = P2^3;
sbit DIR2 = P2^4;
sbit DIR3 = P2^5;
uchar idata Tdata[10]={"abcdefghij"};
uchar idata Genbuf[10];
//////////////////////////////////
void KeyDetect(void);
void delay10ms(count);
void DoublestepF(int n);
void DoublestepB(int n);
void MiddlestepF(int n);
void MiddlestepB(int n);
void error(void);
void Stop(void);
void Comoutchar(void);
void initialize(void);
uchar receive(uchar addrs);
uchar send(void);
////////////////////////////////
/**************************************************************
Description: 延时10ms的延时程序
***************************************************************/
void delay10ms(count)
{
int j,k;
while(count--!=0)
{
for (j=0;j<10;j++)
for (k=0;k<72;k++)
;
}
}
/**************************************************************
Description: 控制限位开关
***************************************************************/
void KeyDetect(void)
{
unsigned char temp;
temp = P0;
switch(temp)
{
case 0x7F: DIR1 = 1; break;
case 0xBF: DIR1 = 0; break;
case 0xDF: DIR2 = 1; break;
case 0xEF: DIR2 = 0; break;
case 0xF7: DIR3 = 1; break;
case 0xFB: DIR3 = 0; break;
case 0x5F: DIR1 = 1; DIR2 = 1; break;
case 0xAF: DIR1 = 0; DIR2 = 0; break;
case 0x57: DIR1 = 1; DIR2 = 1; DIR3 = 1; break;
case 0x5B: DIR1 = 1; DIR2 = 1; DIR3 = 0; break;
case 0xA7: DIR1 = 0; DIR2 = 0; DIR3 = 0; break;
case 0xAB: DIR1 = 0; DIR2 = 0; DIR3 = 1; break;
case 0x77: DIR1 = 0; DIR3 = 0; break;
case 0xBB: DIR1 = 1; DIR3 = 1; break;
case 0x7B: DIR1 = 0; DIR3 = 1; break;
case 0xB7: DIR1 = 1; DIR3 = 0; break;
case 0xD7: DIR2 = 0; DIR3 = 0; break;
case 0xEB: DIR2 = 1; DIR3 = 1; break;
case 0xDB: DIR2 = 0; DIR3 = 1; break;
case 0xE7: DIR2 = 1; DIR3 = 0; break;
default: break;
}
}
/***************************
*两侧步进前进程序
***************************/
void DoublestepF(int n)
{
int i;
DIR1 = 1;
DIR2 = 1;
for(i=0;i<n;i++)
{
CP1 = !CP1;
CP2 = !CP2;
}
}
/***************************
*两侧步进前进程序
***************************/
void DoublestepB(int n)
{
int i;
DIR1 = 0;
DIR2 = 0;
for(i=0;i<n;i++)
{
CP1 = !CP1;
CP2 = !CP2;
}
}
/***************************
*中间步进前进程序
***************************/
void MiddlestepF(int n)
{
int i;
DIR3 = 1;
for(i=0;i<n;i++)
{
CP3 = !CP3;
}
}
/***************************
*中间步进后退程序
***************************/
void MiddlestepB(int n)
{
int i;
DIR3 = 0;
for(i=0;i<n;i++)
{
CP3 = !CP3;
}
}
/***************************
*向串口发送一个字符
***************************/
void Comoutchar(void)
{
SBUF = 0xaa;
while (!TI)
TI=0;
}
/*********************************
*定时器0中断控制每分钟的脉冲数
*********************************/
void timer0() interrupt 1
{
int count1;
int count2;
unsigned char temp1;
TH0 = (65536-Genbuf[1])/256;
TH0 = (65536-Genbuf[1])%256;
temp1 = Genbuf[2];
switch(temp1)
{
case 0xBB:
count1++;
if (count1==50)
{
DoublestepF(Genbuf[3]);
count1=0;
}
break;
case 0xCC:
count1++;
if (count1==50)
{
DoublestepB(Genbuf[3]);
count1=0;
}
break;
case 0xDD:
count2++;
if (count2==100)
{
MiddlestepF(Genbuf[3]);
count2=0;
}
break;
case 0xEE:
count2++;
if (count2==100)
{
MiddlestepB(Genbuf[3]);
count2=0;
}
break;
default: break;
}
}
/*********************************
*串口接收中断函数
*********************************/
void CominINT(void) interrupt 4
{
if(RI)
{
receive(SLAVE);
}
}
/*********************************
*串口发送出错标志
*********************************/
void error(void)
{
SBUF = 0xAA;
while(TI!=1);
TI=0;
}
/*********************************
*串口发送出错标志
*********************************/
void Stop(void)
{
SBUF = 0x32;
while(TI!=1);
TI=0;
}
/*********************************
*串口接收函数
*********************************/
uchar receive(uchar addrs)
{
uchar i,p;
while(1)
{
while(RI!=1) //等待PC机的联络信号
RI=0;
if(SBUF!=addrs)
error();
else
{
TB8=0; //清除标志位准备接收数据
SBUF=0x00; //发约定码0x00,说明地址正确
while(TI!=1);TI=0;
while(RI!=1);RI=0;
{
while(1)
{
p=0;
for(i=0;i<BN;i++)
{
while(RI!=1);RI=0;
Genbuf[i]=SBUF; //单片机接收数据
p+=Genbuf[i];
}
while(RI==0);RI=0;
if(SBUF==p)
{
SBUF=0x00; //校检和相同发送0x00给PC机
while(TI!=1);TI=0;
}
else
{
SBUF=0xFF; //校检和不同发送0xFF给PC机
while(TI!=1);TI=0;
}
}
TB8=1; //重置地址标志位
return(0);
}
}
}
}
/*********************************
*串口发送函数
*********************************/
uchar send(void)
{
uchar i,p;
EA = 0;
do
{
p=0; //清除校检和
for(i=0;i<BN;i++)
{
SBUF=Genbuf[i]; //发送数据
p+=Genbuf[i]; //计算校检和
while(TI!=1);TI=0;
}
SBUF=p; //发送校检和给PC机
while(TI!=1);TI=0;
while(RI!=1);RI=0;
}
while(SBUF!=0); //PC机接收不正确,单片机重新发送
TB8=1; //重置地址标志位
return(0);
EA = 1;
}
/*********************************
*系统的初始化函数
*********************************/
void initialize(void)
{
P1=0xFF;
P2=0xFF;
P3=0xFF;
do
{
KeyDetect();
}
while(P0!=0xFF);
}
/*********************************
*程序的主函数
*********************************/
void main(void)
{
/*系统初始化*/
initialize();
/*串口232初始化*/
IP = 0x1A;
TMOD = 0x11; //定时器1工作在方式1,定时器0工作在方式1
TL1 = 0xfd;
TH1 = 0xfd;
SCON = 0xD0; //设置串行口控制字,方式3允许接收
PCON = 0x00;
ES = 1; //使用串口中断;
EA = 1; //开中断;
ET1 = 1;
TR1 = 1;
send();
TH0 = (65536-Genbuf[1])/256;
TH0 = (65536-Genbuf[1])%256;
ET0 = 1;
TR0 = 1;
while(1)
{
KeyDetect();
if(P0!=0xFF)
{
Stop();
}
}
}
SerialStepMotor.rar_串口 步进电机
版权申诉
5星 · 超过95%的资源 94 浏览量
2022-07-13
18:50:19
上传
评论
收藏 23KB RAR 举报
小波思基
- 粉丝: 74
- 资源: 1万+
最新资源
- contact(1).dat
- 基于SSM+MySql的超市管理系统源码+数据库+说明文档.zip
- Java课程设计-基于SSM+MySql的超市管理系统源码+数据库+说明文档.zip
- Java课程设计-基于Javaweb的超市管理系统源码+数据库+说明文档.zip
- 基于Javaweb的超市管理系统源码+数据库+说明文档.zip
- Unity Standard shader 修改(增加本地坐标裁剪)
- 基于vue-nodejs的教务管理系统源码+数据库+毕业设计.zip
- vuInhub靶场实战系列-prime:2
- 昆仑通态触摸屏MCGS样板程序案例,位图,培训教程.zip
- Java工资管理系统项目源码(可做毕设项目参考)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈