资讯详情

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

最近课程设计有限,只能玩超声播测距报警和舵机继电器。具体代码输入。 #include<reg51.h> #include<intrins.h> #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((IRIN0)&&(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 ;   }    }    } 

}

标签: tr50继电器

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

锐单商城 - 一站式电子元器件采购平台