51单片机字符串口通信为什么乱码?终于找到原因了

发布者:EtherealMelody最新更新时间:2022-05-25 来源: eefocus关键字:51单片机  字符  串口通信  乱码 手机看文章 扫描二维码
随时随地手机看文章

被这个问题卡了3天,代码很简单就是乱码出问题,烦恼!

后来查资料找到原因,晶振12MHz和11.0592Hz的问题。


如果你用的是12Mhz的单片机,定时器初值TH1一般要设置到E6(2400bps)、F3(4800bps)。


对应的在上位机配置UART串口时,选取2400 4800bps。如果试了不行,那就换更低的1200bps。


修改前

修改后

做了半天才发现我的晶振是11.0592Mhz,为啥对应的开发板视频讲的是12Mhz。


以4800bps为例,TH1=TL1=0xF4,SMOD=1,波特率翻倍=2*2400bps。这样就不会乱码了

-------------------------------------------分---割---线-----------------------------------


我看大家跟我初学51一样,有很多小问题。我把之前总结的word文档和工程(有详细备注)直接发出来吧。方便大家寻找。


链接:https://pan.baidu.com/s/1y2sR97rVwUw48-U64_rg1Q?pwd=Lu26 

提取码:Lu26


例如红外通信的学习笔记:

 

 

例如练习工程:

Uart单字节工程


/************************************************

******************

*实验现象:下载程序后,在串口发送助手上输入1发送后,会看到单片机发送到上位机的数字1。

*数据传输流程:1.上位机发送字符1; 2.单片机串口接收到1,然后单片机串口发送1给上位机; 3.上位机接收到字符1后显示出来

   

*实验目的: 验证串口发送功能

*注意事项:

1.串口助手的HEX显示和HEX发送的2个功能,使用时必须同时打开或关闭。


2.串口是可以同时收/发的,虽然都是用SBUF,但却是两个独立的寄存器,互不影响,只是都叫一个名,SBUF。

******************

************************************************/

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器

 

typedef unsigned int u16;   //对数据类型进行声明定义

typedef unsigned char u8;

 

 

void UsartInit()

{

SCON=0X50;    //确定串行口方式为1,且打开串行接受位REN

TMOD=0X20;    //选择定时器方式2

PCON=0X80;    //即SMOD=1,波特率翻倍2400bps*2    

TH1=0XF4;    //串口通信中,初值高8位等于初值低8位,即TH1=TL1

TL1=TH1;    //由串口工作方式1的波特率4800、T1溢出率、晶振是11.0592MHz计算得出   

ES=1;    //串行口中断允许位

EA=1;    //CPU中断允许(总允许)位

TR1=1;    //打开T1定时器

}     

  

  

void main()

{

UsartInit();  // 串口初始化

while(1);

}

 

 

void Usart() interrupt 4

{

u8 receiveData;

 

receiveData=SBUF; //接受缓冲寄存器,接受完以后RI硬件置1

RI = 0; //每接受1字节,RI需要软件置0

SBUF=receiveData; //发送缓冲寄存器,接受完以后TI硬件置1;   串口是可以同时收/发的,虽然都是用SBUF,但却是两个独立的寄存器,互不影响,只是都叫一个名,SBUF。

while(!TI); //TI=1时退出循环,代表单片机发送1个字符结束标志。

TI=0; //每发送1字节,TI需要软件置0

}  

关键字:51单片机  字符  串口通信  乱码 引用地址:51单片机字符串口通信为什么乱码?终于找到原因了

上一篇:8X8LED点阵的实现(51单片机、74HC595)
下一篇:DAC数模转换、PWM输出、呼吸灯

推荐阅读最新更新时间:2024-11-11 18:12

STM32串口通信printf重定向方法
在源程序中加入如下代码,包含“stdio.h”。 默认使用USART1,确认串口已经初始化成功、 #pragma import(__use_no_semihosting) _sys_exit(int x) { x = x; } struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; /*
[单片机]
51单片机读写RC522卡参考例程及上位机调试软件源码
原理图: 单片机源程序如下: #include reg52.h #include main.h #include mfrc522.h #include string.h //M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令 //4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反 unsigned char code data2 = {0x12,0,0,0}; unsigned char code DefaultKey = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; unsigned char g_u
[单片机]
<font color='red'>51单片机</font>读写RC522卡参考例程及上位机调试软件源码
51单片机 1602液晶显示控制代码
引脚的连接方式 _ :下面是对其各个引脚进行说明: 1 /*-- 2 REG52.H 3 4 Header file for generic 80C52 and 80C32 microcontroller. 5 Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc. 6 All rights reserved. 7 --*/ 8 9 #ifndef __REG52_H__ 10 #define __REG52_H__ 11 12 /* BYTE Registers */ 13 s
[单片机]
<font color='red'>51单片机</font> 1602液晶显示控制代码
MCS-51单片机实用子程序库--浮点数除法
标号: FDIV 功能:浮点数除法 入口条件:被除数在 中,除数在 中。 出口信息:OV=0时,商仍在 中,OV=1时,溢出。 影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 5字节 FDIV: INC R0 MOV A,@R0 INC R0 ORL A,@R0 DEC R0 DEC R0 JNZ DIV1 MOV @R0,#41H;被除数为零,不必运算 CLR OV RET DIV1: INC R1 MOV A,@R1 INC R1 ORL A,@R1 DEC R1 DEC R1 JNZ DIV2 SETB OV ;除数为零,溢出 RET DIV2: LCALL MVR0 ;将 传送到第一工作区中 MOV A,
[单片机]
多任务 多进程 51单片机C语言 完整版
*/ /* 1.本程序不使用任何汇编指令 2.由定时器T0产生中断,切换进程 3.由于中断或调用子程序,要把PC堆栈,故可以以SP为基址的地方找到PC 4.中断或子程序返回,要把SP出栈给PC,故可以操作SP改变程序入口 5.本程序经调试运行 电路图已上传 6.程序编译是会有一个警告提示,为正常现象,因为保存R0-R7时,重新定义地址, 出现地址覆盖的警告提示。 7.用户以此模板写程序只需写用户的进程子程序和用户初始化子程序,并把各进程参数 放在规定地方,各程序放在规定地方就可以;所有的任务调度已处理好。 */ //头文件 #include reg52.h //#include absacc.h //#incl
[单片机]
PIC196F877A串口通信程序
今天上午完成PIC16F877A与上位机的串口通信程序! 注意:使用MPLAB IDE C语言编程时,自定义头文件要使用 包含不能使用 串口与单片机的连线原理图 串口通信头文件 #ifndef T232_H #define T232_H #include main.h //定义一帧的开始和结束 #define FRAME_BEGIN 0x28//开始帧标志 #define FRAME_END 0x29//结束帧标志 void init_232() ; void send_str(const char *str) ; char get_char() ; void get_string(char *temp)
[单片机]
PIC196F877A<font color='red'>串口通信</font>程序
51单片机实现两片联级74HC595依次点亮且每次只能点亮一个
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: LED-74HC595 ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200526 ---- @ModifiedTime: 20200526 ---- @Description: 第9个至
[单片机]
<font color='red'>51单片机</font>实现两片联级74HC595依次点亮且每次只能点亮一个
51单片机的特殊功能寄存器(SFR)
在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为特殊功能寄存器(SFR)。这样的特殊功能寄存器51单片机共有21个并且都是可寻址的列表如下: 符号 地址 功能介绍 B F0H B寄存器 ACC   E0H 累加器 PSW   D0H 程序状态字 IP   B8H 中断优先级控制寄存器 P3   B
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved