STM8学习笔记---union联合体的应用

平时用单片机编写程序经常会遇到将一个16位数拆封为两个8位数,或者将将两个8位数组成一个16位数。如:
data = data_h * 256 + data_l;
data_h = data / 256;
data_l = data % 256;
对于8位单片来说计算乘法和除法比较耗时,也比较浪费单片机资源。除了将乘法和除法转换为 左移 或者 右移运算外,有没有其他好的方法来解决这个问题。无意间看到了联合体之后,发现用联合体来解决这个问题是再好不过的。
关于联合体的定义:
在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。
数据类型可以共用一段内存,那么就可以让两个8位数和一个16位数共用一段内存就行了。这样在用两个8位数组成16位数的时候,可以分别存储两个 8位数,读取的时候直接读取16位数就行。一个16位数分成两个8位数的时候,直接存储16位数,然后分别读取两个8位数就行。 那么先写一段代码测试测试:


union Value
{
    unsigned char c[2];
    unsigned int i;

};

union Value v;
unsigned char data_h;
unsigned char data_l;
unsigned int data;

void main( void )
{
    SysClkInit();
    while( 1 )
    {
        data_h = 0x01;
        data_l = 0x02;
        v.c[0] = data_h;
        v.c[1] = data_l;
        data = v.i;
        data += 1000;
        v.i = data;
        data_h = v.c[0];
        data_l = v.c[1];
        v.i = 0;
    }
}

在联合体中定义一个字符数组,数组长度为2位,再定义一整形变量,这样两个字符变量和一个整形变量共享16位地址。然后在程序中先给字符数组中两个变量赋值,然后读取整形变量,看看整形变量的值是不是由两个字符变量组成的。然后再给整形变量赋值,观察两个字符变量是不是整形变量拆分的。
在这里插入图片描述
可以看到给c[0]赋值0x01,给c[1]赋值0x02, i 的值就变成了 0x0102,说明c[0]的值为高8位,c[1]的值为低8位。符合预期效果。然后再给0x0102加上1000,赋给i,看看c[0]和c[1]值得变化。
在这里插入图片描述
可以看到0x0102加上1000后变成了0x04EA,将0x04EA值赋给i后,c[0]的值变为了0x04,为高8位,c[1]的值变为了0xEA为低8位。看来这样使用联合体是正确的。
但是在实际应用的时候,用数组区分高8位和低8位不直观,而且容易搞混。能不能将数组直接换成两个变量?那么很自然的会想到最常用的结构体。用结构体来替换这个数组。于是修改程序如下。


union Data
{
    struct
    {
        unsigned char h;
        unsigned char l;
    };
    unsigned int i;

};

union Data d;
unsigned char data_h;
unsigned char data_l;
unsigned int data;

void main( void )
{
    SysClkInit();
    while( 1 )
    {
        data_h = 0x03;
        data_l = 0x04;
        d.h = data_h;
        d.l = data_l;
        data = d.i;
        data += 1000;
        d.i = data;
        data_h = d.h;
        data_l = d.l;
        d.i = 0;
    }
}

测试结果如下:

在这里插入图片描述
给h赋值0x03,给l赋值0x04,i的值变为0x0304.
在这里插入图片描述
将data的值0x0304加上1000后变为0x06EC,在赋给i,于是h的值变为0x06,l的值变为0xEC,结果正常。
通过联合体和结构体的组合使用,可以很轻松的组合或者拆分16位数。在以后的应用中就可以不使用乘除法来处理数据拆分组合问题了。

发布了76 篇原创文章 · 获赞 30 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_20222919/article/details/99574892