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

📄 bikenew3.c

📁 此程序主要应用在电动车报警防盗和系统语音提示功能方面
💻 C
字号:
#include<STC12C5410AD.h>
#define uchar unsigned char
#define uint unsigned int
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_3=P1^3;   
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_3=P2^3; 
sbit P2_2=P2^2;
sbit P2_4=P2^4;
sbit P2_5=P2^5;  
sbit P2_6=P2^6;
sbit P2_7=P2^7;
sbit P3_0=P3^0; 
sbit P3_1=P3^1; 
sbit P3_5=P3^5; 
sbit P3_4=P3^4; 
sbit P3_7=P3^7;
bit idata low_flag1=0,low_flag2=0,load_flag1=0,load_flag2=0,speed_flag1=0,
          speed_flag2=0,on_flag1,on_flag2,off_flag1,off_flag2,on_end,cflag,
          off_end=1,start_flag=1,stop_flag,turn_flag1,turn_flag2,warn_set,set_flag1,
		  set_flag2,del_flag1,del_flag2,warn_flag1,warn_flag2,search_flag1, search_flag2,
		  jdq_flag,delay_flag1,delay_flag2,duo_flag1,duo_flag2,interval_flag1, jiange_flag,
          interval_flag2,fs_flag1,fs_flag2,duan_flag=1,chang_flag,jiao_flag1=1,jg_flag,
		  jiao_flag3=1,jiao_flag4=1,jiao_flag5=1,forbit_flag1,forbit_flag2,force_flag,
          tenms_flag,add_flag,msten_flag=1,close_flag=0;
		 
uchar ms_time=0,pluscount=0,ADresult[3],vb_ref,speed_ref,on_rate,speedcount,turn_time,
      c[10],k,low_warn,speed_warn,forbit_time1,forbit_time2,f[17];
uint speed_time=0,low_time=0,load_time=0,on_time=0,off_time=0,set_time,del_time,warn_time,
      search_time,delay_time,interval_time1,interval_time2,duo_time;

void ADconvert()       //ADresult[0]存放Key_turn信号电压值,
{           
 
              
    ADC_CONTR=0xc0;
     ADC_CONTR=ADC_CONTR|0x08;        //开A/D转换
     while(!(ADC_CONTR&0x10));    //等待A/D转换结束
     ADC_CONTR=ADC_CONTR&0xc7;      //清中断标志位
     ADresult[0]=ADC_DATA;    //取8位精度
     ADC_DATA=0;
    ADC_CONTR=0Xc5;
     ADC_CONTR=ADC_CONTR|0x08;        //开A/D转换
     while(!(ADC_CONTR&0x10));    //等待A/D转换结束
     ADC_CONTR=ADC_CONTR&0xc7;      //清中断标志位
     ADresult[2]=ADC_DATA;    //取8位精度
     ADC_DATA=0;

}
void delay(uint x)
 {   uint i;
 while(x--)
{for(i=0;i<600;i++)           //软件延时大约1ms
 {;}              
 }
 }
void close_pwm()
{TR0=0;
 CR=0;
 k=0;
 set_time=0;
 del_time=0;
 warn_time=0;
 search_time=0;
 jiao_flag1=1;
 jiao_flag3=1;
 jiao_flag4=1;
 jiao_flag5=1;
 close_flag=0;
 jg_flag=0;
 }
