单片机串口通讯在12MHz下的问题

在12MHz晶振下,单片机串口通讯时,当波特率调至4800时,误差率高达7%,导致传输数据变为乱码。而在11.0592MHz下,由于没有误差,问题不复存在。总结建议,12MHz单片机应限制使用2400及以下波特率,避免波特率过高引发的通信错误。
摘要由CSDN通过智能技术生成

单片机串口通讯在12MHz的问题


首先想说单片机的12M远不如11.0592M,其问题之大折磨了我一下午
我使用的的晶振是12Mhz,虽然我知道12Mhz在计算波特率时会有误差,但我没想到这个误差会有上限(其实应该想到的)。 超过上限,误差太大会有问题。
下面我详细说一下我遇到的问题,关于波特率的计算公式这里就省去。
我以定时器1方式二计时,PCON=0(波特率不翻倍),为前提来展示。
在2400波特率下,一起都是那么美好:

   TMOD=0x20;
   TH1=0xF3;
   TL1=0xF3;
   SCON=0X50;
   PCON=0X00;
   TR1=1;
   ES=1;
   EA=1;

在这里插入图片描述
通过软件计算此时误差为0.16%,这是的我还没有意识到问题的严重在这里插入图片描述
然而当我把波特率调到4800时一切都变了:

   TMOD=0x20;
   TH1=0xF9;
   TL1=0xF9;
   SCON=0X50;
   PCON=0X00;
   TR1=1;
   ES=1;
   EA=1;

此时的误差率达到了7%!!!在这样的误差下所传输的都变成了乱码!!!
在这里插入图片描述
在这里插入图片描述
而这种问题在11.0592MHz下根本不会出现ÿ

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要在STM32单片机上实现串口通信,需要以下步骤: 1. 配置USART外设,包括波特率、数据位、停止位、校验位等参数。 2. 使能USART外设,使其能够正常工作。 3. 编写中断服务程序(如果需要),处理USART外设的中断。 4. 在主程序中调用USART外设的相关函数,实现数据的发送和接收。 下面是一个简单的示例代码,可以帮助您更好地理解如何在STM32单片机上实现串口通信: ``` #include "stm32f10x.h" void USART1_Init(void) { // 使能GPIOA和USART1的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); // 配置PA9为复用推挽输出模式 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置PA10为浮空输入模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置USART1的参数:波特率、数据位、停止位、校验位等 USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); // 使能USART1 USART_Cmd(USART1, ENABLE); } int main(void) { // 初始化USART1 USART1_Init(); while (1) { // 发送数据 USART_SendData(USART1, 'H'); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_SendData(USART1, 'e'); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_SendData(USART1, 'l'); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_SendData(USART1, 'l'); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_SendData(USART1, 'o'); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); // 接收数据 while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); uint8_t data = USART_ReceiveData(USART1); } } ``` 相关问题: 1. 如何在STM32单片机上配置串口通信的参数? 2. 如何发送数据到另一台设备? 3. 如何接收来自另一台设备的数据?
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值