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

📄 uart-16sm._c

📁 大量ATMEGA16实例, 都可以运行,包括驱动LCD1602, 上位机显示等多功能
💻 _C
字号:
// Title: 		UART-16sm.c
/* UCSRA: Control & Status Register A
   b7-RXC: 	USART receive complete
   b6-TXC: 	USART transmit complete
   b5-UDRE:	USART Data register empty
   b4-FE:	Frame Error
   b3-DOR:  Data overtun
   b2-PE: 	Parity error
   b1-U2X: 	double the USART transmission speed
   b0-MPCM: multi-processor communication mode
   
   USARB
*  b7-RXCIE: RX complete interrupt enable
   b6-TXCIE: TX complete interrupt enable
   b5-UDRIE: USART data register empty interrupt enable
*  b4-RXEN:	 Receiver enable
*  b3-TXEN:  Transmitter enable
   b2-UCSZ2: chracter size     	 ------->0
   b1-RXB8	 receive data bit 8
   b0-TXB8:	 Transmit data 8
   
   UCSRC
*  b7-URSEL: register select   	 0/UBRRH,	  1/UCSRC
   b6-UMSEL: USART mode select 	 0/Asyn		  1/Synchronous
   b5-UPM1:  -------- Parity mode 00/disable, 01 reserved
   b4-UPM0:	 -------- 		 	  10 even,	  11 odd 
   b3-USBS:	stop bit selection 0/1-bit, 1/2-bit
*  b2-UCSZ1	 		  	   	   --------> 1
*  b1-UCSZ0  				   --------> 1
   b0-UCPOL: clock polarity	  0 rising XCK edge, 1 falling XCK edge  
*/


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

#pragma interrupt_handler uart_rx_isr: 12

unsigned char RecBuf[40];
int rec_head=0, rec_tail=0;
unsigned rec_data;

void uart_rx_isr(void)
{
 RecBuf[rec_head]=UDR;
 rec_head++;
 if(rec_head>=40)
 	rec_head=0;			  
}

void port_init(void)
{
 DDRA  = 0xFF;		//set PortA output
 DDRB  = 0xff;		//set PORTB output
 DDRC  = 0x00;		//set PORTC output
 PORTC = 0xff;
 DDRD  = 0x7f;		//set PD.7 input for RX
}

void USART_init(void)
{
 UCSRB=0x00;
 UCSRA=0x00;
 UCSRB=0b10011000;	 //b7: RXCIE enabeled, b4: RXEN enabled, B3: TXEN enabled
 UBRRH=0x00;		 //
 					 //Crystal=16MHx
 //UBRRL=103;		 //Bausdrate=9600 tested work fine
 //UBRRL=51;		 //Baudrate=19200 tested work fine
 UBRRL=25;		 	 //Baudrate=38400 tested work fine
 //UBRRL=8;	 		 //Baurate=115200 tested work fine
 UCSRC=0b10000110;	 //Asyn, No parity, 1-stop, 8-bit, rising edge
 memset(RecBuf, 0, sizeof(RecBuf));
 rec_head=0;
 rec_tail=0;
} 

void delay(int count)
{
 int i, j;
 for(i=count; i>0; i--)
    for(j=10; j>0; j--)
	   ;
}

void transmit(unsigned char abyte)
{
 UDR=abyte;
 while(!(UCSRA&0b01000000))	//b6=1 TXE
	  ;
}
//*****************************************************************
void main(void)
{
 unsigned char outa=0b01010101, outb=0b10101010, outc=0x00, outd=0x00;
 int dswin;
 port_init();
 USART_init();
 SEI();
 while(1)
   {
    WDR();				  	//Watchdog reset
	if(rec_head!=rec_tail)
	   {
	    rec_data=RecBuf[rec_tail];
		rec_tail++;
		if(rec_tail>=40)
		   rec_tail=0;
		   
		dswin=rec_head<<2;
	    PORTD=dswin;
		PORTA=rec_data;
		transmit(rec_data);
		if(rec_data==13)
			transmit(10);			
		
	   } 
   }
}

⌨️ 快捷键说明

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