<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Atmega128串口詳解

Atmega128串口詳解

作者: 時(shí)間:2016-11-23 來(lái)源:網(wǎng)絡(luò ) 收藏
Atmega128有兩個(gè)串口:USART0與USART1
以USART0為例
串口的初始化包括:
傳輸模式的選擇:同步還是異步,默認為異步模式,可通過(guò)選擇USART控制和狀態(tài)寄存器UCSR0C中的UMSEL位來(lái)選擇,UMSEL為0,是異步模式.
波特率的設置:通信的雙方都必須有相同的波特率,波特率可以通過(guò)設置波特率發(fā)生寄存器UBRR0來(lái)確定,UBRR0為兩字節16位的寄存器,可分為UBRR0H和UBRR0L.同時(shí)起作用的還有UCSR0A中的波特率加倍位UX2,當UX2為1時(shí)設置的波特率加倍.
傳輸幀格式的設置:默認是8位數據位,一位停止位
發(fā)送接受的使能與中斷:通過(guò)設置UCSR0B來(lái)根據需要選擇接收或發(fā)送的使能和是否使用中斷,對使用中斷的USART操作,初始化前要關(guān)閉中斷
USART0的控制和狀態(tài)寄存器有:UCSR0A,UCSR0B,UCSR0C,波特率寄存器有UBRR0,即UBRR0H和UBRR0L,數據寄存器為UDR0
1、初始化:
設置波特率前,要關(guān)閉USART0的所有使用,包括使能和中斷:
UCSR0B=0B00000000; //關(guān)閉USART0
2、設置UCSR0A:
UCSR0A能寫(xiě)的有Bit0,Bit1,Bit6,其他5位為狀態(tài)位.我們一般使用的有Bit1-U2X0,當這一位為1時(shí),波特率的分頻因子從16降到8,能夠有效的將異步通信模式的傳輸速率加倍,但是這一位僅對異步操作有影響,使用同步操作時(shí)應將此位清零.
UCSR0A=0B00000000; //不使用倍速發(fā)送
3、設置UCSR0C:
Bit6-UMSEL0:USART0的模式選擇,0為異步模式,1為同步模式
Bit5:4-UPM01:0:奇偶校驗模式,00禁止,01,保留,10偶校驗,11,奇校驗
Bit3-USBS0:停止位的選擇,0停止位為1bit,1停止位為2-bits
Bit2:1-UCSZ01:0:字符長(cháng)度,當UCSZ02為0時(shí),00表示5位,01表示6位,10表示7位,11表示8位.當UCSZ02為1時(shí),11表示9位.(UCSZ02為UCSR0B里的一位寄存器)
eg:
UCSR0C=0B00000110 //異步模式,禁止奇偶校驗,停止位為1位,數據位為8位
4、設置UBRR:
UBRR的設置和這些參數有關(guān):U2X0,CPU頻率,波特率
當U2X0為0時(shí),即異步正常模式下,UBRR的計算公式:
1、U2X=0時(shí)的公式計算
UBRR0L= (F_CPU/BAUDRATE/16-1)%256;
UBRR0H= (F_CPU/BAUDRATE/16-1)/256;

2、U2X=1時(shí)的公式計算
UBRRL= (F_CPU/BAUDRATE/8-1)%256;
UBRRH= (F_CPU/BAUDRATE/8-1)/256;
//也可根據數據手冊的[波特率設置的例子]查得
//UBRRL = 0x2F; //set baud rate lo
//UBRRH = 0x00; //set baud rate hi
設置一般會(huì )有誤差,誤差計算方法為:Error[%]=(BaudRate_ture/BaudRate-1)*100%;
5、然后就是設置UCSR0B:
Bit7-RXCIE0為接收結束中斷使能,Bit6-TXCIE0為發(fā)送結束中斷使能,Bit4-RXEN0為接收使能,Bit3-TXEN0為發(fā)送使能.一般情況下,接收使用中斷方式,所以使用接收結束中斷使能.
UCSR0B=0B10011000 //發(fā)送接收使能,接收結束使能
還一種寫(xiě)法是UCSR0B|=(1<< RXEN0)|(1<< TXEN0)|(RXCIE0);
如果更熟練,可以直接以10進(jìn)制活16進(jìn)制來(lái)設置這些寄存器:
UCSR0B=0x98;或者UCSR0B=152;

