通过超声波感应,使舵机转向,(在此本人有个想法,可以通过舵机控制自来水开关。即间接的做成了一个小的智能设备)
材料:
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;
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』