基於AVR的串列埠與PC機通訊程式碼(uart8位資料)

wsqyouth發表於2015-01-25

為了以後根據此程式碼繼續改進功能,特意把程式碼放在此處,也和大家一起學習。

/************************************

AVR時鐘:8.00MHz

*波特率9600(51)8位資料,1位停止,當波特率設定為19200時,UBRR=25,4800=103

*注:波特率設定9600最佳,別的資料不穩定,不同波特率對應的UBRR值參考手冊

*PC機向開發板傳送一個字元,開發板將其大寫字母回寫給PC機
***********************************/
#include<iom16v.h>
#include<macros.h>


void USART_Init( unsigned int baud )
{
/* 設定波特率,baud的值查資料手冊*/
UBRRH = (unsigned char )(baud>>8);
UBRRL = (unsigned char )baud;
/* 接收器與傳送器使能*/
UCSRB = (1<<RXEN)|(1<<TXEN);
/* 設定幀格式: 8 個資料位, 2個停止位*/
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}


void USART_Transmit( unsigned char data )
{
/* 等待傳送緩衝器為空 */
while ( !( UCSRA & (1<<UDRE)) )
;
/* 將資料放入緩衝器,傳送資料 */
UDR = data;
}




unsigned char USART_Receive( void )
{
/*等待接收資料*/
while ( !(UCSRA & (1<<RXC)) )
;
/* 從緩衝器中獲取並返回資料*/
return UDR;
}
void main()
{
unsigned char cr;
DDRD=0X02;  //埠PD2(TXD)輸出,埠PD1(RXD)輸入上拉
PORTD=0XFF;
//CLR_PORTD(BUZZER);
USART_Init(51);  //波特率對應的UBRR值做形參初始化
while(1)
{
cr = USART_Receive();
cr-=32;
USART_Transmit(cr);
}
}
//大寫字母和小寫字母的ASCII碼相差32,如果PC機傳送的是非小寫字母,開發板可能會發回亂碼。

相關文章