• 8051单片机中访问int中字节的方法


    在使用单片机中,unsigned int 占2个字节,unsigned char 占一个字节。而单片机是实行的字节寻址。16字节的bit寻址实在是不好用,

    不好用在不能建数组。

    在实际的开发过程中,要使用DPTR,还有定时器的TL0,TH0 的高低字节等。

    需要我们先定义一个int类型的可以用来赋值什么的比较自然。

    然后和0xff与得到低8,一个字节。可以放入DPTR的低字节或定时器的低字节。

    将int类型的左移8位后,再和0xff与得到int的高8位,一个字节,移入到DPTR的高字节或定时器的高字节。

    这样很麻烦。

    实际上,我们可以通过struct和union方便的直接一步到位的得到int 类型的高字节和低字节,同时也能观察到51单片机中int类型是如何存储的。

    可以发现,在51单片机中int的两个字节是连续的,高字节存放在低地址,低字节存放在高地址。哈哈

    具体的实现是:

    首先定义一个 INT_BYTE的结构体,里边是两个unsigned char

    然后定义一个union 是 一个无符号的int,和上边的定义的两个字节。

    我们指导union里的变量间是共享内存的。也就是 num,和 byte 两个变量所在的首地址是相同的!

    而 num,byte都是两个字节,那么byte中的两个字节h,l就是对应的num中的高,低字节。

    实验验证一下:

     我们定义了一个U16的变量hl ,给hl的num给了0xff0f 这个数值。

    然后我们给P0口给了低字节,P1口给了高字节。

    调试程序,打开端口,运行后:

    太好了,很轻松的就得到了int类型的高低8位。当然,把hl变量加入到

    watch窗口就更一目了然了!

    同样的道理,我们可以实验unsigned long 类型,他占有4个字节。同样高字节在低地址。

    这就是小端数据保存,python中struct解析时就有用到啊。记得好像时用 '<','>' 来标识的,

    看来学习单片机还能解疑释惑。

    最后,我们可以将这个自建为代码库,以提供复用。最后,放上代码:

    #include <intrins.h>
    #include "stc89.h"
    /*
    This code is written  by H.W. 
    at 12969722 at qq.com
    */
    struct INT_BYTE {
        unsigned char h;
        unsigned char l;
    };
    typedef union UINT16 {
        unsigned int num;
        struct INT_BYTE byte;
    } U16;
    
    struct BYTE_BIT {
        unsigned char a1;
        unsigned char a2;
        unsigned char a3;
        unsigned char a4;
    };
    typedef  union UBYTE {
        unsigned long  byte;
        struct BYTE_BIT b;
    } U8;
    
    void main(void){
        U16 hl;
        U8 ubit;
        hl.num=0xff0f;
        P0=hl.byte.l;
        P1=hl.byte.h;
        ubit.byte=0xf0f1f2f3;
    }

  • 相关阅读:
    判断一本书是否值得买
    【Python】对我自己的博客进行统计,看看哪年哪月发帖量最大
    在python中使用正则表达式(转载)
    【English】What is a Java StringWriter, and when should I use it?(转帖)
    【Java】利用java.io.PrintWriter写出文本文件
    [MySql]当虚拟机的IP地址自动更换后,JDBC使用原来的配置连不上MySql数据库时所报的异常。
    java中的lastIndexOf( )函数是什么意思
    day63_SpringMVC学习笔记_01
    day62_Mybatis学习笔记_02
    day61_Mybatis学习笔记_01
  • 原文地址:https://www.cnblogs.com/yjphhw/p/11352756.html
Copyright © 2020-2023  润新知