基于单片机防酒后驾驶控制系统设计程序及PCB图.docx
《基于单片机防酒后驾驶控制系统设计程序及PCB图.docx》由会员分享,可在线阅读,更多相关《基于单片机防酒后驾驶控制系统设计程序及PCB图.docx(10页珍藏版)》请在冰豆网上搜索。
基于单片机防酒后驾驶控制系统设计程序及PCB图
附录1:
实物图
附录二:
电路图及PCB图
附录三:
程序
/*饮酒驾车是指车辆驾驶人员血液中的酒精含量
大于或者等于20mg/100ml,小于80mg/100ml的驾驶行为。
醉酒驾车是指车辆驾驶人员血液中的酒精含量
大于或者等于80mg/100ml的驾驶行为*/
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
//数码管位选端接口
sbitw1=P2^4;
sbitw2=P2^5;
sbitw3=P2^6;
sbitw4=P2^7;
////////按键接口///////////////////
sbitk1=P3^2;
sbitk2=P3^3;
sbitk3=P3^4;
///////////////////////////////////////
sbitjdq=P2^1;//继电器接口
sbitbeep=P2^0;//蜂鸣器端口定义
//////////AD端口定义////////////////////
sbitAD_CS=P1^2;//ADC0832片选端
sbitCLK=P1^0;//ADC0832时钟端
sbitDIO=P1^1;//ADC0832数据输入输出
/////四位共阴数码管段选//////////////////////////////////////////////
uchartable[22]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x45,
0xDF,0xD7,0xCF,0xDA,0x1B,0xDC,0x9B,0x8B,//0-F,0-15
0x80,0x1a,0xce,0x00,0xff,0x4f};//'-',L,H,灭,全亮,n16-21
uchardat;//AD值
uintdat1;//显示数据
uintdat2=30;//比较浓度值
ucharCH;//通道变量
uchard1,d2,d3;//显示数据
ucharnum;//定时器计数变量
voiddelay(uinti)
{
ucharj;
for(i;i>0;i--)
for(j=110;j>0;j--);
}
voiddi()//蜂鸣器滴滴声
{
beep=0;delay(300);//开启蜂鸣器,延时300ms
beep=1;delay(300);//关闭蜂鸣器,延时300ms
}
voiddisplay(uintdate)//显示函数
{
d1=date/100;
d2=date%100/10;
d3=date%10;
w1=0;
P0=table[d1]|0x20;
delay(10);
w1=1;
P0=0x00;
delay
(1);
w2=0;
P0=table[d2];
delay(10);
w2=1;
P0=0x00;
delay
(1);
w3=0;
P0=table[d3];
delay(10);
w3=1;
P0=0x00;
delay
(1);
w4=0;
P0=table[0];
delay(10);
w4=1;
P0=0x00;
delay
(1);
}
voidkeyscan()//按键扫描函数
{
bitflag;
if(k1==0)//第一次按设定键,进入设定
{
delay(10);
if(k1==0)
{
flag=1;
}
while(!
k1);
}
if(flag==1)
{
TR0=1;//开启定时器
while(flag)
{
if(num<10)display(dat2);
if(num>=10)display(0);
if(k1==0)//开始设定的时候按设定键退出设定
{
delay(10);
if(k1==0)
{
flag=0;
}
while(!
k1);
}
if(k2==0)
{
delay(10);
if(k2==0)
{
dat2+=10;
if(dat2==410)
dat2=30;
}
while(!
k2);
}
if(k3==0)
{
delay(10);
if(k3==0)
{
dat2-=10;
if(dat2==20)
dat2=400;
}
while(!
k3);
}
}
TR0=0;//关闭定时器
}
}
/**************************************************
AD转换函数
***************************************************/
uintADC0832()
{
uchari=0;
ucharValue1=0;
ucharValue2=0;
AD_CS=1;//关掉AD;
CLK=0;
DIO=0;
AD_CS=0;//开启芯片
DIO=1;//开始位
CLK=0;
CLK=1;
DIO=1;//并分/单通首
CLK=0;
CLK=1;
DIO=0;//通首选择位
CLK=0;
CLK=1;
DIO=1;//空闲位
CLK=0;
CLK=1;
for(i=0;i<8;i++)//读第一次数据
{
CLK=1;
CLK=0;
if(DIO)
{
Value1|=0x80>>i;
}
}
for(i=0;i<8;i++)//读第二次数据
{
if(DIO)
{
Value2|=0x01<
}
CLK=1;
CLK=0;
}
AD_CS=1;//关掉芯片
if(Value1==Value2)//数据校难
{
returnValue1;
}
else
{
return0;
}
}
voidbao_jing()//报警处理函数
{
bitflag;
if(dat1>dat2)//大于设定值报警
{
TR0=1;//开启定时器
flag=1;
}
while(flag)
{
jdq=0;//开启继电器
if(num<10)beep=0;//蜂鸣器报警
if(num>10)beep=1;//停止
dat=ADC0832();//读出数据
dat1=dat*80/51;//数据转换
display(dat1);//显示浓度值
if(dat1{
jdq=1;//关闭继电器
flag=0;
beep=1;//关闭蜂鸣器
TR0=0;//关闭定时器
}
}
}
voidmain()
{
//定时器初始化
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=0;//关闭定时器
//上电封锁延时一分钟等待传感器加热稳定
di();//滴一声
delay(60000);
delay(60000);
delay(60000);
delay(60000);
di();//滴一声
di();//滴一声
while
(1)
{
dat=ADC0832();//读出数据
dat1=dat*80/51;//数据转换
display(dat1);//显示浓度值
keyscan();//按键扫描函数
bao_jing();//报警处理函数
}
}
voidT0_int()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==20)num=0;
}