Loading
新闻中心库存中心价格中心PDF中心图片中心
ICGLE 电子技术支持中心,为电气人员和相关企业提供全面的信息(IC技术\IC库存\IC图片\PDF资料等)服务
总线设计PCB设计单片机DSPARM
JAVA驱动设计C/C++汇编J2EE网络协议中间件技术嵌入式系统无线通信通信网络模拟技术接口电路显示光电传感与控制EDA/PLD
气流体控制电子产品电机及工具通信设备仪器仪表电线电缆建筑电气低压电器高压电器电源工控自动化广电设备医疗器械More..
电源设计仪器仪表技术专递电路图片电子专栏储存技术汽车电子测量测试音响技术家用电器
成功方案市场分析行业标准应用前沿芯片应用综合专区
单片机C环境下位操作的实现方法
来源:电子市场   作者:
字体大小:[大][中][小]

  C语言既有高级语言的各种特点,又可对硬件进行操作,并对进行结构化程序设计,用C语言编写的程序较容易移植,它们可生成简洁可靠的目标代码,在代码效率和代码执行速度上完全可以和汇编媲美。采用C语言进行单片机编程嵌入式程序设计的发展趋势。但是,在嵌入式控制等领域,经常需要控制某一个二进制位,然而除了Keil C51等C环境外,很多单片机C环境都没有扩充对位变量定义的关键字,甚至单片机本身的硬件上也没有对单个位操作的汇编指令,使得已习惯MCS-51内核单片机Keil C51编程的用户都为其C环境不能对位变量进行位操作而烦恼。

  1 用“读-修改-写”方法实现对单个位的位操作

  ANSIC中,一般采用“读-修改-写”的方法实现单个位的位操作,通过与0“与”操作,将某一位清0。如使i变量的b0位为0,实现方法为i=i&0xfe。通过与1“或”操作,将某一位置1。如使i变量的b0位为1,实现方法为i=i|0x01。通过与1“异或”操作,将某一位取反。如使i变量的b0位取反,实现方法为i=i^0x01。

  注意:错误“读-修改-写”方法时不要影响其他位,即某位清零时,其他位与1“与”;某位置1时,其他位与0“或”;取反时,其他位与0“异或”。

  为了方便程序设计和增加程序可读性,很多程序员喜欢采用下面的移位方式实现单个位的位操作,语句简练,可读性强,比如在某单片机的B口连接1个发光二极管,其点亮操作方法如下:

  #define bit(x) (1<<(x))
  #define LED 2

  使用方法如下:

  PORTB|=bit(LED);//将PORTB第3位置1,点

             //亮连接在I/O口的LED

  该方式下,程序运行时会增加移位操作,生成的代码较大,而且执行时间,实时性差,一些C环境按如下方式直接定义位,则生成的代码就不会有移位操作:

  2 通过位域的方法实现位操作

  标准C提供了一种基于结构体的数据结构--位域(BitField),位域就是把一个存储单元中的二进制划分为几个不同的区域。并说明每个区域的位数。每一个域有一个域名,允许在程序中按域名进行操作,位域的定义格式如下:

  struct 位域结构名{
  位域列表 };
  位域列表格式为:类型说明符 位域名:位域长度如:
  struct k{
  unsigned int a:1
  unsigned int :2
  unsigned int b:3
  unsigned int :0     //空域
  }k1;

  说明:

  1)各位依次从低位到高位排列,排满一个存储单元,按地址接着排下一单元;
  
  2)位域可以无域名,但不能被引用,如第二域,这时其只用来填充或调整位置;
 
  3)第四行称空域,目的是将目前存储单元的剩余部分分为一个域,且填充0。

  位域的引用很简单,如:

  k1.a=1; //置k1的b0位为1
  k1.b=7; //将k1的b3-5位置111

  通过位域定义位变量,是实现单个位位操作的重要途径和方法,采用位域定义位变量,产生的代码紧凑、高效。定义的方法如下:

  通过位域定义位,再通过宏进行定义,可以方便地将Keil C51等程序移植到其他C编译器,从而不再为没有位操作而苦恼。

  对一个单片机的所有I/O口,通过将位域结构指定到I/O端口地址,I/O口便都可以采用位域进行宏定义,这样,操作I/O口就可以像Keil C51编程一样方便。

  3 基于位域实现位操作应用举例

  很多单片机没有硬件的SPI,而很多板级外围器件为SPI接口,而且某些外围器件不是标准的SPI,即通信的总二进制位数不是8的整数倍,这里编制一个例程,为同时收和发0-16位,全双工方式,具体使用见例程注解。注意:很多单片机使用前要对使用的I/O口进行初始化,clk和din为输出口,dout为输入口,同时这里使用了前面通过读-修改-写宏定义的一个函数GET_BIT(x,y)。

  该SPI模块已经成功应用到单片机与MAX7219和CH451等SPI通信上。

  对于没有扩展位变量的C语言环境,在汇编下没有对单个位进行位操作执行的MCU,通过位域的方法操作I/O口是最佳的方法,汇编下有单个位的位操作指令MCU。可以嵌入汇编,但是程序的可移植性等性能会下降,建议使用位域的方法。

