×
单片机 > 单片机程序设计 > 详情

利用单片机+超声波控制舵机转向的制作

发布时间:2023-08-07 发布时间:
|

通过超声波感应,使舵机转向,(在此本人有个想法,可以通过舵机控制自来水开关。即间接的做成了一个小的智能设备)


材料:
51单片机开发板
杜邦线
舵机+超声波
3.7V电池两个
束缚带
胶水
冰淇淋棒
程序为大家献上!
让大家在学习单片机时可以拥有一种成就感!

制作出来的实物图如下:

单片机源程序如下:

#include

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit Trig=P3^4; //控制端

sbit Echo=P3^5; //接收端

sbit led=P1^3;

sbit servorControl =P1^3; //舵机的控制引脚


uchar flag=0;

uchar control=5;

uchar servorTime=0;







unsigned char T0RH=0;

unsigned char T0RL=0;


void time_init()

{

EA=1;

TMOD=0x11;

TH0 = 0;

TL0 = 0;

}

///////////////////////////////////////

void delay(uchar time){ //延迟函数

uchar i;

for(;time>0;time--){

for(i=0;i<255;i++);

}

}


//初始化定时器

void Delay_us(unsigned char t)

{

while(--t);

} //大约延时t*2+5us 超声波模块用

//////////////////////////////////////


void timer0()interrupt 1

{

TH0 = 0;

TL0 = 0;

}

//中断程序 初始化赋值 重新计数 超声波模块用 计算时间

void main()

{

unsigned int time,distance;

EA=1;

ET0=1;

ET1=1;

TMOD=0x11;

TH1=0xff;

TL1=0x9c;

servorTime=0;

Trig=0;

Echo=0;

time_init();

while(1)

{


Trig=1;

Delay_us(5);

Trig=0;

while(Echo==0);

TR0=1;

while(Echo);

TR0=0;

time=TH0*256+TL0;

distance=(int)(time*0.017); //计算路程 单位为cm

TH0=0;

TL0=0;

if(distance<30) //如果距离小于30cm 蜂鸣器响

{

control=15; //使舵机向正摆动

servorTime=0;

TR1=1;

delay(200);

delay(200);

TR1=0;

}

else

{

control=5; //使舵机向右摆动

servorTime=0;

TR1=1;

delay(200);

delay(200);

TR1=0;

delay(200);

delay(200);

}

}

}

void T1_int(void) interrupt 3{ //产生舵机所需要的脉冲

TH1=0xff;

TL1= 0x9c;

servorTime++;

if(servorTime<=control)

servorControl=1;

else

servorControl=0;

if(servorTime>=200)

servorTime=0;

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计