⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 carprotecting.c

📁 对车内气体进行检测同时对发动机浸水进行检测。
💻 C
字号:
/*======================================================*题目:多功能汽车防护报警系统的研究与制作*作者:吕先明*修改日期:2008.5.4======================================================*/#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define ulong unsigned long#define T (65536-1000)//定时器定时时间控制/********74LS138控制端口*************/sbit bit0 =P1^0;sbit bit1 =P1^1;sbit bit2 =P1^2;/********继电器控制端口**************/sbit ji1  =P1^7;//电源继电器控制sbit ji2  =P1^6;//排气扇继电器控制/********ADC0809控制端口*************/sbit START=P2^0;sbit EOC  =P2^1;sbit OE   =P2^2;sbit ADDA =P2^3;sbit ADDB =P2^4;sbit ADDC =P2^5;sbit ALE  =P2^6; sbit shui =P1^5;//水面信号检测sbit key  =P2^7;sbit alarm=P1^4;uint  count=0;//时间片计数uint  alarm_count=0;ulong V;uchar DAT;uchar i=0;uchar pin1=0;uchar time_count=0;//水位信号检测次数uchar ad_contral_1=0;uchar ad_contral_2=0;uchar dis_contral=0;//时间、数据显示切换控制uchar key_contral=0;bit time_count_start=0;//电源子程序启动控制bit time_count_flag=1;//主程序检测水位信号控制bit ad_start=0;//AD转换启动控制bit ad_timer_stop=0;//AD转换延时启动计时控制bit pin2 =1;//排气扇控制bit flag1=0;bit flag2=0;bit flag3=0;bit flag4=0;bit flag5=0;code uchar table[10]={0xC0,0x0F9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//SEG共阳数码管代码code uchar timer_compare[6]={10,6,10,6,10,3};//秒,十秒,分,十分,时,十时位的进位比较data uchar dis_control_1[4]={0,0,0,0};//检测部分数码管显示位数值data uchar dis_control_2[6]={0,0,0,0,0,0};//时钟部分数码管显示位数值/*=========================================================*原型:void contral() interrupt 1 using 1*功能:时间片调度*说明:使用定时器0中断,时间片定时为1ms*参数:*返回:========================================================*/void contral() interrupt 1 using 1{ TL0=T%256; TH0=T/256; count++; switch(count%5) 	{ 	case 0: flag1=1;break;		case 1: if((count%501==0)&&(ad_start==1)) flag2=1;				break;	case 2: if((count%1002==0)&&(time_count_start==1)) flag3=1;				break;	case 3: flag4=1;break;	case 4: if(count%1004==0) flag5=1;				break;	} if(count==1005) count=0;}/*==============================================================*原型:void deal(uchar d)*功能:对AD转换所得数据进行处理,转换为0~5之间的十进制数,并把各位数据存入数组*说明:*参数:uchar d*返回:==============================================================*/void deal(uchar d){ uchar j; V =d*5; V *= 100; V /= 255;//V的高到低位依次为:整数位个位、小数十分位、百分位。 for(j=0;j<3;j++) 	{	 dis_control_1[j]=V%10;	 V=V/10;	}}/*===========================================================*原型:void ad0809()*功能:启动ADC0809,获取数据*说明:*参数:*返回:===========================================================*/void ad0809(){ ADDA=0; ADDB=0; ADDC=0; ALE=1;//模拟信号输入通道地址码锁存 START=1;//上升沿ADC0809复位 ;//空操作延时 ; START=0;//下降沿启动转换 while(EOC==0); OE=1;//数据输出允许 DAT=P0; ALE=0; OE=0; deal(DAT);//对数据进行处理}/*================================================================*原型:void display_time()*功能:用74LS138作偏选进行七段数码管显示时间*说明:*参数:*返回:================================================================*/void display_time(){ uchar a; a=dis_control_2[i];//获取显示位数值 P3=table[a];//获取相应代码 switch(i)	{	case 0: bit2=0; bit1=0; bit0=0; break;	case 1: bit2=0; bit1=0; bit0=1; break;	case 2: bit2=0; bit1=1; bit0=1; break;	case 3: bit2=1; bit1=0; bit0=0; break;	case 4: bit2=1; bit1=1; bit0=0; break;	case 5: bit2=1; bit1=1; bit0=1; break;	} i++; if(i>5){i=0;}}/*================================================================*原型:void display_data()*功能:用74LS138作偏选进行七段数码管显示传感器数据*说明:数码管从右到左,前三位为气体浓度数据。第5位显示水面信号检测次数*参数:*返回:================================================================*/void display_data(){ uchar a; a=dis_control_1[i];//获取显示位数值 P3=table[a];//获取相应代码 if(i==2)//||(i==5))	{	P3=P3&0x7f;//共阳显示加小数点	} switch(i)	{	case 0: bit2=0; bit1=0; bit0=0; break;	case 1: bit2=0; bit1=0; bit0=1; break;	case 2: bit2=0; bit1=1; bit0=0; break;						case 3: bit2=1; bit1=0; bit0=0; break;	} i++; if(i>3){i=0;}}/*============================================================*原型:void power()*功能:对水面信号进行检测并实现电源控制*说明:采用多次检测以防止误操作,每三秒检测一次,累加达5次时断       开总电源,若15秒内检测不足5次信号责计数值清零*参数:*返回:============================================================*/void power(){ if(pin1%3==0) 	{ 	if(shui==1)		{		time_count++;			dis_control_1[3]=time_count;		}	}  if(time_count==5) {ji1=1;} if((pin1>15)&&(time_count!=5))//15秒后如累加次数不足5次则计数值清零	{	time_count=0;	dis_control_1[3]=time_count;	pin1=0;	time_count_start=0;//关闭电源控制子程序	time_count_flag=1;//恢复在主程序中检测水面信号	} pin1++;}/*==========================================================*原型:void nongdu()*功能:根据气体浓度对排气扇进行控制并通过计数累加一分钟延迟       启动AD转换以及检测按键信号实现时间与数据显示的切换*说明:*参数:*返回:==========================================================*/void nongdu(){ if(DAT>0x99) pin2=0; if(DAT<0x4c) pin2=1; ji2=pin2; if(~pin2) 	{	alarm_count++;	if(alarm_count==100)//蜂鸣器间断响声控制		{		alarm=~alarm;		alarm_count=0;		}	} //ad_start=1; ad_contral_1++; if((ad_contral_1==200)&&(ad_timer_stop==0))  	{	ad_contral_2++;	ad_contral_1=0;	if(ad_contral_2==60)		{ 		ad_start=1;//启动AD转换		ad_contral_2=0;		ad_timer_stop=1;//停止计时		}	} switch(key_contral) 	{	case 0:if(key==0)				{				key_contral=1;//关闭按键0检测,启动对按键1检测				}			 break;	case 1:if(key==1)				{				dis_contral++;//时间与数据显示的切换控制				if(dis_contral>1) dis_contral=0;				key_contral=0;//关闭按键1检测,启动对按键0检测				}			 break;	}}/*===========================================================*原型:void timer()*功能:时钟计数*说明:*参数:*返回:===========================================================*/void timer(){uchar timer_i,flag0=0;    for(timer_i=0;(timer_i<6)&&(flag0==0);timer_i++)     {   dis_control_2[timer_i]++;         if(dis_control_2[timer_i]==timer_compare[timer_i])    	        dis_control_2[timer_i]=0;          //要进位				   		   else			     flag0=1;                            //不用进位         if((dis_control_2[4]==4)&&(dis_control_2[5]==2))				 {for(timer_i=0;timer_i<6;timer_i++) 				      dis_control_2[timer_i]=0;				  flag0=1;				 }     	  }}/*===========================================================*原型:void main(void)*功能:主程序*说明:*参数:*返回:===========================================================*/void main(void){ TMOD=0x01; TL0=T%256; TH0=T/256; EA=1;  TR0=1; ET0=1; START=0;//START初始化 ji1=0;//电源控制继电器导通 ji2=1;//排气扇控制继电器断开 alarm=1;//初始关闭蜂鸣器 for(;;)	{	if((shui==1)&&(time_count_flag==1))		{		time_count_flag=0;//停止在主程序中检测水面信号		time_count_start=1;//启动电源控制子程序				}	if(flag1==1)		{		switch(dis_contral)			{			case 0:display_time(); flag1=0;break;			case 1:display_data(); flag1=0;break;			}		}	if(flag2==1) {ad0809();  flag2=0;}	if(flag3==1) {power();   flag3=0;}	if(flag4==1) {nongdu();  flag4=0;}	if(flag5==1) {timer();   flag5=0;}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -