油条大哥大 发表于 2024-2-12 23:11:53

自学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]
查看完整版本: 自学AVR单片机十八(通用异步串行通信的程序实现)