#include <reg52.H> //器件配置文件
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit TX1 =P1^0;
sbit EC1 =P1^1;
sbit TX2 =P1^2;
sbit EC2 =P1^3;
unsigned int time1=0,time2=0;
unsigned long S1,S2;
bit flag1 =0;
bit flag2 =0;
bit fl =0;
sbit IN1=P0^0;
sbit IN2=P0^1;
sbit IN3=P0^2;
sbit IN4=P0^3;
sbit IN5=P0^4;
sbit IN6=P0^5;
sbit IN7=P0^6;
sbit IN8=P0^7;
sbit pwm=P2^5;//输出PWM信号 duoji
uint pwm_value=1500;//初值为1.5ms
uint value[]={1000,1500,2000,1500,1000};//
void delayms(unsigned int ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
void run(void)
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
IN5=1;
IN6=0;
IN7=1;
IN8=0;
}
//全速后退函数
void backrun(void)
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
IN5=0;
IN6=1;
IN7=0;
IN8=1;
}
//全速左转函数
void leftrun(void)
{
IN1=0;
IN2=1;
IN3=0;
IN4=0;
IN5=0;
IN6=0;
IN7=1;
IN8=0;
}
//全速右转函数
void rightrun(void)
{
IN1=0;
IN2=0;
IN3=0;
IN4=1;
IN5=1;
IN6=0;
IN7=0;
IN8=0;
}
void InitTimer(void)
{
TMOD=0x11;//开定时器0,1
TH0=0;//定时20MS,20MS为一个周期
TL0=0;
TH1=-1500/256;//定时1.5MS,这时舵机处于0度
TL1=-1500%256;
EA=1;//开总断
TR0=1;//开定时器0
ET0=1;
TR1=1;//开定时器1
ET1=1;
}
//电机停止转动函数
void stop(void)
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
IN5=0;
IN6=0;
IN7=0;
IN8=0;
}
/********************************************************/
void Conut1(void)
{
time1=TH0*256+TL0;
TH0=0;
TL0=0;
S1=(time1*1.7)/100; //算出来是CM
if((S1>=700)||flag1==1) //超出测量范围显示“-”
{
flag1=0;
}
else
{
}}
void Conut2(void)
{
time2=TH0*256+TL0;
TH0=0;
TL0=0;
S2=(time2*1.7)/100; //算出来是CM
if((S2>=700)||flag2==1) //超出测量范围显示“-”
{
flag2=0;
}
else
{
}}
/********************************************************/
void timer0(void) interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
if (fl==0)
{
flag1=1;
flag2=1;
}
else
{
pwm=1;
TH0=-20000/256;
TL0=-20000%256;
TR1=1;
}
//中断溢出标志
}
void timer1(void) interrupt 3//定时器1中断函数
{
pwm=0;
TH1=-pwm_value/256;
TL1=-pwm_value%256;
TR1=0;
}
void duoji()
{
uchar i;
for(i=0;i<5;i++)
{
pwm_value=value[i];//通过数组就可以改变舵机的转角度
delayms(500);
}
}
/********************************************************/
void StartModule1() //启动模块
{
TX1=1; //启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX1=0;
}
void StartModule2() //启动模块
{
TX2=1; //启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX2=0;
}
/********************************************************/
void chaosheng()
{
StartModule1();
while(!EC1); //当RX为零时等待
TR0=1; //开启计数
while(EC1); //当RX为1计数并等待
TR0=0; //关闭计数
Conut1();
StartModule2();
while(!EC2); //当RX为零时等待
TR0=1; //开启计数
while(EC2); //当RX为1计数并等待
TR0=0;
Conut2();
}
void main(void)
{
InitTimer();
pwm_value=1500;
while(1)
{
fl=0;
chaosheng();
if(S1==S2)
{
leftrun();
delayms(50);
}
else if(S2>S1)
{
run();
while(S1<=5)
{
fl=1;
duoji();
delayms(1000);
break;
}
fl=0;
break;
}
break;
}
}
#include <reg52.H> //器件配置文件
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit TX1 =P1^0;
sbit EC1 =P1^1;
sbit TX2 =P1^2;
sbit EC2 =P1^3;
unsigned int time1=0,time2=0;
unsigned long S1,S2;
bit flag1 =0;
bit flag2 =0;
bit fl =0;
sbit IN1=P0^0;
sbit IN2=P0^1;
sbit IN3=P0^2;
sbit IN4=P0^3;
sbit IN5=P0^4;
sbit IN6=P0^5;
sbit IN7=P0^6;
sbit IN8=P0^7;
sbit pwm=P2^5;//输出PWM信号 duoji
uint pwm_value=1500;//初值为1.5ms
uint value[]={1000,1500,2000,1500,1000};//
void delayms(unsigned int ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
void run(void)
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
IN5=1;
IN6=0;
IN7=1;
IN8=0;
}
//全速后退函数
void backrun(void)
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
IN5=0;
IN6=1;
IN7=0;
IN8=1;
}
//全速左转函数
void leftrun(void)
{
IN1=0;
IN2=1;
IN3=0;
IN4=0;
IN5=0;
IN6=0;
IN7=1;
IN8=0;
}
//全速右转函数
void rightrun(void)
{
IN1=0;
IN2=0;
IN3=0;
IN4=1;
IN5=1;
IN6=0;
IN7=0;
IN8=0;
}
void InitTimer(void)
{
TMOD=0x11;//开定时器0,1
TH0=0;//定时20MS,20MS为一个周期
TL0=0;
TH1=-1500/256;//定时1.5MS,这时舵机处于0度
TL1=-1500%256;
EA=1;//开总断
TR0=1;//开定时器0
ET0=1;
TR1=1;//开定时器1
ET1=1;
}
//电机停止转动函数
void stop(void)
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
IN5=0;
IN6=0;
IN7=0;
IN8=0;
}
/********************************************************/
void Conut1(void)
{
time1=TH0*256+TL0;
TH0=0;
TL0=0;
S1=(time1*1.7)/100; //算出来是CM
if((S1>=700)||flag1==1) //超出测量范围显示“-”
{
flag1=0;
}
else
{
}}
void Conut2(void)
{
time2=TH0*256+TL0;
TH0=0;
TL0=0;
S2=(time2*1.7)/100; //算出来是CM
if((S2>=700)||flag2==1) //超出测量范围显示“-”
{
flag2=0;
}
else
{
}}
/********************************************************/
void timer0(void) interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
if (fl==0)
{
flag1=1;
flag2=1;
}
else
{
pwm=1;
TH0=-20000/256;
TL0=-20000%256;
TR1=1;
}
//中断溢出标志
}
void timer1(void) interrupt 3//定时器1中断函数
{
pwm=0;
TH1=-pwm_value/256;
TL1=-pwm_value%256;
TR1=0;
}
void duoji()
{
uchar i;
for(i=0;i<5;i++)
{
pwm_value=value[i];//通过数组就可以改变舵机的转角度
delayms(500);
}
}
/********************************************************/
void StartModule1() //启动模块
{
TX1=1; //启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX1=0;
}
void StartModule2() //启动模块
{
TX2=1; //启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX2=0;
}
/********************************************************/
void chaosheng()
{
StartModule1();
while(!EC1); //当RX为零时等待
TR0=1; //开启计数
while(EC1); //当RX为1计数并等待
TR0=0; //关闭计数
Conut1();
StartModule2();
while(!EC2); //当RX为零时等待
TR0=1; //开启计数
while(EC2); //当RX为1计数并等待
TR0=0;
Conut2();
}
void main(void)
{
InitTimer();
pwm_value=1500;
while(1)
{
fl=0;
chaosheng();
if(S1==S2)
{
leftrun();
delayms(50);
}
else if(S2>S1)
{
run();
while(S1<=5)
{
fl=1;
duoji();
delayms(1000);
break;
}
fl=0;
break;
}
break;
}
}
此帖出自
小平头技术问答
这里面包含两个模块,pwm调速和超声波。每个模块单独测试都好好的,但是合在一起就不行了
一周热门 更多>