一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2708|回复: 11
收起左侧

[51单片机] 关于联合体,结构体

[复制链接]
发表于 2015-10-18 23:05 | 显示全部楼层 |阅读模式
本帖最后由 benli 于 2015-10-18 23:07 编辑

某个程序里的部分,实在是搞不懂哪个变量对应哪个,分别定义是多少个变量

  1. union
  2. {
  3.         uint   word;
  4.         struct
  5.         { //结构bytes
  6.                 uchar byte_addr;
  7.                 uchar byte_data;
  8.         }bytes;
  9. }a_0,a_1;


  10.                 for (i=0;i<6;i++)
  11.                 {
  12.                         if (W_REM)
  13.                         {
  14.                                 a_0.word |=0x01;
  15.                         }
  16.                         a_0.word <<=1;
  17.                         while (!W_REM) ;        //等待第二个下降沿
  18.                         while (W_REM) ;

  19.                         d50us(6);        //等待300us后采集接收信号

  20.                         if (W_REM)
  21.                         {
  22.                                 a_1.word |=0x01;
  23.                         }
  24.                         a_1.word <<=1;


  25.                         while (!W_REM) ; //等待第二个码值的下降沿
  26.                         while (W_REM) LED2=~LED2;         //___wd___
  27.                         //接收12 位编码 --------------------------------
  28.                 }
  29.                 //把接收的编码左移4位将8位密码放在同一字节上----------------------------
  30.                 a_0.word <<=4;
  31.                 a_1.word <<=4;
  32.                 if ((a_0.bytes.byte_addr==addr_user_a0)&&(a_1.bytes.byte_addr==addr_user_a1))
复制代码
发表于 2015-10-19 00:20 | 显示全部楼层
就两个16位的变量 a_0 a_1,用union定义只是增加了一种访问方式,可以通过a_0.bytes.byte_addr获取高八位
 楼主| 发表于 2015-10-19 07:13 来自手机 | 显示全部楼层
本帖最后由 benli 于 2015-10-19 07:20 编辑
littlebadbay 发表于 2015-10-19 00:20
就两个16位的变量 a_0 a_1,用union定义只是增加了一种访问方式,可以通过a_0.bytes.byte_addr获取高八位


那么低8位是怎么访问?
发表于 2015-10-19 07:57 | 显示全部楼层
benli 发表于 2015-10-19 07:13
那么低8位是怎么访问?

相当于A.word (16bits)    和 A.byte.addr (8bits) + A.byte.data (8bits) 是指向同一个16位存贮空间,只不过有俩不同名字而已;
所以,你可以直接对A.word进行16位数据操作,方便编程;

同时可以灵活/独立操作A.byte.addr (一般来说是高8位)或者A.byte.data (一般来说是低8位),方便各种8位硬件的端口操作,省时,省代码,省空间。

 楼主| 发表于 2015-10-19 08:58 来自手机 | 显示全部楼层
uart 发表于 2015-10-19 07:57
相当于A.word (16bits)    和 A.byte.addr (8bits) + A.byte.data (8bits) 是指向同一个16位存贮空间,只 ...

明白了,多谢!!
发表于 2015-10-19 16:33 | 显示全部楼层
到现在搞不懂结构体,写程序从来没用过结构体的飘过。。。
发表于 2015-10-19 20:58 | 显示全部楼层
40560335 发表于 2015-10-19 16:33
到现在搞不懂结构体,写程序从来没用过结构体的飘过。。。

函数传送多个参数的时候 结构体很好用。
像多层菜单。
用别的方法不是不能,用结构体写的代码比较简洁。
51好像感觉不到。看看STM8 的 stm8S***.h,里面一大堆的结构体/结构体指。

我也菜鸟,说错别笑。
发表于 2015-10-20 00:39 | 显示全部楼层
本帖最后由 alin 于 2015-10-20 00:41 编辑
junyee 发表于 2015-10-19 20:58
函数传送多个参数的时候 结构体很好用。
像多层菜单。
用别的方法不是不能,用结构体写的代码比较简洁 ...

结构体作参数传递,开销会大点吧~
发表于 2015-10-20 03:25 | 显示全部楼层
alin 发表于 2015-10-20 00:39
结构体作参数传递,开销会大点吧~

stack开销大一点,不过最后都会释放的
对于stm8来说,用得上一半RAM的情况都不多
发表于 2015-10-20 08:16 | 显示全部楼层
alin 发表于 2015-10-20 00:39
结构体作参数传递,开销会大点吧~

也就多用点RAM,对于我来说无关紧要。IAR编译时你设置的栈大小是固化在RAM里,不和用户RAM共享的,不用白不用。
再大,也就几十Byte。IAR不设置的话好像默认是256Byte. 你还想在单片机上用几KB的结构体?


本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-14 08:28 , Processed in 0.066511 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表