Atmega16 单片机串口通信与外部中断介绍
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必须是全局变量才能从函数中返回得到的值。 二 外部中断 首先回顾一下中断的含义。所谓中断,是指当计算机执行正常程序时,系统中出现某些急需处理的异
Atmega16单片机串口通信外部中 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
