基于51单片机的安全带(拉力,高度,紧急)
汽车安全带状态检测与控制系统研究
题目设计属性:①汽车安全带系统结构分析;②安全带长度测试系统设计;
③安全带空间测试系统设计;④计算机检测接口硬件设计;⑤状态检测与控制策略设计与实现。二、原理说明
汽车安全带传动结构如图1所示。图1a为安全带结构,图1b为紧急锁止卷收器结构
安全带由强度极大的合成纤维制成,带有自锁功能的卷收器,采用对驾乘人员的肩部和腰部同时实现约束的三点式设计。
系上安全带后,卷收器自动将其拉紧,当车辆万一出现紧急制动、正面碰撞或发生翻滚时,乘员会使安全带受到快速而猛烈的拉伸,此刻卷收器的自锁功能可在瞬间卡住安全带,使乘员紧贴座椅,避免摔出车外或碰撞受伤。在所有可能致命的车祸中,如果正确使用安全带,可以挽救约45%的生命。
控制装置有两种,一种是电子式控制装置,这种预紧式安全带通常与辅助安全气囊组合使用,一种是机械式控制装置,当传感器检测到汽车加速度的不正常变化时,控制装置就会激发预拉紧装置工作,这种预紧式安全带可以单独使用。预拉紧装置则有多种形式,常见的预拉紧装置是一种爆燃式的,由气体引发剂、气体发生剂、导管、活塞、绳索和驱动轮组成。
#include "reg51.h"
#include "lcd1602.h"
#include "ADC0832.h"
#define uchar unsigned char
#define uint unsigned int
sbit k1=P3^5;//按钮
sbit k2=P3^6;
sbit k3=P3^7;
sbit k4=P3^0;
sbit beep=P1^0;//蜂鸣器
sbit in=P1^1;//卡扣传感器
sbit out=P3^1;//紧急锁定
sbit motor1=P3^3;//直流电机
sbit motor2=P3^4;
sbit AA=P2^4;//步进电机
sbit BB=P2^5;
sbit CC=P2^6;
sbit DD=P2^7;
uchar time=0,sec=0;//系统变量
//步进电机,高度控制
uchar high=60;//高度
uchar motor_flag=60;
uchar flag=0;
//直流电机,长度控制
uint chang=500;//长度
uchar start=0;//拉紧收回开始
uchar press=0;//拉力
uchar first=0;//安全带拉出标志
uchar disp1[]="L:000cm 0.00N";
uchar disp2[]="H:000cm";
//主函数
void main()
{
init_1602();//初始化LCD
press=ADC(1);
press=0;
TMOD|=0X01;
TH0=0X3C;
TL0=0XB0;
ET0=1;//打开定时器0中断允许
//设置INT0
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//打开INT0的中断允许。
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
if(!in &&(first==0))//拉出安全带
{
first=1;
chang=800;
}
if(!k1)//拉紧收回
{
start=1;
}
//拉紧控制
if(start)
{
if(!in)//卡扣检测
{
if((press<50)&&(chang>550))//收紧
{
motor1=0;
motor2=1;
}
else
{
start=0;
motor1=1;
motor2=1;
}
}
else//收回控制
{
if(chang>500)
{
motor1=0;
motor2=1;
}
else
{
start=0;
first=0;
motor1=1;
motor2=1;
}
}
}
//报警,锁紧控制
if(press>100)
{
out=0;
beep=0;
}
if(!k4)//强制解锁
{
out=1;
beep=1;
}
}
}
//定时器中断
void Timer0() interrupt 1
{
if(time<8)//0.4s
time++;
else
{
time=0;
if(!k2)//升高
{
if(high<100)
high++;
}
if(!k3)//降低
{
if(high>30)
high--;
}
press=ADC(1);//测量拉力
}
if(sec<10)//0.5s
sec++;
else
{
sec=0;
//显示
disp1[2]=(chang/10)/100+0x30;
disp1[3]=(chang/10)%100/10+0x30;
disp1[4]=(chang/10)%10+0x30;
disp1[8] =(press/3)/100+0x30;
disp1[10]=(press/3)%100/10+0x30;
disp1[11]=(press/3)%10+0x30;
disp2[2]=high/100+0x30;
disp2[3]=high%100/10+0x30;
disp2[4]=high%10+0x30;
write_string(1,0,disp1);
write_string(2,0,disp2);
}
//高度控制
if(motor_flaghigh) //反转
{
switch(flag)
{
case 0:DD=1;break;
case 1:AA=0;break;
case 2:CC=1;break;
case 3:DD=0;break;
case 4:BB=1;break;
case 5:CC=0;break;
case 6:AA=1;break;
case 7:BB=0;
}
if(flag<7)//下一个状态
flag++;
else
{
flag=0;
motor_flag--;
}
}
TH0=0X3C;
TL0=0XB0;
}
void Int0() interrupt 0 //外部中断0的中断函数
{
chang--;
}