📄 carprotecting.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 + -