您的当前位置:首页正文

电机正反转,加减速控制程序

2020-03-23 来源:星星旅游
#include

#define uchar unsigned char

#define uint unsigned int

sbit PW1=P2^0 ;

sbit PW2=P2^1 ; //控制电机的两个输入

sbit accelerate=P2^2 ; //调速按键

sbit stop=P2^3 ; //停止按键

sbit left=P2^4 ; //左转按键

sbit right=P2^5 ; //右转按键

#define right_turn PW1=0;PW2=1 //顺时针转动

#define left_turn PW1=1;PW2=0 //逆向转动

#define end_turn PW1=1;PW2=1 //停转

uint t0=25000,t1=25000; //初始时占空比为50%

uint a=25000; // 设置定时器装载初值 25ms 设定频率为20Hz

uchar flag=1; //此标志用于选择不同的装载初值

uchar dflag; //左右转标志

uchar count; //用来标志速度档位

void keyscan(); //键盘扫描

void delay(uchar z);

void time_init(); //定时器的初始化

void adjust_speed(); //通过 调整占空比来调整速度

//**********************************//

void main()

{

time_init(); //定时器的初始化

while(1)

{

keyscan(); //不断扫描键盘程序,以便及时作出相应的响应

}

}

//*************************************//

void timer0() interrupt 1 using 0

{

if(flag)

{

flag=0;

end_turn;

a=t0; //t0的大小决定着低电平延续时间

TH0=(65536-a)/256;

TL0=(65536-a)%256; //重装载初值

}

else

{

flag=1; //这个标志起到交替输出高低电平的作用

if(dflag==0)

{

right_turn; //右转

}

else

{

left_turn; //左转

}

a=t1; //t1的大小决定着高电平延续时间

TH0=(65536-a)/256;

TL0=(65536-a)%256; //重装载初值

}

}

void time_init()

{

TMOD=0x01; //工作方式寄存器 软件起动定时器 定时器功能 方式1 定时器0

TH0=(65536-a)/256;

TL0=(65536-a)%256; //装载初值

ET0=1; //开启定时器中断使能

EA=1; // 开启总中断

TR0=0;

}

//****************************************//

void delay(uchar z) //在12M下延时z毫秒

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

//******************************//

void keyscan()

{

if(stop==0)

{

TR0=0; //关闭定时器0 即可停止转动

end_turn;

}

if(left==0)

{

TR0=1;

dflag=1; }

if(right==0)

{

TR0=1;

dflag=0; }

//转向标志置位则左转

//转向标志复位则右转

if(accelerate==0)

{

delay(5) ; //延时消抖

if(accelerate==0)

{

while(accelerate==0) ; //等待松手

count++;

if(count==1)

{

t0=20000;

t1=30000; //占空比为百分之60

}

if(count==2)

{

t0=15000;

t1=35000; //占空比为百分之70

}

if(count==3)

{

t0=10000;

t1=40000; }

if(count==4)

{

t0=5000;

t1=45000; //占空比为百分之80

//占空比为百分之90

}

if(count==5)

{

count=0;

}

}

}

}

因篇幅问题不能全部显示,请点此查看更多更全内容