woshigeshuai 发表于 2022-4-26 11:47:41

51单片机C语言联合体如何使用



u8 apple_buff;
u32 apple1,apple2,apple3,apple4;


for(i=0;i<0x10;i++)apple_buff=0;// 字节操作16个字节清0,4个32位也清0了。想达到这个目的

如何 把8位数组跟4个32位数据关联。


sandoz1cn 发表于 2022-4-26 12:32:27

struct dd
{
u32;
u32;
u32;
u32;
};
union cc
{
struct dd;
u8 apple_buff;
};

ehengio 发表于 2022-4-26 14:08:05

union APPLE
{
    u8 apple_buff;
    u32 apple;
};
这样就好了,没必要用结构了。

woshigeshuai 发表于 2022-4-26 23:00:57

ehengio 发表于 2022-4-26 14:08
union APPLE
{
    u8 apple_buff;
(引用自3楼)

u8 apple_buff;                // 8位数组
; -----------------------------------
u32 apple1;                                // 32位的 16位的 浮点的变量   
u16 apple2;
u16 apple3,
float apple4;
float apple6;
实际 情况需要将这些数据 联合

woshigeshuai 发表于 2022-4-26 23:15:36

#include "reg52.h"

#define u8         unsigned char
#define u16 unsigned int
#define u32 unsigned long


struct VoltStruct
{
        u32 volt1;
        u32 volt2;
        u32 volt3;
        u32 volt4;
};
union cc
{
        struct VoltStruct voltAll;
        u8 volt_buff;
};
/*

*/
void main()
{
        volt1=0x11223344;
        volt2=0x55667788;
        volt3=0x99AABBCC;
        volt2=0xDDEEFF00;
       
        volt_buff=0;
        volt_buff=0;
        while(1)
        {
               
        }
}
写了一个测试程序编译不过

woshigeshuai 发表于 2022-4-26 23:26:14

#include "reg52.h"

#define u8         unsigned char
#define u16 unsigned int
#define u32 unsigned long


struct VoltStruct
{
        u32 volt1;
        u32 volt2;
        u32 volt3;
        u32 volt4;
};

struct VoltStruct voltAll;
u8 volt_buff;
union cc
{
        struct VoltStruct voltAll;
        u8 volt_buff;
};
/*

*/
void main()
{
        voltAll.volt1=0x11223344;
        voltAll.volt2=0x55667788;
        voltAll.volt3=0x99AABBCC;
        voltAll.volt4=0xDDEEFF00;
       
        volt_buff=0;
        volt_buff=0;   // 通过字节的方式 清0,仿真发现没有清0没有联合成功,哪里原因呢
        volt_buff=0;
        volt_buff=0;
        while(1)
        {
               
        }
}

t3486784401 发表于 2022-4-27 00:32:16

LZ 怎么这么热衷于用 U8 数组来清零呢?指针不香么?例如这样:

struct _DATPACK
{
uint32_tdw1;
uint32_tdw2;
floatfa;
floatfb;
} dat;

memset( &dat, 0x00, sizeof(dat) );      // 清零 dat 所有元素

uint8_t *ptr= (uint8_t *)&dat;
ptr= 0x12;            // 按字节访问
ptr= 0x56;            // 按字节访问
ptr= 0x00;            // 按字节访问



定义的话,也得是把数组和元素定义在一个 union 里,并且注意各元素需要再打包成一个 struct 避免重叠。形如:

union _DATPACK
{
struct _ELEM
{
    //...
};

uint8_tArray;    // 柔性数组
};

diyeyuye 发表于 2022-4-27 08:19:57

本帖最后由 diyeyuye 于 2022-4-27 08:21 编辑

woshigeshuai 发表于 2022-4-26 23:26
#include "reg52.h"

#define u8         unsigned char
(引用自6楼)

你没有用你定义的联合体类型声明一个变量,然后操作其变量才能改变联合体内成员的值。
例如:

struct VoltStruct
{
      u32 volt1;
      u32 volt2;
      u32 volt3;
      u32 volt4;
};
union cc
{
      struct VoltStruct voltAll;
      u8 volt_buff;
};

union cc testVar;//使用联合体声明一个变量
/*

*/
void main()
{      
        testVar.voltAll.volt1=0x12345678;
        testVar.voltAll.volt2=0x22345678;
      testVar.voltAll.volt3=0x32345678;
        testVar.voltAll.volt4=0x42345678;
      
      testVar.volt_buff=0;
      testVar.volt_buff=0;
      testVar.volt_buff=0;
      testVar.volt_buff=0;//上述清零会清除testVar.voltAll.volt1的值
      while(1)
      {
               
      }
}

woshigeshuai 发表于 2022-4-27 10:12:50

非常感谢大家的帮助,问题解决了。我现在是一个人干活状态,没有人交流。有问题只能咨询论坛。

laujc 发表于 2022-4-27 10:17:08

woshigeshuai 发表于 2022-4-27 10:12
非常感谢大家的帮助,问题解决了。我现在是一个人干活状态,没有人交流。有问题只能咨询论坛。 ...
(引用自9楼)

我现在也是一个人干活,有空多交流

lvxinchao-206 发表于 2023-7-27 15:12:38

我们也是 一个人的干活自己画板子, 自己写简单的程序

不舍的六年 发表于 2023-7-27 16:10:27

我也是一个人干活,画板子,写程序,有空多交流{:lol:}

lb0857 发表于 2023-7-27 22:19:43

ls四位可以组团啦

dianzichina 发表于 2023-8-22 09:54:20

组团的话,可以加我一个。
页: [1]
查看完整版本: 51单片机C语言联合体如何使用