USART 可以用中斷和輪詢,也可以用緩沖區(qū)做一個上層接口
*****************************************************************
//CPU:mega32
//編譯器:iar
//USART一般編程方式
#include <ioavr.h> void usart_init(void);
void put_char(char data);
void put_s(char *p);
char get_char( void );
char *get_s(char *p); #define Fosc 8000000
#define Baud 9600 char c = '\n';
char str[9];
int main(void)
{
usart_init(); put_s("acva");
while(1);
put_char( get_char() );
} void usart_init(void)
{ UCSRB = (1<<RXEN)|(1<<TXEN);//接收中斷允許,接收允許,發(fā)送允許
UCSRC = 0X86; //選擇UCSRC,異步模式,無校驗,1位停止位,8位數(shù)據(jù)位
UBRRH = (Fosc/16/Baud - 1)>>8; //選擇UBRRH,設(shè)置波特率
UBRRL = (unsigned char)(Fosc/16/Baud - 1);
} /*
#pragma vector=USART_RXC_vect
__interrupt void receive(void)
{
c = UDR;
put_char('[');
put_char(c);
put_char(']');
}
*/ char get_char( void )
{
while ( !(UCSRA & (1<<RXC)) );
return UDR;
} void put_char(char data)
{
while( !(UCSRA & (1<<UDRE)) );//查詢發(fā)送寄存器是否空
UDR = data;//將要發(fā)送的數(shù)據(jù)送入發(fā)送寄存器
}
//發(fā)送字符串
void put_s(char *p)
{
for(;*p!='\0';p++) //如果不是結(jié)束符,就發(fā)送
put_char(*p);
}
//接收字符轉(zhuǎn)
char *get_s(char *p)
{
char *p2 = p;
while(1)
{
*p = get_char();
put_char(*p);//回顯
if(*p == 0X0D)
{
*p = '\0';
break;
}
p++;
}
return p2;
}
******************************************************************
|