51超声波测距报警加舵机和继电器
时间:2022-10-15 14:30:00
最近课程设计有限,只能玩超声播测距报警和舵机继电器。具体代码输入。
#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((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 ; } } }
}