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

📄 uart3.c

📁 充电车的控制板程序
💻 C
字号:
#include <iom128v.h>
#include <macros.h>


#define TRE3      7
#define SET_485_TX3() PORTB &= ~(1<<TRE3)
#define SET_485_RX3() PORTB |= (1<<TRE3)


#define RHR (*(volatile unsigned char *)0x4000) 
#define THR (*(volatile unsigned char *)0x4000) 

#define IER (*(volatile unsigned char *)0x4100) 
#define ISR (*(volatile unsigned char *)0x4200) 
#define FCR (*(volatile unsigned char *)0x4200) 
#define LCR (*(volatile unsigned char *)0x4300) 
#define MCR (*(volatile unsigned char *)0x4400) 
#define LSR (*(volatile unsigned char *)0x4500) 
#define MSR (*(volatile unsigned char *)0x4600) 
#define SPR (*(volatile unsigned char *)0x4700) 


#define DLL (*(volatile unsigned char *)0x4000) 
#define DLM (*(volatile unsigned char *)0x4100) 
#define AFR (*(volatile unsigned char *)0x4200) 

#pragma interrupt_handler exint6_isr:8
	
#define STEN      MCUCR |= 0x80
#define STDISEN   MCUCR &= 0x7F

//-------------
unsigned char rx_ok3;
unsigned char rx3_data;
unsigned char uart3_state;
unsigned char uart3_flag;
unsigned char uart3_counter;

unsigned char test_en=0;
unsigned char tx3_buf[8];
unsigned char rx3_buf[13];
unsigned char uart3_tx_over;

unsigned char state_check;
unsigned char rx3_step;
unsigned char mode_counter;
unsigned char mode_flag;
unsigned char mode_flag_temp;

//-----------------
void delay_time (void)
{
unsigned int t=1000;
for(;t>0;t--)
{
	NOP();
}
}
//-----------------------
void mcu_exmemory_en (void)
{
   MCUCR = 0x80;
}
//----------------
void mcu_exmemory_dis (void)
{
	 MCUCR = 0x00;
}
//-----------------------

void uart3_tx (unsigned char data)
{
	unsigned char temp;
	SET_485_TX3();
	STEN ;
	do{
		temp=LSR;
		delay_time ();
		temp &= 0x60;
	}while(temp==0x00);
	
		
	THR = data;
	delay_time ();
	do{
		temp=LSR;
		delay_time ();
		temp &= 0x60;
	}while(temp==0x00);
	
	STDISEN ;
	SET_485_RX3();
}
//--------------------
void uart3_rx (void)
{
	unsigned char temp;
	STEN ;
	delay_time ();
	if(rx3_step<13)
		{	
			rx3_buf[rx3_step]=RHR;
			delay_time ();
			rx3_step++;
			if(rx3_step==13)
				{
			 		rx_ok3=1;
			 		rx3_step=0;			 		
			  };
		};			
	STDISEN ;
}
//------------------
void EXINT6_INIT (void)
{
	EICRB |= (1<<ISC60);
	EICRB |= (1<<ISC61);//上升沿中断
	EIMSK |= (1<<INT6);//开中断
	EIFR  |= (1<<INTF6);//通过写入1来请0
	PORTE |= (1<<PE6);
	//PORTE &= ~(1<<PE6);
	DDRE  &= ~(1<<PE6);
}
//------------
//--------------
void exint6_isr (void)
{
	unsigned char temp,temp0;
	NOP();
	NOP();

	STEN ;
	uart3_state=ISR;
	delay_time();
	NOP();
	NOP();
	if((uart3_state&0xFE)!=0x00)
	{
	if(uart3_state&0x0F)
	{
		temp = uart3_state & 0x0F;
		
		if(temp==0x06)//接收器线状态寄存器
		{
        NOP();       
        temp0 =  LSR;  
        delay_time();  
        NOP();
		};
		
		if(temp==0x04)//数据接收完成
		{ 	
			NOP();
      NOP();
			uart3_rx ();
      NOP();
      NOP();
		};
		
		if(temp==0x0C)//接受超时
		{       
        temp0 =  RHR;
        delay_time();
        NOP();
        NOP();
        NOP();
		};
		
		if(temp==0x02)//发送完成
		{		
			  NOP();
        NOP();
        NOP();   
        THR = 0xAA;      
        delay_time();
        SET_485_RX3();
        
		};
		
		if(temp==0x00)//调制解调状态寄存器
		{
        NOP();
        temp0 =  MSR;
        NOP();
		};
	};
}
else
{
	   NOP();
}
	STDISEN ;
}
//----------
//--------------------------
void uart3_init (void)
{
	unsigned char i=0x00;
	 XMCRA = 0x0E;
   XMCRB = 0x00;
   uart3_flag = 0x01;
   state_check=0x00;
   rx3_step=0;
   mode_counter=0x00;
}
//-----------------

