电机控制程序
来源:互联网 发布:圆方软件破解版 编辑:程序博客网 时间:2024/05/16 02:02
#include "STC.H"
// sbit s=P1^0;
sbit pul=P0^0; //脉冲信号输出,LED0.0可显示状态
sbit dir=P0^1; //方向信号输出,LED0.1可显示状态
sbit ena=P0^2; //使能信号输出,LED0.2可显示状态
sbit lp0=P1^0;//
sbit lp1=P1^1;
int flag=0;
#define uchar unsigned char
#define uint unsigned int
//sbit S1=P1^4; // 方向控制 独立按键K5
//sbit S2=P1^5; // 使能控制 独立按键K6
unsigned char dat;
unsigned int v;
unsigned int x;
unsigned int k;
unsigned char light;
unsigned int sudu[9]={1,2,4,8,25,32,64,128,256};
int pos=0;
void delay_1ms(unsigned int i) //1MS 延时
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<125;j++)
{;}
}
void delay_40us(unsigned int i) //40usS 延时
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<5;j++)
{;}
}
void delay(unsigned int i)// us级延时
{
while(--i);
}
void sent_char(uchar i) //发送一个字符
{
SBUF=i;
while(!TI);
TI=0;
}
void sent_str(uchar *s) //发送字符串
{
while(*s!='\0')
{
sent_char(*s);
s++;
delay_1ms(5);
}
}
void cd() //每转一个角度,发送一个数据,用于计算长度;
{ if(dir==0&&ena==1&&lp0==0&&lp1==0)
sent_char('x');
else if(dir==1&&ena==1&&lp0==0&&lp1==0)
sent_char('y');
}
void dd() //到达端点,向电脑发送数据
{ if(dir==0&&ena==1&&lp0==1)
sent_char('e');
else if(dir==1&&ena==1&&lp1==1)
sent_char('f');
}
/*void keyscan() //键盘扫描
{
if(S2==0)
{
delay_1ms(10);//延时,防抖
if(S2==0)
ena=~ena;// 使能改变
}
if(S1==0)
{
delay_1ms(10);//延时,防抖
if(S1==0)
dir=~dir;// 方向改变
}
}
*/
void main(void)
{ SCON=0x40;
TMOD = 0x20;
TH0 = 0x3c;
TL0 = 0xb0;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
SM0 = 0;
SM1 = 1;
REN = 1;
EA = 1;
ES = 1;
RI = 0;
TI =0;
ena=0 ;//高电平使能,初始化为低电平。
delay(5) ;//使能信号要至少要早于方向信号5us建立
dir=1 ;//初始化转动方向
delay(5) ; //因为方向信号要至少要早于脉冲信号5us建立
v=4 ; //速度初始化
P1=0xFF; // P1口置1,为写入端口
while(1)
{
if(RI==1)
{
dat=SBUF; //串口通信接受收据
RI=0;
}
if (dat=='a') //开关
{ena=0;pul=0;}
else if (dat=='b')
ena=1;
else if(dat=='c')//方向
{ena=1;dir=0;}
else if(dat=='d')
{ena=1;dir=1;}
if(ena==1)///电机打开才能进行加减速
{
if(dat=='0') //速度调节,dat从0~9,速度依次增大。
v=8;
else if(dat=='1')
v=7;
else if(dat=='2')
v=6;
else if(dat=='3')
v=5;
else if(dat=='4')
v=4;
else if(dat=='5')
v=3;
else if(dat=='6')
v=2;
else if(dat=='7')
v=1;
else if(dat=='8')
v=0;
}
x=sudu[v];
// keyscan();
// delay(5) ; //因为方向信号要至少要早于脉冲信号5us建立
if (lp0==1||lp1==1)
{ flag=1;
//dir=~dir;
}
if (flag==0)
{pul=0; //pul输出低电平
delay_40us(x); //周期的1/2时间
pul=1; //pul 输出高电平
delay_40us(x); //
cd();
}
else
{
flag=0;
dd() ;
dir=~dir;
for(k=0;k<5000;k++)
{pul=0; //pul输出低电平
delay_40us(x); //周期的1/2时间
pul=1; //pul 输出高电平
delay_40us(x);
if(dir==0)
sent_char('x');
else
sent_char('y');
}
}
}
}
// sbit s=P1^0;
sbit pul=P0^0; //脉冲信号输出,LED0.0可显示状态
sbit dir=P0^1; //方向信号输出,LED0.1可显示状态
sbit ena=P0^2; //使能信号输出,LED0.2可显示状态
sbit lp0=P1^0;//
sbit lp1=P1^1;
int flag=0;
#define uchar unsigned char
#define uint unsigned int
//sbit S1=P1^4; // 方向控制 独立按键K5
//sbit S2=P1^5; // 使能控制 独立按键K6
unsigned char dat;
unsigned int v;
unsigned int x;
unsigned int k;
unsigned char light;
unsigned int sudu[9]={1,2,4,8,25,32,64,128,256};
int pos=0;
void delay_1ms(unsigned int i) //1MS 延时
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<125;j++)
{;}
}
void delay_40us(unsigned int i) //40usS 延时
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<5;j++)
{;}
}
void delay(unsigned int i)// us级延时
{
while(--i);
}
void sent_char(uchar i) //发送一个字符
{
SBUF=i;
while(!TI);
TI=0;
}
void sent_str(uchar *s) //发送字符串
{
while(*s!='\0')
{
sent_char(*s);
s++;
delay_1ms(5);
}
}
void cd() //每转一个角度,发送一个数据,用于计算长度;
{ if(dir==0&&ena==1&&lp0==0&&lp1==0)
sent_char('x');
else if(dir==1&&ena==1&&lp0==0&&lp1==0)
sent_char('y');
}
void dd() //到达端点,向电脑发送数据
{ if(dir==0&&ena==1&&lp0==1)
sent_char('e');
else if(dir==1&&ena==1&&lp1==1)
sent_char('f');
}
/*void keyscan() //键盘扫描
{
if(S2==0)
{
delay_1ms(10);//延时,防抖
if(S2==0)
ena=~ena;// 使能改变
}
if(S1==0)
{
delay_1ms(10);//延时,防抖
if(S1==0)
dir=~dir;// 方向改变
}
}
*/
void main(void)
{ SCON=0x40;
TMOD = 0x20;
TH0 = 0x3c;
TL0 = 0xb0;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
SM0 = 0;
SM1 = 1;
REN = 1;
EA = 1;
ES = 1;
RI = 0;
TI =0;
ena=0 ;//高电平使能,初始化为低电平。
delay(5) ;//使能信号要至少要早于方向信号5us建立
dir=1 ;//初始化转动方向
delay(5) ; //因为方向信号要至少要早于脉冲信号5us建立
v=4 ; //速度初始化
P1=0xFF; // P1口置1,为写入端口
while(1)
{
if(RI==1)
{
dat=SBUF; //串口通信接受收据
RI=0;
}
if (dat=='a') //开关
{ena=0;pul=0;}
else if (dat=='b')
ena=1;
else if(dat=='c')//方向
{ena=1;dir=0;}
else if(dat=='d')
{ena=1;dir=1;}
if(ena==1)///电机打开才能进行加减速
{
if(dat=='0') //速度调节,dat从0~9,速度依次增大。
v=8;
else if(dat=='1')
v=7;
else if(dat=='2')
v=6;
else if(dat=='3')
v=5;
else if(dat=='4')
v=4;
else if(dat=='5')
v=3;
else if(dat=='6')
v=2;
else if(dat=='7')
v=1;
else if(dat=='8')
v=0;
}
x=sudu[v];
// keyscan();
// delay(5) ; //因为方向信号要至少要早于脉冲信号5us建立
if (lp0==1||lp1==1)
{ flag=1;
//dir=~dir;
}
if (flag==0)
{pul=0; //pul输出低电平
delay_40us(x); //周期的1/2时间
pul=1; //pul 输出高电平
delay_40us(x); //
cd();
}
else
{
flag=0;
dd() ;
dir=~dir;
for(k=0;k<5000;k++)
{pul=0; //pul输出低电平
delay_40us(x); //周期的1/2时间
pul=1; //pul 输出高电平
delay_40us(x);
if(dir==0)
sent_char('x');
else
sent_char('y');
}
}
}
}
0 0
- 电机控制程序
- 步进电机控制程序
- 9.7 电机控制程序基础
- 9.8 实用的电机控制程序
- 电机
- STM32串口采样与仪表步进电机控制程序(主程序与串口程序,需用正点原子定时器中断实验程序模板)
- 按键控制程序
- 电梯控制程序
- 控制程序流
- 控制程序流
- 控制程序流程
- 控制程序流
- 控制程序流程
- FIFO控制程序
- 控制程序流程
- 步进电机
- 步进电机
- 伺服电机
- Linux下maven开发MapReduce
- QML笔记整理——QtQuick数据模型和视图
- 全志行车记录仪里面FireEyepublic.apk反编译的分析(六)——时间水印分析
- Ubuntu 卡在登陆界面循环登陆解决
- BZOJ 2555 SubString 后缀自动机
- 电机控制程序
- 冰箱的存放方法和除异味贴士
- Mysql几种索引类型的区别及适用情况
- 【android】从源码分析调用ViewPager的notifyDataSetChanged无刷新的问题及解决方法
- <jsp:include>和<%@include file=""%>的区别
- 继电保护装置规约104规约解析
- 基于RGB-D数据的人体检测(People detection in RGB-D data)
- Objective-C语法之KVC使用
- uva699The Falling Leaves 入门经典II 第六章数据结构基础 例题6-10