Upload by 小刘(2007-7-23)
IC
·基于OS20的机顶盒软件体系及其应用..
·UC/OS 在TMS320C6711..
·在MC68HC908GP32上移植μ..
·一种基于Nios II的可重构DSP..
·基于Nios II双核系统的设计与实..
·Stratix II FPGA系统电..
·Nios SoC系统中的BCH编解码..
·eCos在基于ARM7硬件平台上的应..
·大功率智能充电器的研究与设计
·基于ADSP-BF533处理器的去方..
·控制多个LED的功率及成本
·2007年第二季度十大热门电源管理新..
·楼宇自控能“控”到哪?
·ZigBee在煤矿井下救援系统中的应..
·力控软件在石化生产数据采集系统的应用
·基于红外超声光电编码器的室内移动小车..
·基于USB 2.0集成芯片的H.26..
·超薄显示屏0LED在陀螺经纬仪中的应..
·温度传感器DS1621在电子战接收机..
·一种基于PE3236 L波段频率合成..
·基于DDS与USB技术的通信对抗教学..
·新型图形人机接口硬件系统和软件架构设..
·家居未来:功能需求决定了智能家居发展..
·散热器恒温控制阀原理及应用
·可扩展的嵌入式网络平台
·基于EWB的D/A数模转换器的仿真研..
·国内外智能建筑技术发展的现状及趋势
·RadioScape助力澳大利亚进行..
·华为首款发货量突破百万手机“诞生”,..
·PLC在气箱式脉冲袋收尘器中的应用
·用VC++开发微机与OMRONPLC..
·柴油发电机原理
·可编程控制器梯形图的设计方法
·直线电机交通模式及技术经济特性
·氧传感器实际应用中的问题及解决方法
·3G系统中AGC的FPGA设计实现
·基于ARM处理器的CAN-Ether..
·Nios SoC系统中的BCH编解码..
·基于uClinux嵌入式系统的汽车黑..
·一种基于PE3236 L波段频率合成..
IC
推荐技术文章:
·彩色液晶显示系统的设计..
·基于接口芯片PCI 9030的PCI....
·Stratix II FPGA系统电....
·基于数字信号处理的新型车载减震检测方....
·基于ADμC834芯片的热泵热水机组....
·基于FPGA的智能控制器设计及测试方....
·基于cyclone EP1C6 的L....
·基于PCI总线的通用网络协议实验平台..
·基于SOPC的工业大型吊车吊钩位置测....
·四点二次插值的单片机汇编程序实现 ..
·变频器在离心式甩干机上的应用..
·用变频调速改造引进橡胶后处理生产线..
·Efficient Bit-Bang....
·小家电控制板中的EMC解决方法..
·高速USB2.0设备的PCB板设计..
·TMS320C6201高速电路PCB....
·表面贴器件PCB占位的设计经验和指南....
·基于TPS54350型DC/DC变换....
·基于WLAN的无线多跳Mesh网络多....
·基于ZigBee技术的无线传感器网络....
·8位单片机与以太网控制器RTL802..
·VHDL设计中电路简化问题的探讨
·汇编程序输入与输出文件格式
·ARM7一VxWorKs的网络化实时..
·蓝牙无线耳机设计及VxWorks移植..
·基于S3C44BOX的VxWorks..
·在全集成设计环境中开发视频IP
·选择合适的设计平台应对IP机顶盒设计
·钟控职守IC卡记录仪
·基于AD8302芯片的新的幅相测量系..
·FPGAs cut power wi..
·基于Internet部署的视频会议解..
·可视对讲产品和技术在中国国内发展趋势
·使用CO传感器的地下停车场系统
·RS-485总线的理论与运用
·三相混合式多细分步进电机驱动器
·利用Virtex-5 SXT的高性能..
·基于C8051F020的通用串口适配..
·基于声卡和Matlab的虚拟信号发生..
·嵌入式多媒体综合控制系统的研制
IC
IC

©2007 版权归ICGLE所有   页面执行时间:62.500毫秒