串口的初始化函數:
void uart_init(void) //串口0初始化
{
UCSR0B=0x00; //disable while setting baud rate
UCSR0A=0B00000000; //Bit1為1則倍速發(fā)送 U2X=0
UCSR0C=0x06; //B00000110 //奇偶模式無(wú),八位數據位,一位停止位
UBRR0L=103; //B00011001波特率:9600 Bps
UBRR0H=0x00; //誤差率:0.156%
UCSR0B=0x98;
}
初始化之后就是對USART0進(jìn)行讀寫(xiě)了.
UCSR0A的Bit5-UDRE0標志指出發(fā)送緩沖器UDR0是否準備好接收新數據,UDRE0為1說(shuō)明緩沖器為空,可以接收新數據,UDRE0標志也可用來(lái)產(chǎn)生寄存器空中斷.復位后的UDRE0置位,表明發(fā)送器已經(jīng)就緒:
當UDRE0為1時(shí)!(UCSR0A&(1<< UDRE0))為0
void putchar(uchar c) //串口0發(fā)送字符
{
while(!(UCSR0A&(1<< UDRE0))); //while(!(UCSR0A&32)); 表明發(fā)送器已經(jīng)就緒。
UDR0=c;
}
串口0發(fā)送字符串:
void putstr(uchar *s) //串口0發(fā)送字符串
{
while(*s)
{
putchar(*s);
s++;
}
}
RXC0為UCSR0A里的Bit7位,為USART0接收結束的狀態(tài)位,接收緩沖器中有未讀出的數據時(shí)RXC0置位,否則清零.
串口0接收字符:
uchar getchar(void) //串口0接收字符
{
while(!(UCSR0A&(1<< RXC0)));
return UDR0;
}
在使用串口的程序中一般包含這些文件:
#include
#include
#include
#include
avr/io.h里有各種寄存器的定義,avr/signal.h,avr/interrupt.h里有中斷的定義,avr/delay.h包含延時(shí)函數.

例程:
串口通信(USART0)
/***************************************************************************/
/*串口0測試程序 */
/*目標器件:ATmega128 */
/*晶振:RC 8MHZ */
/*編譯環(huán)境:ICCAVR 7.13A */
/*時(shí)間:2010年3月14日*/
/*E-Mail:number007cool@163.com */
/***************************************************************************/
/*********************************包含頭文件********************************/
#include
#include
/***********************************宏定義**********************************/
#define fosc 8000000 //晶振8MHZ
#define baud 2400//波特率
/****************************************************************************
函數功能:uart0初始化程序
入口參數:
出口參數:
****************************************************************************/
void uart0_init(void)
{
UCSR0B = 0x00; //關(guān)閉UART00
UCSR0A = 0x00; //不使用倍速發(fā)送(異步)
UCSR0C =(1<UBRR0L=(fosc/16/(baud+1))%256; //異步正常情況下的計算公式
UBRR0H=(fosc/16/(baud+1))/256;
UCSR0B =(1<}
/****************************************************************************
函數功能:uart0發(fā)送單字節數據
入口參數:c
出口參數:
****************************************************************************/
void putchar0(unsigned char c)
{
while (!(UCSR0A&(1< UDR0=c; //將要發(fā)送的數據裝入UDR0寄存器
}

/****************************************************************************
函數功能:uart0接收單字節數據
入口參數:
出口參數:
****************************************************************************/
unsigned char getchar0(void)
{
while(!(UCSR0A& (1< return UDR0;
}

/****************************************************************************
函數功能:uart0發(fā)送字符串數據
入口參數:*s
出口參數:
****************************************************************************/
void puts0(char *s)
{
while (*s)
{
putchar0(*s);
s++;
}
putchar0(0x0a);//回車(chē)換行
//putchar0(0x0d);
}

/****************************************************************************
函數功能:主程序
入口參數:
出口參數:
****************************************************************************/
void main(void)
{
unsigned char i;
uart0_init();//UART0初始化
puts0("HELLO!");
while(1)
{
puts0("test ok!");
}
}

串口通信(USART1)
/***************************************************************************/
/*串口1測試程序 */
/*目標器件:ATmega128 */
/*晶振:RC 8MHZ */
/*選用的波特率:9600(也可以另外設定),改了波特率后需要將電源拔了再插上方可使用*/
/*編譯環(huán)境:ICCAVR 7.13 */
/*E-Mail:number007cool@163.com */
/*時(shí)間:2010年1月14日 */
/***************************************************************************/
/*********************************包含頭文件********************************/
#include
#include
/***********************************宏定義**********************************/
#define fosc 8000000 //晶振8MHZ
#define baud 9600//波特率
/****************************************************************************
函數功能:uart1初始化程序
入口參數:
出口參數:
****************************************************************************/
void uart1_init(void) //USART1初始化
{
UCSR1B = 0x00; //關(guān)閉USART1
UCSR1A = 0x00; //不適使用倍速發(fā)送
UCSR1C = (1<UBRR1L=(fosc/16/(baud+1))%256;//異步正常模式下,UBRR的計算公式
UBRR1H=(fosc/16/(baud+1))/256;
UCSR1B =(1<}
/****************************************************************************
函數功能:uart1發(fā)送單字節數據
入口參數:c
出口參數:
****************************************************************************/
void putchar1(unsigned char c)//串口1發(fā)送字符
{
while (!(UCSR1A&(1< UDR1=c;
}

/****************************************************************************
函數功能:uart1接收單字節數據
入口參數:
出口參數:
****************************************************************************/
unsigned char getchar1(void) //串口1接回收數據
{
while(!(UCSR1A& (1< return UDR1; //將接收到的字符返回
}

/****************************************************************************
函數功能:uart1發(fā)送字符串數據
入口參數:*s
出口參數:
****************************************************************************/
void puts1(char *s)
{
while (*s)
{
putchar1(*s);
s++;
}
putchar1(0x0a);//回車(chē)換行
putchar1(0x0d);
}

/****************************************************************************
函數功能:主程序
入口參數:
出口參數:
****************************************************************************/
void main(void)
{
unsigned char i;
uart1_init();
puts1("HELLO!");
while(1)
{
puts1("test ok!");
}
}



關(guān)鍵詞: Atmega128串口詳

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>