#define uchar unsigned char
#define uint unsigned int
sbit PWM11 = P1^0 //motora
sbit PWM12 = P1^1
sbit PWM21 = P1^2 //motorb
sbit PWM22 = P1^3
sbit MC1 = P1^4 //motora enable
sbit MC2 = P1^5 //motorb enable
sbit LED = P1^6 //指示灯
sbit FMQ = P1^7 //蜂鸣器
sbit key_qt = P0^0 //motor2 引脚
sbit key_sph = P0^1 //升速键
sbit key_spl = P0^2 //降速键
sbit limita2 = P0^4 //电机负a限位
sbit limitb1 = P0^5 //电机正b限位
sbit limitb2 = P0^6 //电机负b限位
uchar keyval,cnt=0,cnt1=0,pwm=50,num
uchar m_mode=0 //电机运行模式,1-电机正向;2-电机b正反向;3=电机b反向;4-电机a反向;
bit flag=0 //延时时间到标志
uchar runflag=0 //电机运行标志
void delaynms(uint z)
{
uint i,j
for(i = zi >0i--)
for(j = 110j >0j--)
}
void keychk(void)
{
keyval=0xff
if(key_qt==0)
{
delaynms(5)//消抖
if(key_qt==0) //确定按键按下
{
while(key_qt==0)
keyval=1
}
}
if(!key_sph)
{
delaynms(5)//消抖
if(!key_sph) //确定按键按下
{
while(!key_sph)
keyval=2
}
}
if(!key_spl)
{
delaynms(5)//消抖
if(!key_spl) //确定按键按下
{
while(!key_spl)
keyval=3
}
}
}
void t0isr() interrupt 1
{
TH0=(65536-50000)/256
TL0=(65536-50000)%256
if(runflag==1) //正常运行
{
cnt1++
if(cnt1>=10){cnt1=0LED=~LED}
}
if(runflag==2) //限位延时
{
LED=1
cnt++
if(cnt>=10)
{
flag=1
cnt=0
}
}
}
void t1isr() interrupt 3
{
num++
if(num<pwm)
{
switch(m_mode)
{
case 1:PWM11=1PWM12=0break //a电机正转
case 2:PWM21=1PWM22=0break //b电机正转
case 3:PWM21=0PWM22=1break //b电机反转
case 4:PWM11=0PWM12=1break //a电机反转
default:break
}
}
else if(num>=pwm)
{
PWM11=0PWM12=0PWM21=0PWM22=0
}
if(num>=100)num=0
}
void main(void)
{
bit qt=0
TMOD=0x21
TH0=(65536-50000)/256
TL0=(65536-50000)%256
TH1=236 //改变该值调整PWM频率
TL1=236
TR0=1
TR1=1
ET1=1
ET0=1
EA=1
P1|=0xc0
flag=0
while(1)
{
keychk()
switch(keyval)
{
case 1: qt=~qt
if(qt)
{
runflag=1
switch(m_mode)
{
case 0: m_mode=1 //刚开始启动,置模式1
MC1=1
FMQ=0 //蜂鸣器响一下
delaynms(100)
FMQ=1
break
case 1:MC1=1break //电机a正转
case 2:MC2=1break //电机b正转
case 3:MC2=1break //电机b反转
case 4:MC1=1break //电机a反转
default:m_mode=0break
}
}
if(!qt)
{
MC1=0
MC2=0
LED=1
runflag=0
break
}
break
case 2:pwm+=5if(pwm>100)pwm=100break //升速5个单位
case 3:pwm-=5if(pwm<10)pwm=10break //降速5个单位
default:break
}
if(limita1==0 &&m_mode==1) //电机a正向限位
{
delaynms(1)
if(limita1==0)
{
MC1=0
runflag=2
flag=0
while(flag==0) //等待延时0.5S结束
m_mode=2
runflag=1
MC2=1
}
}
if(limitb1==0 &&m_mode==2) //电机b正向限位
{
delaynms(1)
if(limitb1==0)
{
MC2=0
runflag=2
flag=0
while(flag==0)
qt=0
m_mode=3
}
}
if(limitb2==0 &&m_mode==3) //电机b反向限位
{
delaynms(1)
if(limitb2==0)
{
MC2=0
runflag=2
flag=0
while(flag==0)
m_mode=4
runflag=1
MC1=1
}
}
if(limita2==0 &&m_mode==4) //电机a反向限位
{
delaynms(1)
if(limita2==0)
{
MC1=0
runflag=2
flag=0
while(flag==0)
flag=0
m_mode=0
runflag=0
qt=0
LED=1
}
}
}
}
#include <reg52.h> // 引用标准库的头文件#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//=================电机驱动=====================
sbitdianji_r = P1^0 //右边电机控制口,低电平转?
sbitdianji_l = P1^3 //左边电机控制口,低电平转
//=============循迹感应接口======================
sbitxjmk_r=P3^2// 右边hall模块检测口 INT0
sbitxjmk_l =P3^3// 左边hall模块检测口 INT1
voidcheck_righet()//右边时候检测到stop测试程序
voidcheck_left()//左边时候检测到stop测试程序
void delay_50us(uint t)
void delayms(uint Ms)
uchar r_count//右边传感器检测到的次数计数单元
uchar l_count
uint time
//***********************主程序******************************
main()
{
time=50 dianji_r=0//上电时右侧电机运行
dianji_l=0//上电时左侧电机运行EA=1
EX1=1
EX0=1
IT1=0
IT0=0
xjmk_r=1//置IO为1,准备读取数据
xjmk_l=1
_nop_()
r_count=0
l_count=0
while(1)
{
_nop_()
// check_righet()//调用右边hall检测传感器
// check_left()//
if(r_count>=1)
{
delayms(time)
dianji_r=0
dianji_l=0
r_count=0
_nop_()
}
if(l_count>=1)
{
delayms(time)
dianji_r=0
dianji_l=0
l_count=0
_nop_()
}
}
}
void init0int() interrupt 2
{
l_count=5
dianji_l=1
dianji_r=0
if(r_count>0)
{ EX0=0
delayms(20)
if(time>=20)time-=19
EX0=0
}
return
}
void init1int() interrupt 0
{
r_count=5
dianji_r=1 dianji_l=0
if(l_count>0)
{ EX1=0
delayms(20)
if(time>=20)time-=19
EX1=1}
return } //*******************************************************************************
//函数名称:
//功能:左边边时候检测到stop测试程序
voidcheck_left()
{
if(xjmk_l==0)//检测右边的传感器是否感应到stop
{ delay_50us(1)//延时,去除机械振动
_nop_() if(xjmk_l==0)//再次检测
{ delay_50us(1)//延时,去除机械振动
if(xjmk_l==0) {
l_count++
xjmk_l=1 }
}
}
} //******************************************************************************* //函数名称:
//功能:右边时候检测到stop测试程序
voidcheck_righet()
{
if(xjmk_r==0)//检测右边的传感器是否感应到stop {
delay_50us(1)//延时,去除机械振动
if(xjmk_r==0)//再次检测
{
delay_50us(1)//延时,去除机械振动 if(xjmk_r==0)
{
r_count++
xjmk_r=1
}
}
}
//*******************************************************************************
//函数名称:void delay_50US(unsigned int t)
//功能:延时50*t(us)
void delay_50us(uint t)
{
uchar j
for(t>0t--)
{
for(j=19j>0j--)
}
}
/*====================================================================
设定延时时间:x*1ms ====================================================================*/
void delayms(uint Ms)
{
uint i,TempCyc
for(i=0i<Msi++)
{
TempCyc =70
while(TempCyc--)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)