锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

51超声波测距报警加舵机和继电器

时间:2022-10-15 14:30:00 tr50继电器

最近课程设计有限,只能玩超声播测距报警和舵机继电器。具体代码输入。
#include
#include
#include"lcd.h"
sbit pwm = P0^7;
sbit Trig = P0^1;
sbit Echo = P0^0;
sbit beep=P1^5;
sbit dianji=P3^7;
sbit IRIN=P3^2;
typedef unsigned char u8;
typedef unsigned int u16;
unsigned char code ASCII[15] = {0、1、2、3、4、5、7、8、9.,,M’};
unsigned int PWM; //pwm占空比50%,可调占空比50%
unsigned int t = 0;
static unsigned char DisNum = 0; //显示指针
unsigned int time=0;
unsigned long S=0;
bit flag =0;
unsigned char disbuff[4] ={ 0、0、0、0、0、0;
u8 IrValue[6];
u8 T;

void delay(unsigned int v)
{
while(v–);
}

//初始化红外接收
void IrInit()
{
IT0=1;
EX0=1;
EA=1;
IRIN=1;
}

void Conut(void)
{
while(!Echo); //当RX为零时等待
TR0=1; //打开计数
while(Echo); //当RX计数并等待1
TR0=0; //关闭计数
delay(100000);
time=TH0*256 TL0;
TH0=0;
TL0=0;

 S=(time*1.7)/100;     //计算是的CM  if((S>=700)||flag==1) 超出测量范围显示-  {     flag=0;     DisplayOneChar(0, 1, ASCII[11]);   DisplayOneChar(1, 1, ASCII[10]); //显示点   DisplayOneChar(2, 1, ASCII[11]);   DisplayOneChar(3, 1, ASCII[11]);   DisplayOneChar(4, 1, ASCII[12]); //显示M  }  else  {   disbuff[0]=S00/100;   disbuff[1]=S000/10;   disbuff[2]=S00 ;   DisplayOneChar(0, 1, ASCII[disbuff[0]]);   DisplayOneChar(1, 1, ASCII[10]); //显示点   DisplayOneChar(2, 1, ASCII[disbuff[1]]);   DisplayOneChar(3, 1, ASCII[disbuff[2]]);   DisplayOneChar(4, 1, ASCII[12]); //显示M  } } 

void zd0() interrupt 1 //T0中断用于计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}

void StartModule() ///启动模块
{
Trig=1; ///启动一次模块
nop(); //10微秒
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
Trig=0;
}

void delayms(unsigned int ms)
{
unsigned char i=100,j;
for(;ms;ms–)
{
while(–i)
{
j=10;
while(–j);
}
}
}
void Timer1Init()
{
TMOD|=0X10.//选择定时器1模式,只使用工作模式1TR1打开启动。

TH1=0XFC; ///给定时器赋初值,定时1ms TL1=0X18;  ET1=1.//打开定时器1中断允许 EA=1;//打开总中断 TR1=1;///打开定时器    

}

void main(void)
{
Timer1Init();
IrInit();
TMOD|=0x01; //设T0为方式1,GATE=1;
TH0=0;
TL0=0;
ET0=1; //允许T0中断
EA=1; //打开总中断
LcdInit();
while(1)
{ StartModule() ;
Conut(); //计算
}
}
void Timer1() interrupt 3
{
TH1 = 0XFc; ///重新安装初始值
TL1 = 0X18;
t ;
if(t >= 20) //PWM周期为20ms
t = 0;
if(t < PWM)
pwm = 1;
else if(t >= PWM)
pwm = 0;
if(S>32)
{
beep=1;PWM=2;//dianji=1;
}
else
{
beep=0;PWM=1;//dianji=0;
}
if(IrValue[2]==0x40)
{
dianji=0;
}
if(IrValue[2]==0x43)
{
dianji=1;
}
}

void Readlr() interrupt 0
{
u8 j,k;
u16 err;
T=0;
delay(700); //7ms
if(IRIN0)
{
err=1000;
while((IRIN
0)&&(err>0))
{
delay(1);
err–;
}

 if(IRIN==1)  {   err=500;   while((IRIN==1)&&(err>0))   {    delay(1);    err--;   }      for(k=0;k<4;k  )   {    for(j=0;j<8;j  )    {     err=60;     while((IRIN==0)&&(err>0))     {      delay(1);      err--;     }      err=500;     while((IRIN==1)&&(err>0))     {      delay(10);      T  ;      err--;      if(T>30)      {       return ;      }     }     IrValue[k]>>=1;     if(T>8)     {      IrValue[k]|=0x80;     }     T=0;    }   }    if(IrValue[2]!=~IrValue[3])   {    return ;   }    }    } 

}

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章