-
超声波的Echa接口P10,Trig口接P11.舵机信号线接入P12
-
接入振动传感器P蜂鸣器的接入P14。
-
按下按钮或检测振动,或超声波测量距离小于5cm是的,舵机旋转180度,2度s然后恢复。此时蜂鸣器响2s。
-
使用舵机SG90.超声波模块使用HC-SR04.有源蜂鸣器采用低电平触发,振动传感器为SW-1801P
#include <STC89C5xRC.H> #include "intrins.h" sbit echa=P1^0; sbit trig=P1^1; sbit pwm=P1^2; sbit vibrate=P1^3; sbit been=P1^4; sbit keyOne=P2^1; int count_f=1; unsigned int time; unsigned int distance; int count_1; int SGTemp=0; /** *函数名称:Delay2000ms *函数功能:延迟2s,用于后续舵机和蜂鸣器2s的操作 *备 注: */ void Delay2000ms() //@11.0592MHz {
unsigned char i, j, k; _nop_(); i = 15; j = 2; k = 235; do {
do {
while (--k); } while (--j); } while (--i); } /** *函数名称:Delay10ms *函数功能:延迟10ms,用于按键抖动 *备 注: */ void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 18;
j = 235;
do
{
while (--j);
} while (--i);
}
/** *函数名称:Delay10us *函数功能:延时10us,用于后续的启动超声波模块 *备 注: */
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
/** *函数名称:Timer0Init *函数功能:中断零的初始化,用于舵机 *备 注: */
void Timer0Init(void) //500微秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x33; //设置定时初始值
TH0 = 0xFE; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
}
/** *函数名称:timer0Service *函数功能:中断0的服务函数,用于舵机的pwm的调整 *备 注: */
void timer0Service() interrupt 1
{
TL0 = 0x33; //设置定时初始值
TH0 = 0xFE; //设置定时初始值
count_1++;
if(count_1<=count_f)
{
pwm=1;
}
else
{
pwm=0;
}
if(count_1>40)
{
count_1=0;
}
}
/** *函数名称:Timer1Init *函数功能:中断1的初始化 *备 注:选择16位,12T */
void Timer1Init(void) //100微秒@11.0592MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10;
TL1 = 0x00; //设置定时初始值
TH1 = 0x00; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 0; //定时器1开始计时
ET1=1;
EA=1;
}
/** *函数名称:startHC *函数功能:启动超声波模块 *备 注: */
void startHC()
{
trig=0;
trig=1;
Delay10us();
trig=0;
}
/** *函数名称:getDistance *函数功能:通过超声波模块获得距离 *备 注: */
void getDistance()
{
startHC();
while(echa==0);
TR1=1;
while(echa==1);
TR1=0;
if(TF1==0)
{
time=TH1;
time=(time<<8)|TL1;
time=time*1.085;
distance=time*0.0017;
}
else
{
TF1=0;
distance=999;
}
TH1=TL1=0x00;
}
/** *函数名称:keyBoard *函数功能:按键模块,当检测到按键1按下时,触发一次舵机的旋转 *备 注: */
void keyBoard()
{
if(keyOne==0)
{
Delay10ms();
if(keyOne==0)
{
SGTemp=1;
}
while(!keyOne);
}
}
/** *函数名称:distanceWork *函数功能:当距离小于5cm时,触发一次舵机的旋转 *备 注: */
void distanceWork()
{
if(distance<=5)
{
SGTemp=1;
}
}
/** *函数名称:vibrateWork *函数功能:当检测到振动的时候,触发一次舵机的旋转 *备 注: */
void vibrateWork()
{
if(vibrate==0)
{
SGTemp=1;
}
}
/** *函数名称:steeringWork *函数功能:舵机旋转模块,当受到触发的时候,旋转180度,并且蜂鸣器打开,两秒后复位 *备 注: */
void steeringWork()
{
if(SGTemp==1)
{
been=0;
SGTemp=0;
count_f=5;
Delay2000ms();
been=1;
}
if(SGTemp==0)
{
count_f=1;
}
}
/** *函数名称:main *函数功能:主函数 *备 注: */
void main()
{
Timer1Init();
Timer0Init();
while(1)
{
keyBoard();
getDistance();
steeringWork();
vibrateWork();
distanceWork();
}
}