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

📄 能动.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,17};//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  led_flag=0;
uchar  count1,count2;
uchar j;
uchar  led1[2];
uchar  led2[2];
uchar TABLE[ ] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*LED 字形表*/
//*******************************************************//
                   /* 语音芯片的控制函数*/
//*******************************************************//
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();
 }
} 
//*******************************************************//
                   /* 转换函数*/
//*******************************************************//  

void conv1(void)  //数值转换
{
led1[1]=count1/10;
led1[0]=count1%10;
}
void conv2(void)  //数值转换
{
led2[1]=count2/10;
led2[0]=count2%10;
} 

 
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
 TCCR1A=0X00;
 TCCR1B=0X01;//
 TCNT1H=61536/256;
 TCNT1L=61536%256;
 if(!led_flag)  //显示上行
 {
 conv1();   
 PORTB=~(0x01<<j);    
 PORTA=TABLE[led1[j++]]; 
 if(j==2)
 j=0;
 }
 if(led_flag)  //显示下行
 {
 conv2();   
 PORTB=~(0x01<<j);    
 PORTA=TABLE[led2[j++]]; 
 if(j==2)
 j=0;
 }
 
 }
 
#pragma interrupt_handler check_EOM:3 
 void check_EOM(void)
 {
  MCUCR=0x08; //INT1的下降沿产生异步中断请求	
  GICR&=~0x80;//关中断
  delay_ms(1);
  EOM_flag=0;
  GICR|=0x80;
 }
 //**************************************************/
                    /*主函数*/
 //**************************************************//			  
 main()
 {
 DDRA=0XFF;
 PORTA=0XFF;
 DDRB=0X0F;
 PORTB=0XFF;
 DDRC=0XFF;
 PORTC=0XEF;
 DDRD=0X00;
 PORTD=0XF0;
 TCCR1A=0X00;
 TCCR1B=0X01;//
 TCNT1H=61536/256;
 TCNT1L=61536%256;
 SREG|=0X80;//使能全局中段
 TIMSK=0X04;
 MCUCR=0x08;//INT1的下降沿产生异步中断请求	
 GICR|=0x80;
 while(1)
 {
    if(!(PIND&0X80)) //按PD7  上行键
   {
    delay_ms(10);
    if(!(PIND&0X80))
	{
	 while(!(PIND&0X80)); 
	 direct_flag=0;
	 led_flag=0;
	 count1++;
	 inform(count1);  
    } 	
   } 
  //********************************************************//
                  /* 上行键 预 报 站*/
 //********************************************************//		
  if(!(PIND&0X40))//按PD6    
   {
    delay_ms(10);
    if(!(PIND&0X40))
	  {   
	  while(!(PIND&0X40));  
	  direct_flag=0;
	  led_flag=0;
	  count1++;
	  pre_inform(count1);
	  count1=count1-1;
    } 	
   }  
 //********************************************************//
                  /*  上行键 上一个站*/
 //********************************************************//				 
  if(!(PIND&0X20))//按PD5 
   {
    delay_ms(10);
    if(!(PIND&0X20))
	  {   
	  while(!(PIND&0X20)); 
	  led_flag=0;
	  count1--;
	  inform(count1); 
	  }
   }  
//********************************************************//
                  /*   下行键  */
//********************************************************//	   
 if(!(PIND&0X10))//按PD4    
   {
    delay_ms(10);
    if(!(PIND&0X10))
	  {   
	  while(!(PIND&0X10)); 
	 direct_flag=1;
	 led_flag=1;
	  count2++; 
	  inform(count2); 
	  }
   }
 //********************************************************//
               /* 下行键 预 报 站*/
//********************************************************//				 
  if(!(PIND&0X04))//按PD2  
   {
    delay_ms(10);
    if(!(PIND&0X04))
	  {   
	  while(!(PIND&0X04));
	  led_flag=1;
	  count2++;
	  pre_inform(count2);
	  count2=count2-1;
	  }
   } 
//********************************************************//
               /*  下行键 上一个站*/
//********************************************************//				 
 if(!(PIND&0X02))//按PD1   
   {
    delay_ms(10);
    if(!(PIND&0X02))
	  {   
	  while(!(PIND&0X02)); 
	  led_flag=1;
	  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 + -