历史上的今天
返回首页

历史上的今天

今天是:2025年07月30日(星期三)

正在发生

2018年07月30日 | PIC单片机入门_输入输出端口详解

2018-07-30 来源:eefocus

1.引言:

PIC单片机引脚图:



在PIC16F87X 单片机中,28引脚型号的单片机有3 个I/O端口,分别是RA、RB和RC;40引脚型号单片机有5个 I/O端口,分别是RA、RB、RC、RD和RE。其中RA有6条口线,RE有3条口线,其余都有 8条口线。
PIC16F87X端口口线既可作普通I/O引脚,又可作某些部件或外围模块的外接引脚,比如端口引脚RC.4既可用作普通I/O脚,又可以作为SPI串行通信的数据输入引脚。这里只介绍端口的基本功能和基本用法,端口的其他复合功能,在以后介绍。

2.与输入/输出端口相关的2个寄存器

PIC单片机中各个I/O端口都具备两个基本的专用寄存器:端口数据寄存器和端口方向寄存器。如下所示。      



这些寄存器在RAM中都有统一的编址,即PIC单片机的端口都可以当作RAM单元来访问,无需专门的指令访问。

3.输入/输出端口的基本结构

PIC16F87X的3/5个端口不但结构上存在差异,而且同一端口的各口线的内部结构也略有差别,但是他们的基本结构模型,如下图所示。


图中有三个D触发器(也称为锁存器)。

其中Data Latch代表了端口数据寄存器,例如PORTA、PORTB、PORTC;

TRIS Latch端口方向寄存器,例如TRISA、TRISB、TRISC;而Input Latch是端口设置为输入时作为缓冲器。

3.1 基本输入/输出端口的工作原理

下面对端口口线进行的基本操作说明如下:

⒈写I/O方向寄存器TRIS Latch
 当方向寄存器中的内容为1时,则对应口线被设置为输入(Input);当其内容为0时,则对应引脚设置为输出(Output)。
 ⒉ 经端口引脚输出数据
   要把端口口线作为输出,必须要把该口线预先设定为输出态,即相应的TRIS Latch的内容必须为0。
⒊从端口引脚输入数据
  要把端口口线作为输入,必须要把该口线预先设定为输出态,即相应的TRIS Latch的内容必须为1。

3.2输入/输出端口基本功能的应用举例

下面的实例是单键触发8位二进制累加计数器,是针对端口功能和ICD在线调试器上的硬件为基础而设计的。该实例中要用到的硬件电路如下图所示。

 图中端口RC外接8条支路,这8条支路构成了端口RC的输出电路,其中8只电阻起限流作用,保护端口引脚和发光二极管LED;LED在高电平时发光。图中还使用了端口RB的RB0口线作为外接输入引脚。电阻R4为限流电阻,对RB0引脚起保护作用;电阻R21为上拉电阻,将RB0电平拉高;开关SW1用来人工输入低电平脉冲信号。

程序设计思路 :

刚接通电源时,8只发光二极管都不亮,表示计数器初始值为0。
按下开关SW1时,计数器值加l,D0点亮,表示二进制数00000001B,然后松开按钮;再次按下SW1时,计数器值又加1,D1点亮,表示二进制数00000010B,然后再松开按钮;依次类推。直到按了255次按钮时,D7~D0全部点亮,假如再次按动按钮将使计数器回0。如此循环往复。

设计按钮输入程序时,有一点需要注意,就是必须处理按钮在按下或松开时存在抖动现象,以免产生误判。按钮的去抖动一般都是调用延迟程序来消除抖动的。即在程序设计中,当查询到RB0上的首次电平变化后,马上延迟τ(例如10ms),待RB0上的状态稳定后,再次查询确认,果真是按键动作(按下或者松开),方认定为有效,否则,判为干扰脉冲。程序清单如下:


STATUS     EQU     03H    

PORTB      EQU     06H    

TRISB      EQU     86H

PORTC      EQU     07H    

TRISC      EQU     87H     

DATA1      EQU     20H          ; DATA1为延时变量

DATA2      EQU     21H          ; DATA2为延时变量

N1         EQU     D'13'        ;外层循环延时常数

N2         EQU     0FFH         ;内层循环延时常数

RP0        EQU      5H          ;体选位RP0

ORG        000H       

     BSF    STATUS, RP0         ;切换到RAM的体1

     MOVLW  00H                 ;将端口C设为输出

     MOVWF  TRISC       

     MOVLW  0FFH                ;将端口B设置为输入

     MOVWF  TRISB           

     BCF    STATUS, RP0         ;恢复到RAM的体0

     PORTC  EQU     07H    

     TRISC  EQU     87H     

     DATA1  EQU     20H         ; DATA1为延时变量

     DATA2  EQU     21H         ; DATA2为延时变量

     N1     EQU     D'13'       ;外层循环延时常数

     N2     EQU     0FFH        ;内层循环延时常数

     RP0    EQU      5H         ;体选位RP0

