music1car.c

来自「单片机串口--和E语言之间的通讯」· C语言 代码 · 共 218 行

C
218
字号
 /* Interrupt mode driver for UART.2006/1/21日增加看门狗
 */
#include <iom8515v.h>
#include <macros.h>
#include <uart.h>
#pragma interrupt_handler Time_ovf:8
#pragma interrupt_handler UART_RX_interrupt:10 
//UART_TX_interrupt:11

static unsigned char buferdata[2]={255,254};
static char cnt_rxinit=0;
//static char a_data,c_data;
/* initialize UART */
void InitUSART( unsigned char baudrate )
	{
	//UCSRC=0;
	UBRRH = (unsigned char)(baudrate>>8);
	UBRRL = (unsigned char)baudrate; /* set the baud rate 设置波特率9600*/
	WDR();			  //先喂狗
	WDTCR=11;		  //看门狗
	UCSRB =0X18;//禁止中断   0x98;//接收中断/发送禁止
	UCSRC=0X86;//异步/1停止位/8位数据
	PORTA=0XFF;
	DDRA=0XFF;
	PORTC=0XFF;
	DDRC=0XFF;
	TCCR0=5;
	TCNT0=168;
	TIMSK=0;
	OCR0=255;
	SEI();
	DDRB=0;
	PORTD=0;
	DDRD=0X80;
	}
unsigned char receivemit(void)
	 {
	 while(!(UCSRA&(1<<RXC))){WDR();}
	 return UDR;
	 }

void Transmit( unsigned char data )
	{
	while(!(UCSRA&(1<<UDRE))){WDR();}
	UDR=data;
	}
/* interrupt handlers */
void UART_RX_interrupt( void )
{
	char temp;
	if(cnt_rxinit<=1)
	{
	WDR();
	temp=buferdata[cnt_rxinit] = UDR; /* read the received data */
	cnt_rxinit++;
	Transmit(temp);
	}
	else
	{
	WDR();
	cnt_rxinit=0;
	temp=buferdata[cnt_rxinit] = UDR;
	cnt_rxinit++;
	Transmit(temp);
	}
}

void Time_ovf( void )//时间中断0
{
	//_CLI();
	//TIMSK=0;
	//WDR();
	//TCCR0=5;
	TCNT0=168;
	
	if(PINB&0X04)
	    {
	    
		 Transmit(57);//确认标志(ok)
		 while(PINB&0X04){WDR();}
		 }
		 else
		 {
		  if(PIND&0X04)
		  {
		   
		   Transmit(71);//选歌标志
		   while(PIND&0X04){WDR();}
		  }
		   else 
		    {
			if(PIND&0X08)
			 {
			  
			   Transmit(19);//音量+标志
			    //while(PIND&0X08);
			 }
			  else
			  {
			   if(PIND&0X10)
				{
				  
				   Transmit(11);//音量-标志
				 // while(PIND&0X10);
				}
			   else
			     {
			     if(PIND&0X20)
				   {
				  
				   Transmit(144);//关机-标志
				 // while(PIND&0X10);
				   }
			      else;
				 } 
			  }
			}
		  }  	
		
	TIMSK=2;
	//_SEI();	
}



/*void out_zx(void)
   {
    PORTA=buferdata[0];
	PORTC=buferdata[1];   
   }
*/

void main( void )
{
 reset: InitUSART( 51 );
 Transmit(99);
 Transmit(99);
   for(;;)
  {
  WDR();
  //InitUSART( 51 );
  //Transmit(99);
 // Transmit(99);
  InitUSART( 51 ); /* set the baudrate to 9600 bps using a 8MHz crystal */
	//_CLI();
	//UCSRB=0X18;禁止中断
	//PORTD |= 0X80;
  if(receivemit()==218)
	{
	WDR();
	 Transmit(218);
	 UCSRB=0X98;  
	 DDRD|=0X80;    //要增加关机时对开机按钮的控制(开,关机按钮复用)
	 PORTD|= 0X80;//播放系统打开后切断开机按钮的连接(硬件加继电器)
	TIMSK=2;
	 SEI(); /* enable interrupts => enable UART interrupts */
	 while(buferdata[0]!=155 || buferdata[1]!=155)//判断关机信号buferdata[0]!=155 && buferdata[1]!=155
	 {
	   PORTA=buferdata[0];
	   PORTC=buferdata[1] & 253;  //功放开关控制
	   WDR();
      //out_zx();
/*	 if(PINB&0X04)
	    {
	    
		 Transmit(57);//确认标志(ok)
		 while(PINB&0X04);
		 }
		 else
		 {
		  if(PIND&0X04)
		  {
		   
		   Transmit(71);//选歌标志
		   while(PIND&0X04);
		  }
		   else 
		    {
			if(PIND&0X08)
			 {
			  
			   Transmit(19);//音量+标志
			    while(PIND&0X08);
			 }
			  else
			  {
			   if(PIND&0X10)
				{
				  
				   Transmit(11);//音量-标志
				  while(PIND&0X10);
				}
			   else;
			  }
			}
		  } */ 
		 }//
		 buferdata[0]=255;
		 buferdata[1]=255;
		 PORTA=255;
		 PORTC=255;
		 goto reset;//强制复位
	   }
	  
	else
	  {
	  Transmit(99);
	  PORTA=255;
	  PORTC=255; 
	  }
	 /* while ( 1 )forever 
		{*/
		/*//Transmit(88);  echo the received character 
		}*/
   }
}

⌨️ 快捷键说明

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