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

📄 uart.c.bak

📁 AVR单片机ATMEGA128实习之—串口通信(附带Proteus仿真例子)
💻 BAK
字号:
#include <iom128.h>
#include <macros.h>

//LED 开关定义

#define	  Red_LED_on		PORTB&~BIT(0)
#define	  Red_LED_off		PORTB|(1<<0)
#define	  Green_LED_on		PORTB&(~(1<<1))
#define	  Green_LED_off		PORTB|(1<<1)
#define	  Yellow_LED_on		PORTB&(~(1<<2))
#define	  Yellow_LED_off	PORTB|(1<<2)


//UART
unsigned char Rx_counter = 0;
unsigned char Tx_counter = 0;
unsigned char Tx_data_buf[] = {222,111,100,50,20,10,5,2,1,22};
unsigned char Tx_data;
unsigned char Rx_data_buf[12];
unsigned char Rx_data;
unsigned char UART0_TX_flag	= 1;
unsigned char UART0_RX_flag	= 1;
unsigned char Type_flag = 4;
//Display
unsigned char number_bai;
unsigned char number_shi;
unsigned char number_ge ;
unsigned char Display_type;
unsigned char Display_value;
unsigned char LED_table[]=
{  
   0x3F,  //"0"
   0x06,  //"1"
   0x5B,  //"2"
   0x4F,  //"3"
   0x66,  //"4"
   0x6D,  //"5"
   0x7D,  //"6"
   0x07,  //"7"
   0x7F,  //"8"
   0x6F,  //"9"
   0x77,  //"A"
   0x7C,  //"B"
   0x39,  //"C"
   0x5E,  //"D"
   0x79,  //"E"
   0x71,  //"F"
   0x76,  //"H"
   0x38,  //"L"
   0x37,  //"n"
   0x3E,  //"u"
   0x73,  //"P"
   0x5C,  //"o"
   0x40,  //"-"
   0x00,  //熄灭                     
};

//use for test;
unsigned char m;

//define Interrupt Vactor

#pragma interrupt_handler UART0_TX_INT:21		//外部中断0
#pragma interrupt_handler UART0_RX_INT:19		//外部中断1
#pragma interrupt_handler External_INT_0:2		//外部中断0
#pragma interrupt_handler External_INT_1:3		//外部中断1
#pragma interrupt_handler External_INT_2:4		//外部中断2

//pre_define

void Port_initialize(void);
void INT_initialize(void);
void UART_initialize(void);

void UART0_TX_INT(void);
void UART0_RX_INT(void);
void External_INT_0(void);
void External_INT_1(void);
void External_INT_2(void);

void LED_Display(unsigned char Type,unsigned char Data);
void DATA_to_NUM(unsigned char data);
void Delay(void);


void main(void)
{
	unsigned char i;
	
	Port_initialize();
	UART_initialize();
	INT_initialize();
	
	for (; ; )
	{
		switch (Type_flag)
		{
			case 0:				//发送的数值
			{
				Display_type = 0;
				Display_value = Tx_data;
			
			}break;
		
			case 1:				//发送计数
			{
				Display_type = 1;
				Display_value = Tx_counter;
			
			}break;

			case 2:				//接收的数值
			{
				Display_type = 2;
				Display_value = Rx_data;

			}break;

			case 3:				//接收计数
			{
				Display_type = 3;
				Display_value = Rx_counter;
			
			}break;

			default:
			{
				Display_type = 0x0f;
				
			}break;
		}

		LED_Display(Display_type,Display_value);		//数码管显示
		
		if (UART0_TX_flag == 0)
		{
			PORTB = Red_LED_on;

			for (i=0;i<10 ;i++ )
			{
				Delay();
			}

			UART0_TX_flag = 1;
		}
		else
		{
			PORTB = Red_LED_off;
		}
		
		if (UART0_RX_flag == 0)
		{
			PORTB = Green_LED_on;

			for (i=0;i<10 ;i++ )
			{
				Delay();
			}

			UART0_RX_flag = 1;
		}
		else
		{
			PORTB = Green_LED_off;
		}
	}
}

void Port_initialize(void)
{
	DDRA = 0xFF;
	DDRB = 0xFF;
	DDRD = 0x00;
	PORTB = 0xFF;
}
void INT_initialize(void)
{
	EICRA = 0xaa;		//fall edge trigger
	EICRB = 0x00;		//no influence
	EIMSK = 0x0f;

	SEI();

}
void UART_initialize(void)
{
	CLI();
	
	UBRR0H = 0x00;
	UBRR0L = 0x67;		//波特率9600bps
	UCSR0A = 0x00;
	UCSR0B = 0x98;		//11011000接收与发送使能
	UCSR0C = 0x26;		//00100110帧格式: 8bits,1stop bit,P 校验

	SEI();
}
void Delay(void)
{
	unsigned int i;

	for ( i = 0; i < 6000; i++ )
	{
		NOP();
	}
}

void UART0_TX_INT(void)
{
	UART0_TX_flag = 0;
	
	if (Tx_counter<10)
	{
		Tx_counter += 1;
	}
	else
	{
		Tx_counter = 1;
	}
	
	Tx_data = Tx_data_buf[Tx_counter-1];
	
	UDR0 = Tx_data;		//data to transmit
	UCSR0B &=0xbf ;		//1011 1111关闭发送中断

	while ( !( UCSR0A & (1<<UDRE0)) )	//等待发送缓冲区空
	{
	}
	
	UCSR0B |= 0x80;	
}

void UART0_RX_INT(void)
{
	Rx_data = UDR0;
	UART0_RX_flag = 0;

	if (Rx_counter < 10)
	{
		Rx_counter += 1;
	}
	else
	{
		Rx_counter = 1;
	}

	Rx_data_buf[Rx_counter - 1] = Rx_data; 
	PORTB = Green_LED_on;

}

void External_INT_0(void)
{
	UCSR0B |= 0x40;
	UCSR0B &= ~(0x80);
}

void External_INT_1(void)
{
	if (Type_flag < 4 )
	{
		Type_flag += 1;
	}
	else
	{
		Type_flag = 0;
	}
}
void External_INT_2(void)
{
 	
	if(m < 12)
	{
		m += 1;
	}
	else
	{
		m = 1;
	}

	Display_type = 0x0f;
	Display_value = Rx_data_buf[m-1];

	
}
void LED_Display(unsigned char Type,unsigned char Data)
{
	
	DATA_to_NUM(Data);
	
	PORTA = LED_table[number_ge];
	PORTB = (PORTB|0xf0)&0x7F;
	Delay();

	PORTA = LED_table[number_shi];
	PORTB = (PORTB|0xf0)&0xBF;
	Delay();
	
	PORTA = LED_table[number_bai];
	PORTB = (PORTB|0xf0)&0xDF;
	Delay();

	PORTA = LED_table[Type];
	PORTB =	(PORTB|0xf0)&0xEF;
	Delay();
}

void DATA_to_NUM(unsigned char data)
{
	number_bai = data/100;
	number_shi = (data%100)/10;
	number_ge  = (data%100)%10;
}

⌨️ 快捷键说明

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