ORG      000H       

     BSF     STATUS, RP0        ;切换到RAM的体1

     MOVLW  00H                 ;将端口C设为输出

     MOVWF  TRISC       

     MOVLW  0FFH                ;将端口B设置为输入

     MOVWF  TRISB           

     BCF    STATUS, RP0         ;恢复到RAM的体0

              


汇编语言往往需要更多硬件知识,因此对于主攻软件或者有着良好C语言编程能力的人,我更像偏向于C编程。

以下是用C语言编写的程序:


 include

#define N1 13    //外循环

#define N2 0xff   //内循环

static volatile bit PORTB0 @(unsigned)&PORTB*8+0; //端口可变设计

int DATA1,DATA2;

main() {

           TRISC=0xff; //Input ???????  TRISC = 0x00;  //Output

           TRISB=0xff; //Input

           PORTC=0;    //清零

check: if PORTB0==0 then goto check;  //监测是否有电平信号输入  有效电平信号1

            DELAY();  //延时去抖动

            if PORTB0==0 then goto check;//去抖动确定

            PORTC++; //C语言设计好处 立刻就凸显出来了

CHECK1 if  PORTB0==1  goto  CHECK1;  

             DELAY()

             if  PORTB0==1  goto  CHECK1;

             GOTO  check;

             while(1) {  };

}

void DELAY()   

{

        DATA1=N1;      

   LP0: DATA2=N2;            

   LP1: if DATA2-- > 0 goto LP1;                 

        if DATA1-- > 0 goto LP0;

   return;

  }


推荐阅读

史海拾趣

Ho Chien Electronics Group Inc公司的发展小趣事

Ho Chien Electronics Group Inc公司发展故事

故事一:创立与全球化布局

Ho Chien Electronics Group Inc.(以下简称“Ho Chien”)创立于1974年,其全球总部位于美国波士顿。自成立以来,Ho Chien迅速在全球范围内扩展其业务,先后在中国、新加坡、德国、巴西、加拿大和墨西哥等地设立了超过40个分部。这一布局不仅加强了公司的市场渗透力,还为其提供了丰富的资源支持,助力其在电子行业细分市场中稳步前行。Ho Chien特别专注于互连与机电产品领域,通过为原始设备制造商和合约制造商提供高质量的产品和服务,逐步在行业内建立了良好的声誉。

故事二:亚太市场的拓展

2012年12月,Ho Chien正式启动其亚太业务,并将亚太区总部设在香港。为了更好地服务亚太地区的客户,Ho Chien不仅设立了销售部,还构建了区域配送中心和增值服务中心。经过数年的努力,Ho Chien亚太区已开设24个分部和3处仓库,极大地提升了其在该地区的运营效率和服务质量。这一举措不仅加深了Ho Chien在亚太市场的影响力,还为其未来的全球扩张奠定了坚实的基础。

故事三:产品线的丰富与拓展

Ho Chien致力于为电子行业各细分市场的客户提供全面支持,其产品线涵盖了25个不同元器件类别。主要分销产品包括互连器件、继电器、风扇、开关、散热解决方案、套管和线束产品、晶体与振荡器、紧固件与五金件以及传感器等。随着市场的不断变化和技术的飞速发展,Ho Chien不断调整和优化其产品线,以满足客户日益增长的需求。这一策略不仅帮助Ho Chien保持了其在行业内的竞争力,还为其带来了稳定的收入来源。

故事四:创新与研发

作为电子行业的领军企业之一,Ho Chien深知创新对于公司发展的重要性。因此,公司不断加大在研发方面的投入,致力于新技术、新产品的开发和应用。通过引进先进的研发设备和优秀人才,Ho Chien在多个领域取得了重大突破,并成功推出了一系列具有自主知识产权的产品。这些创新成果不仅提升了Ho Chien的品牌价值,还为其在全球市场上的拓展提供了有力支持。

故事五:人才培养与企业文化

在快速发展的过程中,Ho Chien深刻认识到人才对于公司持续发展的关键作用。因此,公司始终坚持“以员工为中心”的管理思想,努力为员工创造宽松的工作氛围和良好的发展机会。Ho Chien不仅提供优厚的福利待遇和丰富的培训资源,还鼓励员工积极发挥自己的才华和潜能。在这种企业文化的影响下,Ho Chien汇聚了一大批优秀的专业人才和管理精英,为公司的快速发展提供了强有力的智力支持。同时,这种积极向上的企业文化也进一步提升了Ho Chien的品牌形象和社会影响力。