void  st16c_init (void)
{
	
	if(uart3_flag==0x02)//init st16c2552 
	{
		STEN;
		switch (uart3_counter)
		{
			case 0:
				{
					 LCR = 0x80;
					 uart3_counter++;
					 
			  };break;
			case  1:
				{
					NOP();
					NOP();
					state_check=LCR;
					NOP();
					NOP();
					
					DLM = 0x00;
					uart3_counter++;
				};break;
			case 2:
				{
					NOP();
					NOP();
					state_check=DLM;
					NOP();
					NOP();						
					
					DLL = 0x48;//9600BPS
					uart3_counter++;
				};break;
			case 3:
				{			
					NOP();
					NOP();
					state_check=DLL;
					NOP();
					NOP();					
					
					AFR = 0x00;//不同时写AB寄存器,不使能MF管教
					uart3_counter++;
				};break;
			case 4:
				{				
					NOP();
					NOP();
					state_check=AFR;
					NOP();
					NOP();								
					
					LCR = 0x03;//8 BIT ; 1 STOP BIT;NO 校验
					uart3_counter++;
				};break;
			case 5:
				{			
					NOP();
					NOP();
					state_check=LCR;
					NOP();
					NOP();										
					FCR = 0x00; 
					uart3_counter++;
				};break;
				
			case 6:
				{				
					NOP();
					NOP();
					state_check=FCR;
					NOP();
					NOP();
					
					// IER = 0x00;
	 				IER = 0x01;//enable rx int
	 				uart3_counter++;
				};break;
			case 7:
				{
					NOP();
					NOP();
					state_check=IER;
					NOP();
					NOP();					
					
				  MCR = 0x08;
				  uart3_counter++;
				};break;
			case 8:
				{
					NOP();
					NOP();
					state_check=MCR;
					NOP();
					NOP();
					
					LCR = 0x03;
					uart3_counter++;
				};break;
			case 9:
				{
					
					NOP();
					NOP();
					state_check=LCR;
					NOP();
					NOP();					
					
					uart3_counter=0;
					uart3_flag =0x00;						
					
					DDRB |= (1<<PB7);
	
					SET_485_RX3();		
				  EXINT6_INIT ();	
				  
				  test_en=0;	  		
				};break;	
	    default:break;					
		}
		STDISEN ;
	};
	
	
	if(uart3_flag==0x01)//reset
	{
			DDRD |= (1<<PD7);
	    PORTD |= (1<<PD7); 
	    
	    if(uart3_counter<100)
	    {
	    	uart3_counter++;
	    }
	    else
	    {
	    	PORTD &=  ~(1<<PD7);
	    	
	    	uart3_flag &= 0xFE;
	    	uart3_flag = 0x02;
	    	uart3_counter = 0;  
	    	state_check =0x00; 	
	    }
	};
	
}

//------------------
void uart3_check (void)
{
	unsigned char i,j=0;
	unsigned char flag=0x00;
	
	for(i=2;i<11;i++)
	{
		j+= rx3_buf[i];
	}
	
	if((rx3_buf[0]==0x68)&&
		 (rx3_buf[1]==0x09)&&
		 (j==rx3_buf[11])&&
		 (rx3_buf[12]==0x16))
	{
		flag=1;
	};	 
	
	if(flag)
		{
			switch (rx3_buf[3])
			{
				case 0x03
					{
						mode_flag|=0x01;
					};break;
				case 0x04:
					{
						mode_flag|=0x02;
						
					};break;
				case 0x05:
					{
						mode_flag|=0x04;
						
					};break;
				case 0x06:
					{
						mode_flag|=0x08;
					};break;
				default:break;			
			}
			
			if(mode_flag!=mode_flag_temp)
				{
					mode_counter++;
				};
			mode_flag_temp =	mode_flag; 
			
		};
}

//------------------

void uart3_handle (void)
{
unsigned char uart3_counter1,counter2;
	
if(uart3_flag)
{
	st16c_init();
};
	
if(rx_ok3)
 	{
 		
 		uart3_check();
 		
 	//	uart3_tx (rx3_data);
 		rx_ok3=0;	
 	};
 	
/*  
 if(++test_en>100)
 {
 	test_en=0;
 	uart3_tx (0xAA);
 };	
 */
}
//--------------------
void uart3_turn_on (void)
{	
	unsigned char i=0x00;
	
	tx3_buf[0]=0x68;
	tx3_buf[1]=0x04;
	
	tx3_buf[2]=0x10;
	 i=tx3_buf[2];
	tx3_buf[3]=0x03;//sadd
	 i+=tx3_buf[3];
	tx3_buf[4]=0x00;
	 i+=tx3_buf[4];
	tx3_buf[5]=0x00;//YK
	 i+=tx3_buf[5];
	tx3_buf[6]=i;//cs
	tx3_buf[7]=0x16;
	
	for(i=0;i<8;i++)
	{
		uart3_tx (tx3_buf[i]);
	}
}
//------------------
void uart3_turn_off (void)
{
	unsigned char i;
	
	tx3_buf[0]=0x68;
	tx3_buf[1]=0x04;
	
	tx3_buf[2]=0x10;
	 i=tx3_buf[2];
	tx3_buf[3]=0x03;//sadd
	 i+=tx3_buf[3];
	tx3_buf[4]=0x00;
	 i+=tx3_buf[4];
	tx3_buf[5]=0xFF;//YK
	 i+=tx3_buf[5];
	tx3_buf[6]=i;//cs
	tx3_buf[7]=0x16;
	
	for(i=0;i<8;i++)
	{
		uart3_tx (tx3_buf[i]);
	}
}

//------------------

⌨️ 快捷键说明

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