这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 【STCAi8051U】Ai8051U单片机中long型数据在内存中的存储方式

共1条 1/1 1 跳转至

【STCAi8051U】Ai8051U单片机中long型数据在内存中的存储方式

专家
2026-02-24 22:18:27     打赏

最近在学习STC单片机的示例程序中,看到有一个合成转化char数据位long型数据的处理,为此想了解下long型数据在内存中是如何处理的,于是编写下面的程序进行测试:

// 工作主频 11.0592MHz

#include "Ai8051U.H"
#include "intrins.h"
#include "stdio.h"
#include "string.h"

#define FOSC 11059200UL //定义为无符号长整型,避免计算溢出
#define BRT (65536 - (FOSC / 115200+2) / 4)   //加 2 操作是为了让 Keil 编译器,自动实现四舍五入运算


bit busy1;
char wptr1;
char rptr1;
char buffer1[64];

// 测试使用Timer2作为串口的波特率发生器
void Timer2Init(void) {
    T2L = BRT;
    T2H = BRT >> 8;
    S1BRT = 1;  // S1BRT:串口1的波特率发生器选择位: 0-选择定时器1作为波特率发生器;1-选择定时器2作为波特率发生器(默认) 
    T2x12 = 1;
    T2R = 1;    
}

// 串口P3.6(RXD),P3.7(TXD)
//---------------------------------------------------------------
void Uart1Isr() interrupt 4 {
    if (TI) {
        TI = 0;
        busy1 = 0;
    }
    if (RI) {
        RI = 0;
        buffer1[wptr1++] = SBUF;
        wptr1 &= 0x0f;
    }
}

void Uart1Init() {
    SCON = 0x50;  //
    wptr1 = 0x00;
    rptr1 = 0x00;
    busy1 = 0;
    
    P_SW1 |= 0x40;   // 选择P3.6,P3.7,因为擎天柱开发板上不提供P3.0,P3.1引脚
}

void Uart1Send(char dat) {
    while (busy1);
    busy1 = 1;
    SBUF = dat;
}

void Uart1SendStr(char *p) {
    while (*p) {
        Uart1Send(*p++);
    }
}

unsigned long val = 0;

void main(void) {
    int i = 0;
    unsigned char* b;
    unsigned char buff[64] = {'\0'};
  
    EAXFR = 1;  // 允许访问扩展的特殊寄存器, XFR
    //(32 位模式请使用这句,注释下一句 )
    //  P_SW2 |= 0x80;  // 允许访问扩展的特殊寄存器, XFR
    //(8 位模式请使用这句,注释上一句 )
    WTST = 0; // 设置取程序代码等待时间,
    // 赋值为 0 表示不等待,程序以最快速度运行
    CKCON = 0; // 设置访问片内的 xdata 速度,
    // 赋值为 0 表示用最快速度访问,不增加额外的等待时间
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;


    // 初始化定时器2
    Timer2Init();
    
    // 初始化串口1
    Uart1Init();
    
    // 用户变量初始化
    val = 0x01020304;  

    // 允许串口中断
    ES = 1;
    
    EA = 1;
    
    // 获取long型数据的内存地址
    b = &val;
    
    sprintf(buff, "\r\nval = 0x%08lx", val);
    Uart1SendStr(buff);
    
    // 输出long型数据的4个字节
    for (i = 0; i < 4; i++) {
        sprintf(buff, "\r\nByte[%d] = 0x%02x", i, b[i]);
        Uart1SendStr(buff);
      
        sprintf(buff, "\r\nByte[%d] = 0x%02x", i, ((unsigned char *)(&val))[i]);
        Uart1SendStr(buff);
    }
    
    while (1) {
        
    }
}  		


基本思路是:用char型变量获取到long型数据在内存中的地址,然后逐个字节输出,看看数据是怎么存储的。输出结果如下:

无标题.png

从结果可以看出,long型数据在内存中的保存顺序为:高位字节在前,低位字节在后。因此对于0x01020304这个数据,在内存中按照顺序保存为0x01,0x02,0x03,0x04四个字节的数据。int型的数据估计也是这样。这样的话,当系统中有诸如同名的xxxH、xxxL之类的8位、16位寄存器数据,需要进行计算的时候,可以直接合成为int型数据、long型数据,快速完成比较、计算差值之类的计算。




关键词: 懒猫的学习笔记     Ai8051U     long型数据的内    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]