世纪金光(CENGOL)公司的发展小趣事

世纪金光(CENGOL)公司自创立之初,就立志要在半导体领域实现自主创新。经过无数次的实验与尝试,公司的研发团队成功攻克了高纯碳化硅粉料提纯技术。这一突破不仅使世纪金光在碳化硅材料领域取得了领先地位,更为后续产品的研发奠定了坚实基础。随着技术的不断完善,世纪金光成功推出了6英寸碳化硅单晶,并实现了量产,这一成就标志着公司在碳化硅材料领域取得了重要进展。

巴丁微公司的发展小趣事

近年来,巴丁微在电子行业的发展取得了显著成就。在近千家参评企业中,巴丁微脱颖而出,成功入选2023粤港澳大湾区科创榜专精特新标杆企业TOP100榜单。这一荣誉的获得,不仅是对巴丁微技术实力和产品质量的认可,也反映了公司在行业内的领先地位和影响力。

这一荣誉的取得,为巴丁微未来的发展奠定了坚实的基础。公司将继续秉承创新引领、协同发展的理念,不断提升技术水平和产品质量,为电子行业的发展贡献更多力量。

E-Z-HOOK公司的发展小趣事

在1956年的一个晴朗午后,E-Z-HOOK的创始人阿尔伯特·史密斯(化名)在实验室里遇到了一个棘手的问题。他正在测试一个复杂的电子系统,但发现现有的测试工具无法满足他的需求。于是,他动手设计并制造出了第一个E-Z-HOOK测试钩,这个简单但实用的工具极大地方便了他的工作。史密斯看到了这个产品的巨大潜力,于是决定成立一家公司来专门生产这种测试钩。这就是E-Z-HOOK公司的起源。

Gould Fiber Optics公司的发展小趣事
可能是散热不良、负载过大或内部元件短路。
ABOV(现代单片机)公司的发展小趣事
可能是散热不良、负载过大或内部元件短路。

问答坊 | AI 解惑

Protel99SE精彩教程

Protel99SE精彩教程 此教程采用的样板软件是PROTEL99SE汉化版,对于学习PROTEL99SE很有用~99SE是PROTEL家族中目前最稳定的版本,功能强大。采用了*.DDB数据库格式保存文件,所有同一工程相关的SCH、PCB等文件都可以在同一*.DDB数据库中并存,非常 ...…

查看全部问答>

调ADC用的小工具

本帖最后由 paulhyde 于 2014-9-15 03:41 编辑 我花了很大气力写的GUIDE,给组里那个写程序 的调ADC用,希望对大家有用!!!!!!!!!!!!!!!!!!!!!! 忍了忍,还是拿出来分享吧 希望大家有什么好东西也共享一下 互相学习[free] ...…

查看全部问答>

我爱龙芯之简介篇

     前段时间在论坛上上传了一个关于龙芯的PPT,应管理员soso的想法,觉得可以收集一点龙芯的资料,让我们认识自己中国人的芯。以下部分是我结合百科词条摘录的一部分内容,作为对龙芯的简单介绍吧!     其实, ...…

查看全部问答>

嵌入式实时操作系统μCOS-II(第二版)

嵌入式实时操作系统μCOS-II(第二版)…

查看全部问答>

LED灯具损坏常见原因及保护方案

replyreload += \',\' + 697127;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

在DC综合后的网表文件怎么导入到PT中进行时序分析

做的一个简单的cla电路,综合后得到电路网表。然后使用write -hierarchy -output cla.db 和write -format Verilog -hierarchy -output cla.v 保存了综合后的网表。但是用pt读后:read_db cla.db 这个说No-Design were read和read_verilog cla.v 这 ...…

查看全部问答>

指纹传感器

有谁用过指纹传感器,分享一下自己的经典稀有资料吧?   网上资源较少,而且用的人也不多,也许你的指纹传感器就是你的自豪。…

查看全部问答>

求助大神一个很简单关于stm32的问题...

小弟刚接触stm32,图片上那个画红线的愣是没看懂,为什么给寄存器赋值先与运算一下呢?刚开始寄存器的值不是复位值么?那也就是全0,与运算一下后不都变成......先谢谢大家啦! [ 本帖最后由 九霄飞瀑 于 2012-3-8 23:51 编辑 ]…

查看全部问答>

怎样驱动9540

用TLP521可以吗,求原理图…

查看全部问答>

关于在nios下运行ucos的问题!!

我写的代码如下,定时器是每200US发信号量给任务,然后任务是改变PWM的输出频率。但是我在示波器下观察,发现时没有波形输出的?请问是什么原因? #define   TASK_STACKSIZE       2048 OS_STK    task1 ...…

查看全部问答>