hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 614|回复: 0

自学AVR单片机十八(通用异步串行通信的程序实现)

[复制链接]

275

主题

454

帖子

1014

积分

大司空

Rank: 5Rank: 5

积分
1014
发表于 2024-2-12 23:11:53 | 显示全部楼层 |阅读模式
串行中断0的程序设计:采用查询发送,中断接收的方式
  1. #include <[url=http://www.mcuzx.net]AVR[/url]/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的程序设计:采用查询发送,中断接收的方式
  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);  //结尾发送回车换行}
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-11-1 13:36 , Processed in 0.086316 second(s), 22 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

快速回复 返回顶部 返回列表