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

📄 main._c

📁 mega16的rs232通讯程序
💻 _C
字号:
//ICC-AVR application builder : 2008-4-9 17:20:49
// Target : M16
// Crystal: 16.000Mhz

#include <iom16v.h>
#include <macros.h>

#define DataR 0x90
#define RSTA1  0x4a
#define RSTA2  0x30

#define TSTA1 0x6b
#define TSTA2 0x4c
#define DataT 0xaf

#define En	  0xe0
#define Run	  0x83
#define Stop  0x7d

#define OK	  1
#define NG	  0
#define ONE	  0x90
#define TWO	  0x91
#define THREE 0x92
#define FOUR  0x93
#define COMM  0x94
  
unsigned char Enter[4] = {En,0x3e,0xe3,0xee};
unsigned char RunBuffer[4] = {Run,0x44,0x35,0x7e};
unsigned char StopBuffer[4] = {Stop,0x5e,0xe5,0x9e};

static unsigned char n = 0;
static unsigned char len;
static unsigned char flag;

unsigned char RxBuffer[4] = {0,0,0,0};
unsigned char TxBuffer[4];

enum COMCHE{ENTER,RUN,STOP}comcheck;

void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0xff;
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0x00; //m103 output only
 DDRC  = 0xff;
 PORTD = 0x00;
 DDRD  = 0x00;
}

//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
 UCSRB = 0x00; //disable while setting baud rate
 UCSRA = 0x00;
 UCSRC = BIT(URSEL) | 0x06;
 UBRRL = 0x67; //set baud rate lo
 UBRRH = 0x00; //set baud rate hi
 UCSRB = 0xD8;
}

#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{unsigned char temp = UDR;
 if (flag == NG){
 	switch (n){
		   case 0: if (temp == RSTA1) n++;break;	//头1
		   case 1: if (temp == RSTA2) n++;		//头2   
		   		   else n = 0;			break;
		   case 2: if (temp >= ONE && temp <= COMM)//长度
		   		   	  {len = temp; n++;}
				   else n = 0;		 	
				   break;
		   case 3: RxBuffer[0] = temp; n++; break;
		   case 4: RxBuffer[1] = temp; n++; break;
		   case 5: RxBuffer[2] = temp; n++; break;
		   case 6: RxBuffer[3] = temp;  n++; 	 //data
		   				// break;
		  /* case 7: temp = RxBuffer[0]%16 + RxBuffer[1]%16 + RxBuffer[2]%16 +RxBuffer[3]%16 +len;
		   		   if (UDR == temp) {  	 	   //校验*/
		   		   	  flag = OK;
					  PORTA = 0xff;
					  //CLI();
					 // UCSRB = 0xC8;			   //关接受中断
					 // SEI();
					// }
					 n = 0;
				   break;
			default: break;
 	}
 }

}

#pragma interrupt_handler uart0_tx_isr:14
void uart0_tx_isr(void)
{
 	if (flag == OK){
	   PORTC = 0xff;
	   switch (n){
	   		  case 1: n++;UDR = TSTA2;  break; 			   //头2
			  case 2: n++;UDR = DataT - len;  break;	   //长度
			  case 3: n++;UDR = RxBuffer[0];  break;	
			  case 4: n++; UDR = RxBuffer[1]; break;	
			  case 5: n++;UDR = RxBuffer[2];  break;	
			  case 6: n=0; flag = NG;UDR = RxBuffer[3]; break;	   //data
			//  case 6: UDR = RxBuffer[0]%16 + RxBuffer[1]%16 + RxBuffer[2]%16 +RxBuffer[3]%16  + DataT - len; n = 0; break;//校验
			  default:break;
	   }
	   }
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 uart0_init();

 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}
/*****************************************************
unsigned char check_buf( unsigned char *CheckBuffer)
检测命令是否符合要求

*****************************************************/

unsigned char check_buf( unsigned char *CheckBuffer,unsigned char num){
		  unsigned char i;
		  for (i = 0;i < num; i++){
		  	  if (CheckBuffer[i] != RxBuffer[i])
			  	 break;
		  }
		  if (i == num)
		  	 return OK;
		  else 
		  	 return NG;
}

unsigned char check_com(){
		 unsigned char i;
		 switch (len){
		 		case COMM: switch (RxBuffer[0]){
					 	   		  case En: if (check_buf(Enter,4) == OK)
							  	  	   	    comcheck = ENTER;
											break;
								  case Run: if(check_buf(RunBuffer,2) == OK)
								  	   		{comcheck = RUN;
											 
											 //runtask(RxBuffer);
											}
											break;
								  case Stop: if(check_buf(StopBuffer,2) == OK)
								  	   		{comcheck = STOP;
											//stoptask(RxBuffer);
											 
											}
											break;
								  default:  break;
								  }break;
				case ONE:
				case TWO:
				case THREE:
				case FOUR: if (check_buf(TxBuffer,4) == OK)
					 	  	{for (i = 0;i < 4;i++) RxBuffer[i] = Enter[i];
							 }
						    //UDR = TSTA1;
						    break;
				default: PORTC = 0xf0;break;						   
		 }
		 while (!(UCSRA&(1<<UDRE)));
		 n=1;
		 UDR = TSTA1;
		

}
void main(){
 n = 0;
 flag = NG;
 init_devices();
 while(1){
 		  if (flag == OK && n == 0)
	   	  check_com();
  		 
 }
 
}

⌨️ 快捷键说明

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