运行代码如下:
#include "reg52.h"
sbit Trig=P2^2;
sbit Echo=P2^3;
sbit sg90=P0^0;
char jd=0;
int cnt;
void Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
void Time0Init() //用于计时超声波的时间
{
TMOD &=0XF0; //置位
TMOD |=0X01; //清零 配置寄存器模式:定时器T0,工作方式一
TH0=0;
TL0=0;
TF0=0; //当爆表的时候,硬件会修改bit5(TF0)位上面的数据
TR0=0;
}
void startSignal()
{
//怎么让它发送波
//Trig,给Trig端口至少10us的高电平
Trig=0;
Trig=1;
Delay10us();
Trig=0;
}
void Time1Init() //0.5ms SG90舵机占空比
{
TMOD&=0X0F; //置位
TMOD|=0X10; //清零 配置寄存器模式:定时器T1,工作方式一
TH1=0xFE; //配置高八位
TL1=0X33; //配置低八位
TF1=0; //中断溢出标志位
TR1 =1; //定时器T1开启标志
ET1=1; //开启定时器T1中断允许
EA=1;//开启总中断
}
void Time1Handle() interrupt 3
{
cnt++; // 统计爆表的次数
TH1=0xFE; //配置高八位
TL1=0X33; //配置低八位
if(cnt<jd) //0.5ms 以内
sg90=1;
else sg90=0;
if(cnt==40) //20MS 内
{
sg90=1;
cnt=0;
}
}
double Get_distance()
{
double time,dis;
startSignal();
while(Echo==0);
TR0=1;
while(Echo==1);
TR0=0;
time=(TH0 * 256+TL0)*1.085; //us
dis=time*0.017; //340m/s ×100×10的-6方/2
TH0=0;
TL0=0;
return dis;
}
void main()
{
Time0Init();//超声波测距时间测算
Time1Init() ;//舵机时间定时
while(1)
{
if(Get_distance()<10)
{
jd=3; //转90度
Delay300ms();
}
else
{
jd=1; //转0度
Delay300ms();
}
}
}
以下为实物连接图:
## 实物演示效果如下:
智能感应开盖垃圾桶