自学AVR单片机十八(通用异步串行通信的程序实现)
串行中断0的程序设计:采用查询发送,中断接收的方式#include <AVR/io.h> #include <util/delay.h>#include <avr/interrupt.h> //中断函数头文件//常量声明#define BAUD 9600//全局变量声明unsigned char Transmit;//函数声明void Port_Init(void); //端口初始化配置void Usart_Init(void);//USART寄存器设置void Usart_PutChar(unsigned char cTXData);//字节发送函数void Usart_PutString(unsigned char *pcString);int main(void) {Port_Init();Usart_Init();Usart_PutString("恭喜你!马伟力");Usart_PutString("你的串口程序调试成功了!");sei(); //使能全局中断PORTB = 0xff;DDRB = 0xff;while(1){}}//端口状态初始化设置函数void Port_Init(){PORTE = 0X00; //USART0的发送接收端口分别为PE0和PE1DDRE |= (1 << PE1); //PE0为接收端口,置为输入口;PE1为发送端口,置为输出口}//USART0寄存器配置函数void Usart_Init(){UCSR0A = 0X00; UCSR0C |= (1 << UCSZ01) | (1 << UCSZ00);//异步,数据格式8,N,1 UBRR0L = (F_CPU / BAUD / 16 - 1) % 256; //波特率设置UBRR0H = (F_CPU / BAUD / 16 - 1) / 256;UCSR0B |= (1 << RXCIE0) | (1 << RXEN0) | (1 << TXEN0); //发送使能}//字节发送函数void Usart_PutChar(unsigned char cTXData){while( !(UCSR0A & (1 << UDRE0)) );//只有数据寄存器为空时才能发送数据UDR0 = cTXData; //发送数据送USART I/O数据寄存器-UDRPORTB = 0x00;}//接收中断函数ISR(USART0_RX_vect){unsigned char Rev;Rev = UDR0; //从USART I/O数据寄存器-UDR中读出数据Usart_PutChar(Rev); //将接收到的数据发送}void Usart_PutString(unsigned char *pcString){while (*pcString){Usart_PutChar(*pcString++);}Usart_PutChar(0x0D);Usart_PutChar(0x0A);//结尾发送回车换行}
串行中断1的程序设计:采用查询发送,中断接收的方式
#include <avr/io.h> #include <util/delay.h>#include <avr/interrupt.h> //中断函数头文件//常量声明#define BAUD 9600//函数声明void Port_Init(void); //端口初始化配置void Usart_Init(void);//USART寄存器设置void Usart_PutChar(unsigned char cTXData);//字节发送函数void Usart_PutString(unsigned char *pcString);int main(void) {Port_Init();Usart_Init();Usart_PutString("恭喜你!马伟力");Usart_PutString("你的串口程序调试成功了!");sei(); //使能全局中断//PORTB = 0xff;//DDRB = 0xff;while(1){}}//端口状态初始化设置函数void Port_Init(){PORTD = 0X00; //USART0的发送接收端口分别为PD2和PD3DDRD |= (1 << PD3); //PD2为接收端口,置为输入口;PD3为发送端口,置为输出口}//USART0寄存器配置函数void Usart_Init(){UCSR1A = 0X00; UCSR1C |= (1 << UCSZ11) | (1 << UCSZ10);//异步,数据格式8,N,1 UBRR1L = (F_CPU / BAUD / 16 - 1) % 256; //波特率设置UBRR1H = (F_CPU / BAUD / 16 - 1) / 256;UCSR1B |= (1 << RXCIE1) | (1 << RXEN1) | (1 << TXEN1); //发送使能}//字节发送函数void Usart_PutChar(unsigned char cTXData){while( !(UCSR1A & (1 << UDRE1)) );//只有数据寄存器为空时才能发送数据UDR1 = cTXData; //发送数据送USART I/O数据寄存器-UDR//PORTB = 0x00;}//接收中断函数ISR(USART1_RX_vect){unsigned char Rev;Rev = UDR1; //从USART I/O数据寄存器-UDR中读出数据Usart_PutChar(Rev); //将接收到的数据发送}void Usart_PutString(unsigned char *pcString){while (*pcString){Usart_PutChar(*pcString++);}Usart_PutChar(0x0D);Usart_PutChar(0x0A);//结尾发送回车换行}
页:
[1]