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

📄 serial.c

📁 里面给出了ATmega103单片机编程的C语言实例程序
💻 C
字号:
/* ATmega103 serial.c file

   Author : Robert Stuart
   Company : PDL Industries Ltd
   Date of Creation : 10 April 2000

   Function :
*/

/* include */
#include "serial.h"

void SerialInitialise( void )
{
  UBRR = BAUD_9600;
  
  UCR = 0x00;
  
  UART_TRANSMIT_ON;
  UART_RECEIVE_ON;
   
  UCR |= BIT(RXCIE);
  
  for ( UARTIndex = 0; UARTIndex < 16; UARTIndex++ )
    UARTMessage[UARTIndex] = CHARACTER_NULL;
}

void RxdCompleteInterrupt( void )
{
  UARTIndex++;
  
  if ( UARTIndex < 10 )
    UARTMessage[UARTIndex] = UDR; 
    
  switch ( UDR )
  {
    case RXD_START_HEADER : for ( UARTIndex = 1; UARTIndex < 16; UARTIndex++ )
		          UARTMessage[UARTIndex] = CHARACTER_NULL; 
                            UARTIndex = 0;
		        UARTMessage[UARTIndex] = UDR;
		        break;
		        
    case RXD_FINISH_HEADER : ExecuteCommand(); break;
  }
}

void ExecuteCommand( void )
{
  switch ( UARTMessage[1] )
  {
    case 'E' : ReadOrWriteEEPROM(); break;
    
    case 'F' : ReadFlash(); break;
  }
  
  if ( strcmp(UARTMessage, "<Hello>") == 0 )
  {
    UARTMessage[0] = TXD_START_HEADER;
    UARTMessage[7] = TXD_FINISH_HEADER;
    UARTMessage[8] = CHARACTER_NULL;
    
    SendUARTMessage();
  }
}

void ReadOrWriteEEPROM( void )
{
  unsigned char data;
  
  switch ( UARTMessage[2] )
  {
    case 'R' : if ( UARTIndex == 7 )
               {
	       data = EEPROMread(CalculateAddress());
	       
	       UARTMessage[0] = TXD_START_HEADER;
                 UARTMessage[2] = 'E';
	       UARTMessage[7] = HEX((data >> 4));
	       UARTMessage[8] = HEX((data - ((data >> 4) << 4)));
	       UARTMessage[9] = TXD_FINISH_HEADER;
	       UARTMessage[10] = CHARACTER_NULL;
	       
	       SendUARTMessage();
	     }
	     break;

    case 'W' : if ( UARTIndex == 9  && !EEPROM_BUSY )
               {
	       EEPROMwrite(CalculateAddress(), CalculateData());
	       
	       UARTMessage[0] = TXD_START_HEADER;
	       UARTMessage[2] = 'E';
	       UARTMessage[9] = TXD_FINISH_HEADER;
	       UARTMessage[10] = CHARACTER_NULL;
	       
	       SendUARTMessage();
	     }
	     break;
  }
}

void ReadFlash( void )
{
  unsigned char data;
  
  if ( UARTMessage[2] == 'R'  && UARTIndex == 7 )
  {
    data = *(unsigned char *) CalculateAddress();
    
    UARTMessage[0] = TXD_START_HEADER;
    UARTMessage[2] = 'F';
    UARTMessage[7] = HEX((data >> 4));
    UARTMessage[8] = HEX((data - ((data >> 4) << 4)));
    UARTMessage[9] = TXD_FINISH_HEADER;
    UARTMessage[10] = CHARACTER_NULL;
    
    SendUARTMessage();
  }
}

int CalculateAddress( void )
{
  return DECIMAL(UARTMessage[6]) + 
         (DECIMAL(UARTMessage[5]) << 4) +
         (DECIMAL(UARTMessage[4]) << 8) + 
         (DECIMAL(UARTMessage[3]) << 12);
} 

unsigned char CalculateData( void )
{
  return DECIMAL(UARTMessage[8]) + 
         (DECIMAL(UARTMessage[7]) << 4);
}

void SendUARTMessage( void )
{
  GID;
  printf(UARTMessage);
  GIE;
}


⌨️ 快捷键说明

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