找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1794|回复: 16
打印 上一主题 下一主题
收起左侧

51单片机串口如何接受7位数的数据(10进制)

  [复制链接]
跳转到指定楼层
楼主
ID:149043 发表于 2023-5-23 16:50 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
麻烦大佬给个程序参考下
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2023-5-23 17:04 | 只看该作者
1. 用联合体
2. 用字符串
回复

使用道具 举报

板凳
ID:94031 发表于 2023-5-23 17:07 | 只看该作者
双方定义收发浮点数,串口4个字节就可实现7位10进制数收发。
回复

使用道具 举报

地板
ID:744809 发表于 2023-5-23 17:19 | 只看该作者
3个字节就可以了,比如1234567,你放到一个unsigned long的变量中,将右边24位分别放入一个3字节的buf中,buf[0] = temp_long >> 16;buf[1] = temp_long >> 8; buf[2] = temp_long & 0xFF;
然后发送这个数组就好了。接收到数据后通过左移操作还原成unsigned long变量即可
回复

使用道具 举报

5#
ID:824490 发表于 2023-5-23 17:22 | 只看该作者
串口收发的都是数据,都是“16进制”,“10进制'也是当成"16进制"来收发,其实对串口来说都是2进制,根本没有x进制这个说法,有的只是后数据的处理才出现什么10进制之类的
回复

使用道具 举报

6#
ID:824490 发表于 2023-5-23 17:25 | 只看该作者
卡住你的不是什么10进制,而是7位数。你可以开个缓存(7字节),收到第一个字节存入缓存第一个地址中,,,第7个存入7中。。。
回复

使用道具 举报

7#
ID:65956 发表于 2023-5-24 08:28 | 只看该作者
把接收到的数据屏蔽最高位(&07F),这样不就是把8位当7位接收了,不过这种在51单片机中是不得以的方法,在高级单片机就能设置相应的接收位数
回复

使用道具 举报

8#
ID:213173 发表于 2023-5-24 09:52 | 只看该作者
楼主语焉不详,地板回复应该是楼主想要的,但楼主未必能看明白。
回复

使用道具 举报

9#
ID:123289 发表于 2023-5-24 10:40 | 只看该作者
串口总是按字节一个一个的接收二进制数,它可不管什么这个数那个数的花花定义。
至于7位数据什么的,关键在于你如何将这个7位数据,按字节拆分(发送时)、组合(接收时,复原)。
回复

使用道具 举报

10#
ID:526543 发表于 2023-5-24 12:31 | 只看该作者
#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit RX = P3^0;   // 串口接收引脚

uchar receivedData = 0;  // 存储接收到的数据

// 串口初始化函数
void InitUART() {
    TMOD = 0x20;    // 设置定时器1为模式2(8位自动重装)
    SCON = 0x50;    // 设置串口工作在模式1(8位数据,可变波特率)
    TH1 = 0xFD;     // 设置波特率为9600,晶振频率11.0592MHz
    TR1 = 1;        // 启动定时器1
}

// 串口接收中断处理函数
void UART_ISR() interrupt 4 {
    if (RI) {  // 接收到数据
        RI = 0;  // 清除接收中断标志

        // 获取接收到的数据
        uchar data = SBUF;

        // 忽略最高位的数据位(第8位)
        receivedData = data & 0x7F;
    }
}

// 延时函数
void Delay(uint del) {
    uint i, j;
    for (i = 0; i < del; i++) {
        for (j = 0; j < 1827; j++) {
            // 空循环
        }
    }
}

void main() {
    InitUART();  // 初始化串口

    // 启用全局中断
    EA = 1;
    // 启用串口接收中断
    ES = 1;

    while (1) {
        // 在这里可以使用 receivedData 变量进行处理,比如打印到LCD等
        // 这里只是简单的延时示例,可根据需要修改
        Delay(100);
    }
}
回复

使用道具 举报

11#
ID:149043 发表于 2023-5-25 09:00 来自手机 | 只看该作者
123456ZXC1 发表于 2023-5-24 12:31
#include

#define uchar unsigned char

这个是7位数啊
,怎么能uchar
回复

使用道具 举报

12#
ID:149043 发表于 2024-6-6 11:40 来自手机 | 只看该作者
wulin 发表于 2023-5-24 09:52
楼主语焉不详,地板回复应该是楼主想要的,但楼主未必能看明白。

努力看明白
回复

使用道具 举报

13#
ID:149043 发表于 2024-6-6 16:37 来自手机 | 只看该作者
123156fsadf 发表于 2023-5-23 17:19
3个字节就可以了,比如1234567,你放到一个unsigned long的变量中,将右边24位分别放入一个3字节的buf中,b ...

数据收到了,接收到的数据是应该相加还是怎么做,前两位数据都是00H ,后两位数据如下图

image.jpg (695.98 KB, 下载次数: 21)

image.jpg

image.jpg (1.1 MB, 下载次数: 23)

image.jpg
回复

使用道具 举报

14#
ID:619259 发表于 2024-6-6 20:23 | 只看该作者
用数组,多少位都可以
回复

使用道具 举报

15#
ID:69038 发表于 2024-6-6 20:55 | 只看该作者
是7位数,还是7bit?两者是不同概念的。
前者开一个缓存,依次接收趣入即可,后者自定义数据类型,按需要处理后再存入。
回复

使用道具 举报

16#
ID:149043 发表于 2024-6-7 08:56 来自手机 | 只看该作者
格式化无悔 发表于 2024-6-6 16:37
数据收到了,接收到的数据是应该相加还是怎么做,前两位数据都是00H ,后两位数据如下图

我现在数据接收到了(4个字节),一个字节一个字节的收到的,但是不知道怎么组合起来,是应该相加还是怎么办,怎么把这四个字节的数据组合成10进制的数
回复

使用道具 举报

17#
ID:149043 发表于 2024-6-7 09:15 来自手机 | 只看该作者
123156fsadf 发表于 2023-5-23 17:19
3个字节就可以了,比如1234567,你放到一个unsigned long的变量中,将右边24位分别放入一个3字节的buf中,b ...

谢谢大佬,已解决
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表