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

📄 uart_to_twi._c

📁 UART_TO_TWI程序
💻 _C
字号:
/*****************************************************************
//ICC-AVR application builder : 2005-8-19 14:40:53
// Target : M8
// Crystal: 7.3728Mhz
// Crystal: 4.6080Mhz

实验:做usart串行通讯实验
目的:了解及会使用usart串口
CPU:atmega8L
相关的5个寄存器:UCSRA,UCSRB,UCSRC,UDR,UBRR(UBRRH,UBRRL)
	         其中:UBRRH和UCSRC共用一个地址
******************************************************************/
/*配置:CKOPT=0,CKSEL3..0=1111,SUT1..0=11(65ms慢速上升电源)*/
#include <iom8v.h>
#include <macros.h>

#define  Fosc_4608  // 选择4.608M晶振crystal
#define  true    1
#define  false   0

#ifdef  Fosc_73728
#define baudrate   47   //波特率为9600b/s
//#define baudrate  191    //波特率为2400b/s
#endif

#ifdef  Fosc_4608
//#define baudrate  29 //波特率为9600b/s
#define baudrate  119 //波特率为2400b/s
#endif

/* UART Buffer Defines */
#define UART_RX_BUFFER_SIZE 32 
#define UART_TX_BUFFER_SIZE 32 
unsigned char UART_RX_buff[UART_RX_BUFFER_SIZE];
unsigned char UART_TX_buff[UART_TX_BUFFER_SIZE];

unsigned char Temp;
unsigned char Tx_Flag,Rx_Flag;
unsigned char Error_Flag;


void main(void)
{
	init_devices();
	init_data();
  
	while(1)  //forever
	   {
	     if(Rx_Flag == true)
	     	 {
	     	 	 UDR = Temp;//start send
				 Temp = 0;
	     	 	 //Rx_Flag = false;  //标志位在发送成功后,再清零
	     	 	 
	     	 }
	     if(Error_Flag == true)
	     	{
	     		if(Temp == 0x00)
	     			Rx_Flag = false;
	     		else
	     			Rx_Flag = true;
	     	}
	   }
}

void init_data(void)
{
  Temp = 0x33;
  Tx_Flag    = false;
  Rx_Flag    = false;
  Error_Flag = false;
}

#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
 //uart has received a character in UDR
 Temp = UDR;
 Rx_Flag = true;
}

#pragma interrupt_handler uart0_udre_isr:13
void uart0_udre_isr(void)
{
 //character transferred to shift register so UDR is now empty
 //UDR = temp;//have sent and reload 发送完,and重装
 Error_Flag = true;
}

#pragma interrupt_handler uart0_tx_isr:14
void uart0_tx_isr(void)
{
 //character has been transmitted
 Rx_Flag = false;//说明已发送成功 send successfully
}


void port_init(void)
{
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0x00;
}
//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
  
 UCSRB = 0x00; //disable while setting baud rate
 //UCSRB[RXCIE,TXCIE,UDRIE,RXEN,TXEN,UCSZ2,RXB8,TXB8]
 //Bit 7 – RXCIE: RX Complete Interrupt Enable

 UCSRA = 0x00;
 //UCSRA[RXC,TXC,UDRE,FE,DOR,PE,U2X,MPCM]
 
 UCSRC = (BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0));//设置成8位
 //UCSRC[URSEL,UMSEL,UPM1,UPM0,USBS,UCSZ1,UCSZ0,UCPOL]
 //位URSEL:寄存器选择("1"为UCSRC或"0"为UBRRH)
 //位UMSEL:工作模式选择(0为异步,1为同步)
 //位UPM1..0:为校验方式,硬件支持校验
 //位USBS:停止位选择(0为一位,1为两位)
 //位UCSZ0..2:发送位数选择(如果是8位:011)
 //位UCPOL:时钟极性(只在同步模式使用,异步应置为"0")
 
 //UBRRL = 0x2F; //set baud rate lo
 //UBRRH = 0x00; //set baud rate hi(设置波特率只用低四位,加起来一共12位)
 UBRR = baudrate; /* set the baud rate */
 
 UCSRB = ((1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN));
}

void twi_init(void)
{
 	TWCR = 0x00;
	TWBR = 0x20;
	TWSR = 0x00;
	TWAR = 0x00;
	TWCR = ((1<<TWEA)|(1<<TWEN));//TWINT???
	//TWCR[TWINT,TWEA,TWSTA,TWSTO,TWWC,TWEN,-,TWIE]
}

//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();
 twi_init();

 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

⌨️ 快捷键说明

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