C51单片机 串口收发 数据不一致(个人问题记录)

遇到的问题:
在这里插入图片描述
这是简单的将接收到的字符发送回去的程序,然而,发出去的01(十六进制,实际是0x01),收到的却是81。如果发出去02,收到82。发出去80,收到80。发出去9A,收到9A。也就是小于0x80的全部偏差了80,大于0x80的值不变。这个问题我摸索了一天,淦!

解决办法:
换了一个8051单片机和最小系统板,就能用了。(学校的普中单片机集成板不靠谱,淦)
在这里插入图片描述

原因猜测:
之前的晶振是11.97MHZ,之后的是11.12MHZ,推测这个晶振不要12MHZ,而是接近11MHZ的话实际生成的波特率偏差会在允许范围内。(推测12MHZ的9600波特率偏差大于7%,具体的可以下载波特率计算器算出)

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
好的,下面是一个基于C51单片机串口收发数据并在数码管上显示的示例程序。假设你已经选择了一款使用串口通信的数码管模块,并将其连接到了单片机的IO口上,同时你也准备好了另一台设备作为数据发送方。 ```c #include <REG52.H> sbit TXD = P3^1; // 串口发送引脚 sbit RXD = P3^0; // 串口接收引脚 sbit LED = P1^0; // 用于指示接收数据的LED灯 sbit DIG1 = P2^0; // 数码管第一位 sbit DIG2 = P2^1; // 数码管第二位 sbit DIG3 = P2^2; // 数码管第三位 sbit DIG4 = P2^3; // 数码管第四位 unsigned char code SEG_TABLE[] = { // 数码管显示表 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; void init_serial() { // 初始化串口 TMOD = 0x20; TH1 = 0xfd; TL1 = 0xfd; TR1 = 1; SCON = 0x50; ES = 1; EA = 1; } void send_byte(unsigned char ch) { // 发送一个字节 SBUF = ch; while (!TI); TI = 0; } void send_string(unsigned char *str) { // 发送一个字符串 while (*str) { send_byte(*str++); } } void display_number(unsigned int num) { // 在数码管上显示一个整数 unsigned char i, j, k; unsigned char buf[4]; // 数码管最多显示4位数 for (i = 0; i < 4; i++) { k = num % 10; buf[i] = k; num /= 10; } for (i = 0; i < 4; i++) { P0 = SEG_TABLE[buf[i]]; switch (i) { case 0: DIG1 = 0; break; case 1: DIG2 = 0; break; case 2: DIG3 = 0; break; case 3: DIG4 = 0; break; } for (j = 0; j < 10; j++) { // 延时一段时间,以便肉眼可见 } DIG1 = 1; DIG2 = 1; DIG3 = 1; DIG4 = 1; } } void main() { init_serial(); while (1) { // 在这里你可以编写其他的代码 } } void serial_isr() interrupt 4 { // 串口中断服务程序 unsigned char ch; if (RI) { RI = 0; ch = SBUF; LED = 1; // 接收数据时点亮LED灯 display_number(ch); // 在数码管上显示接收到的数据 } } ``` 在代码中,我们首先定义了串口发送接收的引脚,以及数码管显示的引脚。然后,我们定义了一个数码管显示表,用于将数字转换为数码管可以显示的格式。在主函数中,我们初始化了串口,并在一个无限循环中等待接收数据。当接收数据时,我们点亮了一个LED灯以表示数据已经接收到,并将接收到的数据在数码管上进行显示。 当然,这只是一个简单的示例程序,你需要根据自己的具体情况进行修改和完善。例如,你可能需要增加错误处理机制、增加数据校验等等。希望这可以帮助你开始进行相关的开发工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rory_wind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值