单片机串口单片机串口通信

单片机串口通信,时钟频率11.0592串口通信波特率为9600,通过串口每隔一秒发送自己的名字,学号


#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

// 定义串口波特率和时钟频率
#define BAUD_RATE 9600
#define F_CPU 11059200UL

// 计算波特率寄存器的值
#define UBRR_VAL ((F_CPU / (16UL * BAUD_RATE)) - 1)

// 初始化串口
void UART_Init() {
  // 设置波特率寄存器
  UBRRH = (uint8_t)(UBRR_VAL >> 8);
  UBRRL = (uint8_t)UBRR_VAL;
  
  // 启用接收和发送
  UCSRB = (1 << RXEN) | (1 << TXEN);
  
  // 设置帧格式:8位数据位,无奇偶校验位,1位停止位
  UCSRC = (1 << UCSZ1) | (1 << UCSZ0);
}

// 发送一个字符
void UART_TransmitChar(uint8_t data) {
  // 等待发送缓冲区为空
  while (!(UCSRA & (1 << UDRE)));
  
  // 将数据放入发送缓冲区
  UDR = data;
}

// 发送一个字符串
void UART_TransmitString(const char* str) {
  uint8_t i = 0;
  
  // 逐个发送字符直到遇到字符串结束符'\0'
  while (str[i] != '\0') {
    UART_TransmitChar(str[i]);
    i++;
  }
}

int main() {
  // 初始化串口
  UART_Init();
  
  // 全局中断使能
  sei();
  
  while (1) {
    // 发送名字
    UART_TransmitString("Your Name\n");
    
    // 延时1秒
    _delay_ms(1000);
    
    // 发送学号
    UART_TransmitString("Your Student ID\n");
    
    // 延时1秒
    _delay_ms(1000);
  }
  
  return 0;
}

在这个示例中,首先定义了波特率和时钟频率的常量。然后,在UART_Init函数中,设置了波特率寄存器、启用接收和发送,以及设置帧格式。UART_TransmitChar函数用于发送单个字符,UART_TransmitString函数用于发送字符串。

在main函数中,首先调用UART_Init函数进行串口初始化,并启用全局中断。然后,使用无限循环来定时发送名字和学号,每隔一秒发送一次,通过UART_TransmitString函数进行串口发送。

你需要根据你所使用的单片机平台和编译环境进行适当的调整和配置,确保正确的引入所需的头文件和库。同时,也需要根据具体的串口引脚进行配置和连接。

请注意,此示例只提供了基本的串口通信功能,并没有包含错误处理、数据校验和接收功能。根据你的需求和具体的单片机平台,你可能需要进行更多的定制和功能扩展。

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7810850
  • 这篇博客你也可以参考下:第8课【通讯的基本概念】串行并行 单工半双工全双工 同步异步 比特率波特率
  • 除此之外, 这篇博客: 【蓝桥杯单片机(8)】串口通信详解附双串口代码中的 3.2串口发送函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 串口当然离不开数据的收发了,这里呢,咱最重要的就是对SCON寄存器的理解了,不太熟悉的看上面介绍

    1、怎么存放数据?

    SBUF这个寄存器,其实有俩,因为公用的同一地址,所以只有一个名字,具体的看上面介绍哈,咱把数据直接放里就好了,一个简单的赋值操作就行

    2、怎么判断数据送完了,然后停下来?

    方便大家and我查看,我复制下来了
    TI—发送中断标志位 TI =1,表示一帧数据发送结束。TI状态可供软件查询,也可申请中断。CPU响应中断后,在中断服务程序中向SBUF写要发送的下一帧数据。所以说每次发送的时候,咱就让代码停在这里,守着TI直到他等于1,结束这次发送方式0,串行发送的第8位数据结束时TI由硬件置“1”,在其他方式中,串行口发送停止位的开始时置TI为“1”。

    **TI必须由软件清“0”**这句话超重要,你每次发完了数据,TI必然要变成1,也就是一直停在发送结束这个状态。咱下次还要发,肯定要置0啊,它自己不能置零,需要我们给它赋值为0,
    这里有两种写法,第一种是软件查询,第二种是串口中断
    这里不建议使用第二种,为什么呢?TI=0就可以申请中断,这太麻烦了,而且串口会干扰咱,你根本不知道此时的TI=0是空闲状态还是发送状态?所以我们使用软件查询法,在查询时,关闭它的中断请求。

    //串口发送字符 
    void uart_send(unsigned char ch)
    {
      ES=0;   //关串口中断,
      SBUF=ch;
      while(TI==0);  //等待发送完成
      TI=0;  //清除中断标记
      ES=1;   //开中断
    }
    //串口1字符串发送
    void Uart1_Sendstring(unsigned char *Str) 
    { 
     ES=0;   //关串口中断
     while(*Str != '\0') 
     { 
    	 SBUF = *Str; 
    	 while(TI == 0); 
    	 TI = 0; 
    	 Str++; 
     } 
      ES=1;   //开串口中断
    }
    

    串口的写法,后面会有,也可以看看,不是不能用,

  • 您还可以看一下 炮哥带你学老师的快速带你入门深度学习与实战课程中的 3.8、逻辑回归模型训练和测试小节, 巩固相关知识点