当前位置:首页 > 单片机 > 单片机
[导读]   一、常规方法    AVR单片机的各类教材或编程应用参考资料,对介绍的端口位操作方法不外乎宏定义及整体和某个常量相或、相与来实现某一单个位状态的改变。如:  PORT&=-(1《1);等价于:PORT

  一、常规方法
  
  AVR单片机的各类教材或编程应用参考资料,对介绍的端口位操作方法不外乎宏定义及整体和某个常量相或、相与来实现某一单个位状态的改变。如:

  PORT&=-(1《1);等价于:PORTB&=oxfd;作用是PB1清零而其余位不变。与之类似的还有:

  PORTBl=(1《4);PB4置位,其余位不变。

  PORTB=(k《4);PB4翻转,其余位不变。

  上述方法,无论是常量值参与还是移位操作,用起来总嫌麻烦,不够直观,且具体常量值还需人工推算,易出错。移位操作生成的目标代码偏大,在大量运用时,占用系统内存或flash空间,执行效率低。

  以实际运用效果来看,宏定义比较好。也偏好运用宏定义。C编译器在编译之前会事先进行宏替换,所以,如果宏定义讲究一些技巧,则代码执行效率将得到较大提升,编程时,操作也得心应手。

  常规参考手册或资料,建议用以下宏定义:

  如此宏定义之后,可构成一个头文件,然后加入到新建工程文件中(编译器用ICC的ICC6.31A),但之前需包含相应单片机的头文件,如:MCU为AT-MEGA48,则最先包含iom48V.h之后,再包含此自制头文件,即可在程序中运用:

  此法在运用时,依旧用了移位操作,只是为了方便程序操作,只在小规模程序中运用。

  下面,将充分利用C语言自身的强大位运算能力和指针相结合,构建一个ICC6.31A平台下的位定义头文件,希望能给大家一些启示。

  首先明确几个基本概念:位域、地址绑定,和Volatile限定关键字。

  在ICC6.31A的安装目录中有个in-clude文件夹,里面有大量编译器开发人员已为我们开发好的各类AVR单片机预定头文件,下面是iom48v.h头文件。

  注:每个端口均有PIN、DDR、PORT三个八位寄存器。

  简要概括如下:

  Volatile -词用来规定C编译器不允许对其限定的变量进行优化处理。如:

  这句宏定义要结合iom48v.h头文件来看,在前面有该头文件关于各端口寄存器的定义。上述宏语句中,ox25被强制转化为一个指针常量,实际上,上述宏定义的意义为:PORTB被强制定义在地址ox25上,即定义了一个无符号字符型变量PORTB,且被强制绑定在ox25地址上。其他语句依此类推。

  有了这个概念之后,再来了解一下C语言中位域的定义。标准c语言中,可以定义一个特殊的结构,位域,允许对定义的结构中的单个位进行操作。基本构成如下:

  下面给出的位域定义等的头文件,在自定义位操作头文件中定义了一个位域BYTE_BIT。

  自定义avt_bit.h头文件(节选,以ATMEGA48为例,定义其B口)

  对各端口依同一规律均进行各位的定义即可。

  结合头文件的相关定义,重新对其特定地址进行另外的绑定,结合位域的概念.进而一步步将各寄存器由一个字节分成了可操控的8个位。在上述文件中,仅表述了B端口。另外,Atmega48的端口不完全,只有B、C、D口,没有A口,且D口为8位,C口为6位.B口为7位,若外接晶体,则PB6和PB7不能另作端口运用。所以,端口很不完整,但为了保持位域完整性和一致性,便于理解,将B、C、D三口均作8bit对待。实际操作时,千万注意不要去操作那些实际不存在的位。当然,若感兴趣,大家可改动头文件相关定义,来完善它。

  为验证这个头文件,很快编写了一个测试程序Beep.e,具体如下:

  在电路拓扑中,在ATMEGA48的PBO脚,即(14)脚外接一只三极管(接b极)由三极管去控制一只蜂鸣器。程序很简单。为了更直观,在PORTB口其他不用的引脚上均接了发光二极管,此时,在测试程序中,将端口初始化函数语句改为:

  DDRB=oxff;PORTB=ox00;(或PORTB=oxff;视二极管接法而定),由二极管配合蜂鸣器来观察PBO位是否能单独动作。当然,运用此位定义头文件,可实现单片机任一口的任一位的位操作。

  二、扩展运用
  
  基于上述原理,结合C语言取地址运算符&,不难实现一个通用位定义头文件,来适合所有AVR单片机,只是代码较为复杂。大家不妨自己试试。

  注意一点:以上头文件,是参考ICC6.31A编译器的include文件夹定义的,在使用前,请首先包含系统提供的MCU头文件,并将自定义头文件复制到所建工程中,然后,就可运用自如了。

  就目前使用情况来看,使用AT-MEGA48/16/128的MCU较多,所以即便是定义3个对应的位操作头文件,也是可以的。通用型文件往往体积较大,编制麻烦,可读性差,不适合普通爱好者。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