微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Atmega16 单片机串口通信与外部中断介绍

Atmega16 单片机串口通信与外部中断介绍

时间:11-10 来源:互联网 点击:

I/O功能。

&8226; Bit 2 – UCSZ2:字符长度

UCSZ2与UCSRC寄存器的UCSZ1:0结合在一起可以设置数据帧所包含的数据位数(字符长度)。

&8226; Bit 1 – RXB8:接收数据位8

对9位串行帧进行操作时,RXB8是第9个数据位。读取UDR包含的低位数据之前首先要读取RXB8。

&8226; Bit 0 – TXB8:发送数据位8

对9位串行帧进行操作时,TXB8是第9个数据位。写UDR之前首先要对它进行写操作。

USART控制和状态寄存器C-UCSRC

&8226; Bit 7 – URSEL:寄存器选择

通过该位选择访问UCSRC寄存器或UBRRH寄存器。当读UCSRC时,该位为1;当写UCSRC时,URSEL为1。

&8226; Bit 6 – UMSEL: USART模式选择

通过这一位来选择同步或异步工作模式。

&8226; Bit 5:4 – UPM1:0:奇偶校验模式

这两位设置奇偶校验的模式并使能奇偶校验。如果使能了奇偶校验,那么在发送数据,发送器都会自动产生并发送奇偶校验位。对每一个接收到的数据,接收器都会产生一奇偶值,并与UPM0所设置的值进行比较。如果不匹配,那么就将UCSRA中的PE置位。

&8226; Bit 3 – USBS:停止位选择

通过这一位可以设置停止位的位数。接收器忽略这一位的设置。

&8226; Bit 2:1 – UCSZ1:0:字符长度

UCSZ1:0与UCSRB寄存器的UCSZ2结合在一起可以设置数据帧包含的数据位数(字符长度)。

&8226; Bit 0 – UCPOL:时钟极性

这一位仅用于同步工作模式。使用异步模式时,将这一位清零。UCPOL设置了输出数据的改变和输入数据采样,以及同步时钟XCK之间的关系。

USART波特率寄存器-UBRRL和UBRRH

UCSRC寄存器与UBRRH寄存器共用相同的I/O地址。

&8226; Bit 15 – URSEL:寄存器选择

通过该位选择访问UCSRC寄存器或
UBRRH寄存器。当读UBRRH时,该位为0;当写UBRRH时,URSEL为0。

&8226; Bit 14:12 –保留位

这些位是为以后的使用而保留的。为了与以后的器件兼容,写UBRRH时将这些位清零。

&8226; Bit 11:0 – UBRR11:0: USART波特率寄存器

这个12位的寄存器包含了USART的波特率信息。其中UBRRH包含了USART波特率高4位,UBRRL包含了低8位。波特率的改变将造成正在进行的数据传输受到破坏。写UBRRL将立即更新波特率分频器

进行通信之前首先要对USART进行初始化。初始化过程通常包括波特率的设定,帧结构的设定,以及根据需要使能接收器或发送器。对于中断驱动的USART操作,在初始化时首先要清零全局中断标志位(全局中断被屏蔽)

串口初始化:

使用串口->使能接收->使能发送->波特率(本例使用9600)->奇偶校验(disable)->数据位数(8bit)->中断(RX Complete interrupt

//ICC-AVR application builder : 2007-5-10下午08:51:56

// Target : M16

// Crystal: 11.059Mhz

//UART0 initialisation

// 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

UCSRA = 0x00;

UCSRC = 0x86;

UBRRL = 0x47; //set baud rate lo

UBRRH = 0x00; //set baud rate hi

UCSRB = 0x98;

}

//省略了端口初始化

//call this routine to initialise all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

port_init();

uart0_init();//注意这句调用串口初始化

MCUCR = 0x00;

GICR= 0x00;

TIMSK = 0x00; //timer interrupt sources

SEI(); //re-enable interrupts

//all peripherals are now initialised

接收模块(中断接受):

#pragma interrupt_handler uart0_rx_isr:12

void uart0_rx_isr(void)

{

//uart has received a character in UDR

Data = UDR;

}

注意:Data必须是全局变量才能从函数中返回得到的值。

发送模块(查询发送):

void USART_Transmit( unsigned char data )

{

/* Wait for empty transmit buffer */

while ( !( UCSRA & (1

/* Put data into buffer, sends the data */

UDR = data;

}

小提示:

如果接受到一个字符后,马上回复,只需要在接收中断函数的最后写值到UDR中即可:

如:#pragma interrupt_handler uart0_rx_isr:12

void uart0_rx_isr(void)

{ //uart has received a character in UDR

Data = UDR;//从电脑接收的数据附值给变量Data

UDR = Send_data;//将要发送的数据放到缓存区Send_data与Data可以相同

}

注:Send_data,Data必须是全局变量才能从函数中返回得到的值。

外部中断

首先回顾一下中断的含义。所谓中断,是指当计算机执行正常程序时,系统中出现某些急需处理的异

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top