void main()
{
unsigned int time,distance;
TH=30; //上电初始值30
EX0=0; //关闭外部中断
IT0=1; //下降沿有效
EA=1; //打开中断系统总开关
TMOD=0x11; //定时器工作方式
TH0=0x3c;
TL0=0xb0; //定时器0赋初值50ms
TH1=0xff;
TL1=0x9c;
ET0=1; //T0中断允许
ET1=1;
TR0=1; //开启T0计时
servorTime=0;
Trig=0;
Echo=0;
while(1) //进入while循环
{
TH1=0;
TL1=0;
Trig=1;
Delay_us(5);
Trig=0;
while(Echo==0);
TR1=1;
while(Echo);
TR1=0;
time=(TH1)*256+(TL1);
distance=(int)(time*0.017); //计算路程 单位为cm
TH1=0xff;
TL1=0x9c;
read_wendu(); //读温度
keyscan(); //按键扫描
if(key_num==0) //判断状态,是否是设置状态
LcdDisplay(tvalue,0); //显示正常值
else
LcdDisplay(TH*100,1); //显示设置值
if(distance<30) //传感器有信号
{
relay_w=0;
if(distance<20) //如果距离小于20c
{
if(distance<10) //如果距离小于10c
{
control=15; //使舵机向正摆动
servorTime=0;
TR1=1;
delay(15);
//delay(200);
TR1=0;
// delay(20);
}
else
{
control=12; //使舵机向正摆动
servorTime=0;
TR1=1;
delay(15);
//delay(200);
TR1=0;
// delay(20);
}
}
else
{
control=9; //使舵机向正摆动
servorTime=0;
TR1=1;
delay(15);
//delay(200);
TR1=0;
//delay(20);
}
// relay_w=0; //加热继电器打开
flag_js_bj=1; //计时报警标志位置1
flag_js_gb=0; //计时关闭标志位清零
EX0=1; //打开外部中断
}
else //没有信号
{
control=5; //使舵机向右摆动
servorTime=0;
TR1=1;
delay(10);
TR1=0;
flag_js_gb=1; //计时关闭标志位值1
flag_js_bj=0; //计时报警标志位清零
}
}
void T0_time() interrupt 1 //T0函数
{
TH0=0x3c;
TL0=0xb0; //重新赋初值
m++; //每50ms加一次
if(m>=20) //加到20次就是1秒
{
m=0; //清零
if(flag_js_gb==1) //计时关闭标志位
{
sec_gb++; //关闭计时秒变量++
if(sec_gb>=3) //加到3秒
{
sec_gb=0; //清零
sec_bj=0;
flag_js_bj=0; //清零
flag_bj=0;
relay_w=1;
relay=1; //关闭两个继电器
EX0=0; //关闭外部中断
}
}
if(flag_js_bj==1) //计时报警标志位
{
sec_bj++; //报警计时秒变量++
if(sec_bj>=15) //加到60秒
{
sec_bj=0;
sec_gb=0; //两个变量都清零
flag_js_gb=0; //关闭标志位清零
flag_bj=1; //启动报警标志位
}
}
if(flag_bj==1) //报警标志位为1
{
BUZZ=!BUZZ; //蜂鸣器取反闪烁报警
}
else //没有进入报警
{
BUZZ=1; //关闭蜂鸣器
}
}
}
void T1_int(void) interrupt 3{ //产生舵机所需要的脉冲
TH1=0xff;
TL1=0x9c;
servorTime++;
if(servorTime<=control)
servorControl=1;
else
servorControl=0;
if(servorTime>=200)
servorTime=0;
}
|