void start_pwm(uint i,uchar n)
{ 
  
  if(n==1)
  {if(jiao_flag1)
  {jiao_flag3=0;jiao_flag4=0;jiao_flag5=0;
  f[0]=230;f[1]=231;f[2]=232;f[3]=233;f[4]=234;f[5]=235;f[6]=236;
  f[7]=237;f[8]=238;f[9]=239;f[10]=240;f[11]=241;f[12]=242;f[13]=243;
  if(i<15||i>=27&&i<=40)
  {if(tenms_flag)
    {TR0=1;
   CR=1;
   TH0=f[k];
   TL0=f[k];
   k++;
   if(k==14)
   k=0;
  tenms_flag=0;}
}
else
  {TR0=0;
   CR=0;
   k=0;}
 }
}
    

 
  else if(n==2)
  {jiao_flag1=0;jiao_flag3=0;jiao_flag4=0;jiao_flag5=0;
  f[0]=226;f[1]=227;f[2]=228;f[3]=229;f[4]=230;f[5]=231;f[6]=232;
  f[7]=233;f[8]=234;f[9]=235;f[10]=236;f[11]=237;f[12]=238;f[13]=239;f[14]=240;
  if(i<=15)
  {if(tenms_flag)
    {TR0=1;
      CR=1;
  TH0=f[k];
   TL0=f[k];
   k++;
   tenms_flag=0;}
   

    }
	else 
	 {TR0=0;
      CR=0;
	  k=0;}}

  else if(n==3)
  {if(jiao_flag3)
   {jiao_flag1=0;jiao_flag4=0;jiao_flag5=0;close_flag=1;
    if(i<204)
	  { f[0]=209;f[1]=207;f[2]=204;f[3]=203;f[4]=201;f[5]=199;f[6]=197;
        f[7]=194;f[8]=191;f[9]=188;f[10]=184;f[11]=181;f[12]=178;f[13]=174;f[14]=170;
		f[15]=166;f[16]=162;
		TR0=1;
	    CR=1;
	    if(msten_flag)
		  {TH0=f[k];
           TL0=f[k];
		   k++;
		   if(k==17)
		   k=0;
		   msten_flag=0;}}
	 else if(i>=250&&i<650)
	        {TR0=1;
			 CR=1;
			 if(i==250||i==450)
			   {TH0=129;
			    TL0=129;}
			else if(i==350||i==550)
			    {TH0=1;
				 TL0=1;}}
	 else if(i>=680&&i<984)
	        {f[0]=227;f[1]=228;f[2]=229;f[3]=230;f[4]=231;f[5]=232;f[6]=233;f[7]=234;f[8]=235;f[9]=236;
             TR0=1;
	         CR=1;
			 if(i%2==0)
			   {if(msten_flag)
			      {TH0=f[k];
				   TL0=f[k];
				   if(k==0)
				   add_flag=1;
				   if(add_flag)
				   k++;
				   if(k==10)
				     {add_flag=0;
					  k=9;}
				   if(add_flag==0)
				      k--;
				   msten_flag=0;}}}
	   else 
	       {TR0=0;
		    CR=0;
			k=0;}
    
    }}
  
	
 else if(n==4)
  {if(jiao_flag4)
   {jiao_flag1=0;jiao_flag3=0;jiao_flag5=0;close_flag=1;
        f[0]=209;f[1]=207;f[2]=204;f[3]=203;f[4]=201;f[5]=199;f[6]=197;
        f[7]=194;f[8]=191;f[9]=188;f[10]=184;f[11]=181;f[12]=178;f[13]=174;f[14]=170;
		f[15]=166;f[16]=162;
		TR0=1;
	    CR=1;
	    if(tenms_flag)
		  {TH0=f[k];
           TL0=f[k];
		   if(k==0)
		   add_flag=1;
		   if(add_flag)
		   k++;
		   if(k==17)
		    {add_flag=0;
			 k=16;}
			if(add_flag==0)
			  k--;
		   tenms_flag=0;}}}
   
 

  else if(n==5)
  {if(jiao_flag5)
  {jiao_flag1=0;jiao_flag3=0;jiao_flag4=0;
  f[0]=230;f[1]=231;f[2]=232;f[3]=233;f[4]=234;f[5]=235;f[6]=236;
  f[7]=237;f[8]=238;f[9]=239;f[10]=240;f[11]=241;f[12]=242;f[13]=243;
  if(i<28||i>=78&&i<105||i>=155&&i<182||i>=232&&i<259)
  {if(tenms_flag)
  {TR0=1;
   CR=1;
   TH0=f[k];
   TL0=f[k];
   if(k==0)
   add_flag=1;
   if(add_flag)
   k++;
   if(k==14)
   {add_flag=0;
    k=13;}
	if(add_flag==0)
	k--;
	tenms_flag=0;}


	 }
else 
    {TR0=0;
     CR=0;
	 k=0;}

}
}
  
   
}

 void voice_time()
 {   if(set_flag1)
     start_pwm(set_time,1);
	 if(set_flag2)
	 {
      set_flag2=0;
      close_pwm();}                      //报警设置提示音每次响2s
	
	 if(del_flag1)
	 {if(close_flag==1)
	  {TR0=0;
	   CR=0;
	   close_flag=0;
	   k=0;}
	 warn_flag1=0;
	  warn_time=0;
	  search_flag1=0;
	  search_time=0;
	  duan_flag=1;
	 start_pwm(del_time,2);
	  
      if(force_flag==0)
        P2_7=1;}
	 if(del_flag2)
	 {set_flag2=0;
	  search_flag2=0;
	  del_flag2=0;
	  close_pwm();}                      //报警解除提示音响每次2s
    
	 if(warn_flag1)
	 {duan_flag=0;
	 start_pwm(warn_time,3);
	   P2_7=0;
	   P1_1=0;}
	 if(warn_flag2)
	 { msten_flag=1;
	  warn_flag2=0;
	  close_pwm();
	  interval_flag1=1;
	  interval_time1=0;
      interval_time2=0;
	  if(force_flag==0)
	  P2_7=1;
	  P1_1=1;}                       //车辆振动时报警提示音每次响8s          

	 if(search_flag1)
	 start_pwm(search_time,4);
	 if(search_flag2)
	 {
	  search_flag2=0;
	  close_pwm();}                       //寻车提示音每次响10s

	  if(duo_flag1)
	  {start_pwm(duo_time,5);
	   }
	  if(duo_flag2)
	  {duan_flag=0;
	  duo_flag2=0;
	  close_pwm();
	  delay_flag1=1;
	  delay_time=0;
      }   


 }
 
 
 void scan() 
 {if(P2_4==1)
 {warn_set=1;
  set_flag1=1;
 }                                       //报警设置提示音
 
  if(P3_5==1)
  {warn_set=0;
   del_flag1=1;
   P1_1=1;
   
  }                                      //报警解除提示音
  
  if(P2_5==1)                             //寻车提示音
   search_flag1=1;

  if(P2_4==1&&P3_4==1)
  { warn_set=0;
  force_flag=0;
    P2_7=1;
   set_flag1=0;
   set_time=0;
   close_pwm();

    
 } 
  if(P2_4==1&&P2_5==1)
    {warn_set=0;
	 P2_7=0;
	 force_flag=1;
	 search_flag1=0;
	 search_time=0;
	 set_flag1=0;
	 set_time=0;
	 close_pwm();
	 }}
 void judgement()
   {if(ADresult[0]<=25)            //首先判断电动车有没有转弯
     {if(speedcount>=speed_ref)    //如果检测到超速     
       {speed_flag1=1;
         if(speed_flag2)
           {if(speed_warn)
		 {P3_0=1;                //触发TG4,播放欠压语音     
	      speed_flag1=0;
	      speed_flag2=0;
          delay(10);
          P3_0=0;
           speed_warn--;}}}
    else 
	{speed_flag1=0;
     speed_time=0;
	 speed_warn=3;}
	
     if(P2_6==0)      //检测到电压小于下限值
       {low_flag1=1;
        if(low_flag2)             //延时30s之后播放提示音
         { if(low_warn)
	       {
           P1_7=1;                //触发TG2,播放提示音
	       low_flag1=0;
	       low_flag2=0;
           delay(10);
           P1_7=0;
          low_warn--; }}}
        else 
	    {low_flag1=0;         //如果在这30s之内电压恢复正常范围则停止计时
             low_time=0;
	     low_warn=3;}
	
	    if(P3_1==0)              //如果检测到电动车超负载,等待10s播放提示音
          {load_flag1=1;
           if(load_flag2)
	     {P1_6=1;                        // 触发TG3
	      load_flag1=0;
	      load_flag2=0;
          delay(10);
          P1_6=0;}}
         else 
	     {load_flag1=0;                     
          load_time=0;}
	
	
	/*	if(delay_flag1)
		 {if(warn_flag1)
		   fs_flag1=1;
		   else fs_flag1=0;}*/
		 if(delay_flag2)
		   {delay_flag2=0;
           //if(fs_flag1==1)
		   duan_flag=1;
		   //else duan_flag=1;
		   }


		/*if(interval_flag1)
		 {if(warn_flag1)
		   fs_flag2=1;
		   else fs_flag2=0;}*/
		 if(interval_flag2)
		   {interval_flag2=0;
           // if(fs_flag2==0)
		   duan_flag=1;
		 // else duan_flag=1;
		   }
		if(warn_set)              //当车辆在结束8s报警后3s之内又有振动则连续响8s
		{
		if(jiange_flag)
		 {if(P1_4==1)
		 warn_flag1=1;}
		
		 if(delay_flag1)
		  {if(P1_4==1)
		   warn_flag1=1;}
		   
		  if(duan_flag)
	     {//chang_flag=0;
		                     //当车辆振动时
		  if(P1_4==1)                  //开启报警
		   //delay_flag1=1;
		    duo_flag1=1;
          
          
		        
		           
		                     }}
		
 }
     else                                   //当检测到电压大于0.6V时候,P1.0/ADC0 0.5秒钟强推挽输出高电平,
	{                                 //0.5s用做A/D口检测电压
	 
	 turn_flag1=1;
         if(turn_flag2)
           {P2_3=1;
            turn_flag1=0;
            turn_flag2=0;                  //触发TG5,播放转弯提示音
            delay(10);
            P2_3=0;}
	    if(off_end)
	     {on_flag1=1; 
	      if(on_flag2)
	      {P1M0=0x24;
           
	       P1_0=1;
		   on_flag1=0;
	       on_flag2=0;
	       on_end=1;
	       off_end=0;}}
		
	 if(on_end)
	  {off_flag1=1;
	   if(off_flag2)
	     {P1M0=0x25;
		  off_flag1=0;
	      off_flag2=0;
	      off_end=1;
	      on_end=0;}}
	                
                     }
                      } 
                      
  
 
 void count() interrupt 0 using 0    
 {pluscount++;}  
 
