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

📄 初步成功.txt

📁 公交车语音系统压缩包里面包括了所有的代码甚至原理图!
💻 TXT
字号:
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char 
uchar  EOM_flag=1;
unsigned  int  second=0;
uchar  count=0;
uchar  snd_info[]={11,0,20};//17存放"到了,请上车的乘客往车厢内走,11存放"叮咚"
uchar  sndpre_info[]={12,0,13};//12存放"前方到站",13放"请要下车的乘客作好准备"
uchar  sndwarn_info=14;//14存放"特殊消息"
uchar  sndbegin_info=15;//欢迎起点
uchar  sndend_info=16;//欢迎终点
uchar  direct_flag=0;
uchar  count1,count2;
//*******************************************************//
                   /* 语音芯片的控制函数*/
//*******************************************************//
void delay2560(int t)
{while(t--);}
void set_CE(uchar level)   //PC0用于芯片使能,低有效
{
 if(level==1) PORTC|=0X01;
 else  PORTC&=~0X01;
}
void set_PD(uchar level)   //PC1用于录放停止和复位键
{
 if(level==1) PORTC|=0X02;
 else  PORTC&=~0X02;
}
void set_PR(uchar level)   //PC2低电平录音,高电平放音
{
 if(level==1) PORTC|=0X04;
 else  PORTC&=~0X04;
}
void set_A6(uchar level)  //选择M6模式
{
if(level)  PORTC|=0X08;
else  PORTC&=~0X08;
}
void set_A0(uchar level)  //选择M0模式
{
if(level)  PORTC|=0X10;
else  PORTC&=~0X10;
}

//*******************************************************//
                   /* 语音搜索*/
//*******************************************************//
void seek_duan(uchar s)
{
 set_PD(1);
 delay2560(20000);
 set_PD(0); //芯片复位
 set_PR(1); //放音模式
 set_A0(1);//M0模式
 while(s--)
  {
  set_CE(0);
  set_CE(1);
  do 
  NOP();
  while(EOM_flag);
  EOM_flag=1; 
  }
 set_A0(0);//M6模式
 
 }
//*******************************************************//
                   /* 语音播放*/
//*******************************************************//
 void play()
 {  
     set_CE(0);
     set_CE(1);
	 do 
	 NOP();
	 while(EOM_flag);
	 EOM_flag=1; 
 }
//*******************************************************//
                 /*录     音*/
//*******************************************************//		
void receive()
{ 
 set_PR(0);
 set_CE(1);
 set_CE(0);
 delay_ms(5);//开始录音
}
//*******************************************************//
                    /*报       站*/
//*******************************************************//
void inform(uchar m)
{
 uchar i;
 if(!direct_flag) 
  snd_info[1]=m;
else
 snd_info[1]=11-m;
 set_PD(1);
 delay2560(20000);
 set_PD(0); //芯片复位
 for(i=0;i<3;i++)
 {
  seek_duan(snd_info[i]);
  play();
 }
}
//*******************************************************//
               /* 预   报    站*/
//*******************************************************//
void pre_inform(uchar m)
{
 uchar i;
 if(!direct_flag) { sndpre_info[1]=m;}
 else  sndpre_info[1]=11-m;
 set_PD(1);
 delay2560(20000);
 set_PD(0); //芯片复位
 for(i=0;i<3;i++)
 {
  seek_duan(sndpre_info[i]);
  play();
 }
} 
 

 
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
 TCCR1A=0X00;
 TCCR1B=0X05;
 TCNT1H=0XFb;
 TCNT1L=0Xbe;
 second=second+1;
 if(second==60)
  { second=0;}
 }
#pragma interrupt_handler check_EOM:3 
 void check_EOM(void)
 {
  MCUCR=0x08; //INT1的下降沿产生异步中断请求	
  GICR&=~0x80;//关中断
  delay_ms(1);
 // set_PD(1);
 // delay2560(20000);
 //set_PD(0); //芯片复位
  EOM_flag=0;
  GICR|=0x80;
 }
 //**************************************************//
                    /*主函数*/
 //**************************************************//			  
 main()
 {
 DDRC=0XFF;
 PORTC=0XEF;
 DDRD=0X00;
 PORTD=0XF0;
 TCCR1A=0X00;
 TCCR1B=0X05;
 TCNT1H=0XFb;
 TCNT1L=0Xbe;
 SREG|=0X80;//使能全局中段
 MCUCR=0x08;//INT1的下降沿产生异步中断请求	
 GICR|=0x80;
 while(1)
 {
    if(!(PIND&0X80)) //按PD7  上行键
   {
    delay_ms(10);
    if(!(PIND&0X80))
	{
	 while(!(PIND&0X80)); 
	 direct_flag=0;
	 count1++;
	 inform(count1);  
    } 	
   } 
  //********************************************************//
                  /* 上行键 预 报 站*/
 //********************************************************//		
  if(!(PIND&0X40))//按PD6    
   {
    delay_ms(10);
    if(!(PIND&0X40))
	  {   
	  while(!(PIND&0X40));  
	  direct_flag=0;
	  count1++;
	  pre_inform(count1);
    } 	
   }  
 //********************************************************//
                  /*  上行键 上一个站*/
 //********************************************************//				 
  if(!(PIND&0X20))//按PD5 
   {
    delay_ms(10);
    if(!(PIND&0X20))
	  {   
	  while(!(PIND&0X20)); 
	  count1--;
	//  display1();
	  inform(count1); 
	  }
   }  
//********************************************************//
                  /*   下行键  */
//********************************************************//	   
 if(!(PIND&0X10))//按PD4    
   {
    delay_ms(10);
    if(!(PIND&0X10))
	  {   
	  while(!(PIND&0X10)); 
	 direct_flag=1;
	  count2++; 
	// display2();
	  inform(count2); 
	  }
   }
 //********************************************************//
               /* 下行键 预 报 站*/
//********************************************************//				 
  if(!(PIND&0X04))//按PD2  
   {
    delay_ms(10);
    if(!(PIND&0X04))
	  {   
	  while(!(PIND&0X04));
	  count2++;
	  pre_inform(count2);
	  }
   } 
//********************************************************//
               /*  下行键 上一个站*/
//********************************************************//				 
 if(!(PIND&0X02))//按PD1   
   {
    delay_ms(10);
    if(!(PIND&0X02))
	  {   
	  while(!(PIND&0X02)); 
	  count2--;
	//  display2();
	  inform(count2); 
	  }
   }     
//********************************************************//
               /* 欢迎信息(起点)*/
//********************************************************//				       
 if(!(PIND&0X01))//按PD0   
   {
    delay_ms(10);
     if(!(PIND&0X01))
	  {   
	  while(!(PIND&0X01)); 
	  seek_duan(sndbegin_info);
      play();                                        
	  }
   }
//********************************************************//
              /*  欢迎信息(终点) */
//********************************************************//	   
 if(!(PINB&0X80))//按PB7   
   {
    delay_ms(10);
     if(!(PINB&0X80))
	  {   
	  while(!(PINB&0X80)); 
	   seek_duan(sndend_info);
       play(); 
	  }
   }
//********************************************************//
              /* 特殊情况 */
//********************************************************//	   
  if(!(PINB&0X40))//按PB6   
   {
    delay_ms(10);
     if(!(PINB&0X40))
	  {   
	  while(!(PINB&0X40)); 
	  seek_duan(sndwarn_info);
      play();
	  }
   }

 }  

 } 
  

⌨️ 快捷键说明

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