访问电脑版页面

导航:老古开发网手机版51单片机51单片机Keil C51编程

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的两个字节是连续的,高字节存放在低地址,低字节存放在高地址。哈哈

具体的实现是:

8051单片机int字节的实现

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

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

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

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

实验验证一下:

8051单片机int字节的实现

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

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

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

8051单片机int字节的实现

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

watch窗口就更一目了然了!

8051单片机int字节的实现

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

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

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

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

#include 
#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;
}
来源:工程师曾玲   作者:city_prolove  2019/9/7 10:17:00
栏目: [ 51单片机Keil C51编程]

相关阅读

几种码制转换 BCD TO HEX,HEX TO BCD ,BIN TO HEX

让Ultra Edit和Keil结合的更紧密

在KEIL C51上仿真完了,怎样生成HEX文件去烧写??

在Keil c51调试中,如何查看外部存储器XDATA?

Keil C51中如何实现代码优化?

C51中 INT 转换为 2个CHAR?

Keil C51编译错误总结

proteus与keil的完美结合(没有开发板,让你也学的爽!)

[转载]C51中断处理过程

C51 的重入问题 WARNING L15: MULTIPLE CALL TO SEGMENT(转)

那位大虾能告诉我C51 的printf()函数有什么用?

keil 7.0编译出现:error C316: unterminated conditionals

51单片机CO2检测显示程序解析

Keil C51单片机中变量的使用方法解析

MCS51单片机程序设计时堆栈的计算方法解析

在Keil c51调试中,如何查看特殊寄存器?

volatile的用法

SBUF=0x65,c=SBUF结果为c=0???

在Keil c51调试中,如何查看全部256bytes的内部RAM?

C51单片机的几种常用延时程序设计