历史上的今天
返回首页

历史上的今天

今天是:2024年12月26日(星期四)

正在发生

2019年12月26日 | AVR单片机的端口位操作方法解析

2019-12-26 来源:elecfans

一、常规方法

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


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

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

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

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


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


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

AVR单片机的端口位操作方法解析

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

AVR单片机的端口位操作方法解析

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

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


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

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

AVR单片机的端口位操作方法解析

AVR单片机的端口位操作方法解析

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

简要概括如下:

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

AVR单片机的端口位操作方法解析

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


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

AVR单片机的端口位操作方法解析

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

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

AVR单片机的端口位操作方法解析

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

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


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

AVR单片机的端口位操作方法解析

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


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


二、扩展运用

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


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


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

推荐阅读

史海拾趣

EPT公司的发展小趣事

EPT公司在其发展历程中,始终重视与科研机构的合作。早年间,EPT与哈尔滨工业大学共同研发了一种新型电池材料,这种材料具有更高的能量密度和更长的循环寿命。通过双方的技术交流和深度合作,EPT成功将这种材料应用到其产品线中,极大地提升了产品的竞争力。这一合作不仅为EPT带来了技术上的突破,也为其在电子行业树立了良好的口碑。

Cal Test Electronics公司的发展小趣事

随着客户需求的多样化,Cal Test Electronics开始关注小批量定制型测试电缆组件的市场。公司利用自身的技术优势和生产能力,为客户提供个性化的定制服务。这些定制产品不仅满足了客户的特殊需求,也提高了公司的市场竞争力。通过这一策略,Cal Test Electronics成功打开了一个全新的市场领域,为公司的发展注入了新的动力。

Computer Conversions Corp公司的发展小趣事

Computer Conversions Corp非常重视人才的培养和团队建设。公司定期组织内部培训和技术交流活动,鼓励员工分享经验和创新想法。同时,公司还建立了完善的激励机制,为员工提供广阔的发展空间。这种以人为本的管理理念,不仅增强了团队的凝聚力和创新力,也为公司的持续发展注入了强大的动力。通过这些举措,Computer Conversions Corp打造出了一支高素质、高效率的技术团队,为公司的长远发展奠定了坚实的基础。

Electro-Mech Components Inc公司的发展小趣事

自1976年起,EMC在蒂华纳不仅为自身运营制造工厂,还开始为其他美国公司,如GM/Hughes Aircraft和Daneher Joslyn Sunbank Electronics提供制造服务。这种深度合作模式不仅增强了EMC的生产能力,也使其能够接触到更多的先进技术和管理经验。通过与这些美国公司的合作,EMC的产品质量和生产效率都得到了显著提升,同时也为公司的全球化战略打下了坚实基础。

Analog Modules Inc公司的发展小趣事

随着公司业务的不断发展壮大,EMC开始积极实施全球化战略。公司在全球范围内寻找合适的合作伙伴和销售渠道,努力将其产品推向更广阔的市场。通过与国际知名品牌的合作和交流,EMC不断提升自身的品牌形象和市场影响力。同时,公司还加强了对海外市场的调研和分析工作,以便更好地满足不同地区客户的需求和期望。

请注意,以上故事是基于已知信息构建的框架性内容,具体细节和情节需要根据实际情况进行填充和完善。

全智景(Allvision)公司的发展小趣事

随着技术的不断进步,全智景公司开始寻求跨界合作的机会,以拓展其技术的应用领域。公司与多家汽车制造商达成了合作协议,将其电子视觉技术应用于汽车自动驾驶系统。通过精准的图像识别和处理,全智景的技术帮助汽车实现了更高级别的自动驾驶功能,提升了行车安全性和驾驶体验。这一跨界合作不仅拓宽了全智景公司的业务范围,也为其带来了更多的商业机会。

问答坊 | AI 解惑

力传感器怎么跟ARM9连接

请问一下FSS系列的力传感器怎么跟ARM9开发板连接?要不要放大电路的?如果要的话,放大电路要怎样设计?…

查看全部问答>

wince c# 画图问题

系统:wince 5.0 开发工具: vs C# 2008 SDK :.net compact framework 3.5 问题描述:              开始在windows xp 执行这段代码没有问题,能画图:          &nb ...…

查看全部问答>

PIC16单片机的C编译起哪儿下载?如何与MAPLAB一起使用?

找了很长时间,网上都没有PIC16单片机得C编译器(很多都是DEMO)。还有,如果有了这个单片机,如何在MAPLAB中使用这个编译器?…

查看全部问答>

Vxworks下USB盘识别问题

我用的是Tornado2.2,Vxworks版本是5.5,包含USB模块, 新建立工程后,工程中加入USB支持,选中下列组件: Hardware->Buses->USB Hosts->USB Host Stack Hardware->Buses->USB Hosts->OHCI Hardware->Buses->USB Hosts->UHCI Hardware->Buses- ...…

查看全部问答>

有关51单片机低频频率计的问题

我想问一下低频频率计用C语言编写,一秒种是如何采集3次信号的 用测周期法测量.…

查看全部问答>

【请教贴】关于system C

近段时间接触到了System C,也是用作Soc的设计语言,但是设计效率据说比HDL高很多倍,不知道咱们坛子上有没有人在用这个,想了解下System C目前的应用情况,希望用到的朋友们能谈一谈感受。…

查看全部问答>

ActiveSync连接电脑

小弟刚开始接触arm,遇到了两个奇怪的问题,一个是我在电脑上用ActiveSync4.5(这个软件是在360上下的啊)连接开发板时说什么也连不上啊,我使用usb连接的,开发板是飞凌的2440,开发板跑的是wince5.0,电脑上是XP系统(用DNW连接开发板时一切都好 ...…

查看全部问答>

LM3S811库函数使用

IntEnable()里面的参数是什么 怎么用的   手册上好像没说…

查看全部问答>

【汇总】德仪MSP430视频

MSP430Ware 入门介绍较以往其他版本,德州仪器 IDE CCS V5.1 程序更加简练有效,运行更加快捷,开发环境也更加直观。这里将着重介绍CCS v5.1一个新的组成部份- TI资源管理器(TI Resource Explorer)。TI资源管理器向客户提供一种直接简单的途径进 ...…

查看全部问答>