timer1() interrupt 3 using 3
 {
  TH1=(65536-10000)/256;
  TL1=(65536-10000)%256;                       //每10ms中断一次
  if(forbit_flag1)
  {
  if(++forbit_time1==100)
   {forbit_time1=0;
   forbit_flag1=0;
    warn_set=1;}}
if(forbit_flag2)
  {
  if(++forbit_time2==100)
   {forbit_time2=0;
   forbit_flag2=0;
    warn_set=1;}}
  if(interval_flag1)
  {if(++interval_time1==100)
   {jiange_flag=1;
   interval_time1=0;}
  if(++interval_time2==400)
  {jiange_flag=0;
  interval_flag1=0;
   interval_flag2=1;
   interval_time2=0;}}
  if(delay_flag1)
   {if(++delay_time==300)
    {delay_flag1=0;
	 delay_flag2=1;
	 delay_time=0;}}
  if(duo_flag1)
    {tenms_flag=1;
   if(duo_time++==300)
	 {duo_flag1=0;
	  duo_flag2=1;
	  duo_time=0;
      tenms_flag=0;}}
  if(set_flag1)
 {tenms_flag=1;
 if(set_time++==85)
 {tenms_flag=0;
  set_flag1=0;
  set_flag2=1;
  set_time=0;}}

 if(del_flag1)
 {tenms_flag=1;
 if(del_time++==50)
 {tenms_flag=0;
  del_flag1=0;
  del_flag2=1;
  del_time=0;}}

 if(warn_flag1)
 {msten_flag=1;
if(++warn_time==1000)
 {warn_flag1=0;
  warn_flag2=1;
  warn_time=0;}}

 if(search_flag1)
 {tenms_flag=1;
 if(++search_time==800)
 {tenms_flag=0;
 search_flag1=0;
  search_flag2=1;
  search_time=0;}}
 
 
 
 
 if(turn_flag1)
   {if(++turn_time==150)
      {turn_flag1=0;
       turn_flag2=1;
       turn_time=0;}}
  
  if(++ms_time==100)
    {EX0=0;
     speedcount=pluscount;
     ms_time=0;
     pluscount=0;
     EX0=1;}                   //每一秒钟去读取外部中断0累加的脉冲数
  if(on_flag1)
    {if(++on_time==49)
       {on_flag1=0;
        on_flag2=1;
        on_time=0;}}
  if(off_flag1)
     {if(++off_time==50)
        {off_flag1=0;
	 off_flag2=1;
         off_time=0;}}
 
  if(low_flag1)
    {if(++low_time==3000)         //延时30s
       {low_flag1=0;
	low_flag2=1;
	low_time=0;}}
  
  if(load_flag1)
    {if(++load_time==1000)
       {load_flag1=0;
	load_flag2=1;
        load_time=0;}}
  if(speed_flag1)
    {if(++speed_time==1000)
       {speed_flag1=0;
	speed_flag2=1;
	speed_time=0;}}
			 }

main()
{uchar i;
 low_warn=3;
 speed_warn=3;
P3_0=P1_6=P1_7=P2_0=P2_1=P2_3=0;
delay(200);
                         
P1_3=0;                        //语音芯片复位脚低电平有效        
P1M0=0X25;
P1M1=0X25;              //将P1.0、P1.2设置成开漏模式,用做A/D转换 

ADC_CONTR=0Xc0;         // 打开A/D转换电源,并设置转换方式为1
delay(1);               //初次打开A/D转换电源,需延时1ms,等内部模拟电源稳定后,
                        //再启动A/D转换
 
for(i=0;i<3;i++)
   {ADC_CONTR=0Xc2;
    ADC_CONTR=ADC_CONTR|0x08;       //开A/D转换
    while(!(ADC_CONTR&0x10)); //等待A/D转换结束
    ADC_CONTR=ADC_CONTR&0xc7;      //清中断标志位
    ADresult[1]=ADC_DATA;    //取8位精度
    ADC_DATA=0;}
for(i=0;i<3;i++)
{ADC_CONTR=0Xc5;
     ADC_CONTR=ADC_CONTR|0x08;        //开A/D转换
     while(!(ADC_CONTR&0x10));    //等待A/D转换结束
     ADC_CONTR=ADC_CONTR&0xc7;      //清中断标志位
     ADresult[2]=ADC_DATA;    //取8位精度
     ADC_DATA=0;}
 
 if(ADresult[1]>=205)            //判断车轮直径是16cm
   speed_ref=110; 
 else if(ADresult[1]>=154)       //判断VB电源值是18cm
   speed_ref=98;
  else if(ADresult[1]>=103)      //判断VB电源值是22cm
   speed_ref=80;
  else if(ADresult[1]>=52)       //判断VB电源值是24cm
     speed_ref=74; 

TMOD=0x12;                  //定时器1和计数器0的工作方式          
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;           //每10ms中断一次
//IP=0x06;
//IPH=0x0c;
AUXR=0x80;
EA=1;ET1=1;TR1=1;EX0=1;IT0=1;
                        //TO工作在IT高速模式下
CMOD=0x04;
CL=0x00;                
CH=0x00;
CCAP0L=128;
CCAP0H=128;
CCAPM0=0x42;


                 
WDT_CONTR=0X3c;   
           
while(1)
      {ADconvert();
        if(ADresult[2]>=128)           //一开锁播放提示音,只播放一次
        {if(start_flag)
           {
            P2_0=1;
            delay(10);
            P2_0=0;
            start_flag=0;
            stop_flag=1;}}
        else           //停车时播放语音提示,
           {if(stop_flag)
             {
              P2_1=1;
              delay(10);
              P2_1=0;
              stop_flag=0;
              start_flag=1;}}
          
				
              scan();
              judgement();
	          voice_time();
	         WDT_CONTR=0X3c;
				
				
               }
          }

⌨️ 快捷键说明

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