网站导航: 首页 > 设计参考 > 正文 文章搜索
C51的结构体数据在单片机编程中的应用
 
文章编号:
090106143909
文章分类: EDA技术 Keil C
点 击:
...
关 键 词: 结构体
文章来源:
网络,作者:贠书文 张志 李福凯
摘 要:
为了实现以更多的人机交互信息、更清晰的仪表硬件描述为特征的HMI 功能,相应地, 单片机编程中的参数量及参数类型不断增加,仅有基本类型变量(如位、字节、整型、浮点型、指针型)和数组变量已不能完全有效地表达

    随着单片机应用领域的逐渐扩展和显示、通信技术的不断进步, 单片机开发所要求的人机界面越来越丰富, 以单片机为核心应用的产品已由纯实用向功能化、可视化、网络化发展。HMI (人机界面) 技术及产品在近两年成为发展最快的领域。为了实现以更多的人机交互信息、更清晰的仪表硬件描述为特征的HMI 功能,相应地, 单片机编程中的参数量及参数类型不断增加,仅有基本类型变量(如位、字节、整型、浮点型、指针型)和数组变量已不能完全有效地表达参数的特性。使用C51 编译支持的一种结构体(struct)数据类型,可有效地解决许多编程中所面临的种种数据结构管理问题。

1 结构体数据
    除了基本类型数据, 数组是C51 编程中一种常用的构造类型数据。它由上述基本类型数据(位、指针除外)组成, 并且一个数组的各元素应属于同一个类型。但是,只有这些数据类型并不能很好地表达我们所要引用的数据,有时需要将不同类型的数据组合成一个有机的整体,以便于引用。例如, 要保存一组采样值:时间(月、日、时、分)、温度、流量等,如果分别将它们定义为互相独立的简单变量,难以反映它们的内在联系。应当把它们组织成一个组合项, 在一个组合项中包含若干个类型不同(也可以相同)的数据项。这样的数据结构称为结构体(structure)。定义一个结构体类型的一般形式为:

 
  1. struct 结构体名   
  2. {   
  3.     成员表列   
  4. };  

例如上面提到的一组数据, 可以表示为:

 
  1. struct sample       /* 结构体名 */  
  2. {   
  3.     char month;     /* 月 */  
  4.     char day;       /* 日 */  
  5.     char hour;      /* 时 */  
  6.     char minute;    /* 分 */  
  7.     int temprature; /* 温度 */  
  8.     float flow;     /* 流量等 */  
  9.     ……    
  10. }sample1,Sample2;   

    它定义了一个反映某一时刻采得的温度值、流量值等的结构体sample,同时定义了两个具有struct sample类型的变量(或参数)。

2 结构体数据的优点
(1)有效利用内存空间
    在C51 编译时,结构成员在内存中是顺序存放的,因而不同类型的数据被有机地结合成了一个数据块,使单片机有限的内存资源空间得以充分利用。
(2)参数组织结构紧密、清晰结构体数据在多参数的智能化仪表设计中尤为适用, 它可将同一属性、不同类型的数据组织在一起,参数便于识别、调用。如编制某些通用型仪表的程序, 可定义下列结构体数据。

例1 :放大环节描述

 
  1. struct amplifier   
  2. {   
  3.     int gain;   
  4.     char offset;   
  5. } input_amp,output_amp;  

以上定义了一个表示放大环节(amplifier)的结构体类型。它由放大环节增益(gain ) 和放大环节零点(offset)组成,并且定义了输入环节(input_amp)和输出环节(output_amp)两个结构体数据。

例2 :仪表特征描述
描述仪表特征的数据可以组合成一个有机的结构体, 以便于识别与调用。

 
  1. struct meter   
  2. {    
  3.     int meter_no; /*仪表编号*/  
  4.     char meter_code[10]; /*仪表编码*/  
  5.     int meter_size; /*仪表口径*/  
  6.     float meter_factor; /*仪表系数*/  
  7.     char meter_zero; /*仪表零点*/  
  8. } ;  

(3)参数调用方便
结构体数据的调用方式有多种,最直接的方式为:
结构体变量名.成员名
如例2中,可以对变量赋值:meter1.meter_factor=1.0;
    这里着重介绍一种通过指针调用的方式。该方式在对结构体数据作顺序存取时尤为方便。在数据存储区有以下结构:

 
  1. structpara   
  2. {   
  3.     int pr0;   
  4.     char pr1;   
  5.     float pr2;   
  6.     ……   
  7. } parameter;  

在程序存储区与之相对应存放一组成员名数据表parameter_name[m][n]。该表包含表1 所列内容。

参数类型 地址偏移量 参数名 备注
i 0 "XXXXXX" 成员0
c 2 "XXXXXX" 成员1
f 3 "XXXXXX" 成员2
…… …… …… 成员n

在引用时, 先设计两个指针变量,分别指向数据存储区和程序存储区:
p ——指向数据存储区;
pcc ——指向程序存储区;
p=&parameter.pr0; 定位指针指向参数值首地址;
pcc=&parameter_name; 定位指针指向参数名首地址。
需要调用第i 个参数时:
p+*(pcc+n*i+1) 指向第m 个参数;
(pcc+n*i)中存放的是该参数的数据类型。
这样, 就可以根据数据类型的不同分支, 对不同类型的数据进行相应的处理。
(4)提高编程效率
数据变量的有效组织使得程序的编制更便于结构化、模块化,从而方便了程序后续的扩展,可以极大地加快单片机开发者的开发进度。

3 总结
     由于单片机内存资源的限制, 如何合理、有效地组织利用数据内存空间, 对于编制大型的单片机程序尤为重要。尽可能利用编译器提供的便利, 优化程序, 使程序做到更简化、更易于扩展,是每个编程人员追求的目标。结构体数据类型即是C51 为单片机开发人员提供的

一种有效的数据组织方式。

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 



 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4