51单片机和计算单片机串口通信信,不断收到乱码如何解决?

查看: 1047|回复: 2
求助!!关于51单片机串口通信,汉字显示乱码问题
用51单片机写了一个单片机给PC发送数据的程序。发送的是一段汉字,前一半的汉字显示正常,后一半的汉字显示为乱码。代码如下:
#include&reg51.h&
void uartconfig();
void delay10ms(unsigned int c) ;
unsigned char dat[26]=&小明是仇桥镇三门村六组人士&;
void main()
& & & & uartconfig();
& & & & while(1)
& & & & & & & & for(i=0;i&26;i++)
& & & & & & & & {
& & & & & & & & & & & & SBUF=dat[i];
& & & & & & & & & & & & while(TI==0);
& & & & & & & & & & & & TI=0;
& & & & & & & & }
& & & & & & & & delay10ms(50);
& && && &}
void uartconfig()
& & & & SCON=0x40;
& & & & TMOD=0x20;
& & & & PCON=0x80;
& & & & TL1=0xf3;
& & & & TH1=0xf3;
& & & & TR1=1;
void delay10ms(unsigned int c)& &
& & unsigned char a,
& && && && && && && & for (;c&0;c--)
& & & & & & & & & & & & for (b=38;b&0;b--)
& & & & & & & & & & & & & & & & for (a=130;a&0;a--);& && &
显示的结果见附件
(130.91 KB, 下载次数: 22)
15:42 上传
 这是keil 的问题。有一个补丁可以解决。
汉字库中每个区中都有一个字,区位码的低位字节是“FDH”的,被KEIL过滤掉了。如“三”、“电”、“庚”等等。
也可以直接用这些字的区位码,而不用汉字。
这是keil 的问题。有一个补丁可以解决。
汉字库中每个区中都有一个字,区位码的低位字节是“FDH”的,被KE ...
谢谢说明,确实是那个问题。不过网上的晓奇的补丁不知道为什么我用不了,一直是c51.exe haven't change.
浏览过的版块
Powered by原文出处:/cobain_731/blog/static/2/
我使用的是stc的89c52rc型号,晶振是12m。是因为买的最小系统就是这个频率。使用波特率位9600,将TL、TH都设置成0xfd后不管是英文还是中文的都是乱码。
12M的晶振波特率只能是2400,9600的情况下会有7.8%的误差,所以会产生乱码,而2400波特率的情况下误差是0.16%,这样就不会产生乱码了,TH1和TL1都设为F3(摘自百度)
为什么51单片机的晶振一般使用11.0592?
用11.0592晶振的原因是51单片机的定时器导致的。用51单片机的定时器做波特率发生器时,如果用11.0592Mhz的晶振,根据公式算下来需要定时器设置的值都是整数;如果用12Mhz晶振,则波特率都是有偏差的,比如9600,用定时器取0XFD,实际波特率10000,一般波特率偏差在4%左右都是可以的,所以也还能用
STC90C516 晶振12M 波特率9600 ,倍数时误差率6.99%,不倍数时误差率8.51%,数据肯定会出错。 这也就是串口通信时大家喜欢用11.0592MHz晶振的原因,在波特率倍速时,最高可达到57600,误差率0.00%。 用12MHz,最高也就4800,而且有0.16%误差率,但在允许范围,所以没多大影响。#include &REGX52.H&#include &stdio.H&void UartInit(void)
//9600bps@12.000MHz{ SCON = 0x50;
//8位数据,可变波特率 TMOD |= 0x20;
//设定定时器1为16位自动重装方式 TL1 = 0xF3;
//设定定时初值 TH1 = 0xF3;
//设定定时初值 ET1 = 0;
//禁止定时器1中断 TR1 = 1;
//启动定时器1 EA = 1;}void delay_ms(int ms){ int j = 1000; while(--ms);
while(--j);}void send_byte(unsigned char c){ SBUF = c; while(!TI); TI = 0;}void send_str(unsigned char *s){ while(*s != '\0') {
send_byte(*s);
s++; }}void main(){ UartInit(); while(1) {
send_str("hello,男孩\n");
delay_ms(1000000); }}
阅读(...) 评论()51单片机串口发送字符串给电脑自己写了程序但出不了结果#includeunsignedcharcodeL1[]="";unsignedcharcodeL2[]="";
51单片机串口发送字符串给电脑
自己写了程序但出不了结果
unsigned char code L1[] = "";
unsigned char code L2[] = "";
void delay(void)
unsigned char n,m;
for(m=0;m&200;m++)
for(n=0;n&250;n++);
void send_str()
unsigned i = 0;
while(L1[i]!='');
SBUF = L1[i];
while(!TI);
// 等特数据传送
// 清除数据传送标志
void main ()
TMOD = 0X20;
SCON = 0X40;
PCON = 0X00;
send_str();
但就是找不到错
用串口调试助手看看,是发的错误还是收的错误。
【云栖快讯】阿里云数据库MySQL金融版发布,实现日志多副本同步复制,提供金融级可靠性!8月10日,阿里云数据库掌门人褚霸等大牛直播,揭开它的背后故事!赶紧报名吧&&
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
RDS是一种稳定可靠、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、PostgreSQL、高...

我要回帖

更多关于 单片机串口通信程序 的文章

 

随机推荐