PIC单片机之I/O控制

 I/O控制对于单片机而言是最基础最核心的东西,其实单片机除了AD DA 转换之外的事情。其他大部分的事情I/O口都能做的到。I/O控制简单却能千变万化。

 单片机在大部分应用中做的事情,莫过于 输入高低电平 ,输出高低电平。就是通过这简单的控制电平来实现大多数的应用控制。

 什么是I/O口?

 什么是I/O  就是 IN/OUT 就是 输入/输出。

 I/O具体能做什么呢?

     如果你是刚刚步入电子的新手,那你最好要知道一下I/O口具体能做什么。感性的认识对你的学习是很有帮助的。I/O口输出一个高(低)电平可以用来点亮一个LED灯,可以接通过一个继电器,来开启电机,来开启音响。开启许多的东西,也可以用于通信等等。输入一个高(低)电平 可以用来检测按键,检测红外线输入 ,检测信号,等等。 

 I/O口和寄存器之间的对应关系

首先看下一个芯片的原理图。 注意 RA5~RA0这些口

在看看RA口的方向控制寄存器TRISA

   

在看看RA口的数据控制寄存器PORTA

   

 可以看出 芯片原理图中的第二脚 RA5 口 和 TRISA 寄存器中的TRISA5位对应 和PORTA寄存器中的 RA5位对应的,RA4~RA0都是如此对应的。

 也就是说TRISA 寄存器中的TRISA5位 和PORTA寄存器中的 RA5位来控制 第二脚的RA5口。

 如何控制I/O口?

 其实控制单片机,就是控制寄存器上的各个位,设置成高设置成低。就好像给你一台机器有  8个的按钮。然后你根据说明书上介绍,根据你的需要按下 或者松开相应的按键 来得到你想得到的功能。只不过我们用的不是手而是C语言来按下和松开这些按键。 

 TRISA寄存器是方向控制寄存器。就是控制I/O输入还是输出。比如 TRISA寄存器中的TRISA5位 设置成为0 RA5口是输出 设置成为1 RA5口为是输入。

  C语言的具体实现:

   将RA5口设置成输入的几种方式

    第一种   TRISAbits.TRISA5=1; //简单明了,只影响一个位 设置单个I/O比较方便

    第二种   TRISA |= 0x20;//不够明了,只影响一个位

    第三种   TRISA  =0x20;//不够明了,影响到其他位,设置多个I/O用比较方便

  将RA5口设置成输出的几种方式

    第一种   TRISAbits.TRISA5=0;

    第二种   TRISA &= ~0x20;

    第三种   TRISA  =0x00;

 PORTA寄存器是数据控制寄存器。如果是输出状态:PORTA寄存器中的RA5位为0  则RA5口输出低电平,PORTA寄存器中的RA5位为1  则RA5口输出高电平。

                                                              如果是输入状态:PORTA寄存器中的RA5位为0  则说明RA5口当前为低电平,PORTA寄存器中的RA5位为1  则说明RA5口当前为高电平。

实例程序:

  如果在RA5口上连接着一个LED灯。我们将如何点亮他呢?

/* 

开发环境为 MPLAB X IDE,芯片型号为PIC16LF1823

*/

#include<pic.h>  //头文件
__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF&BOREN_ON

                   &CLKOUTEN_OFF&IESO_ON&FCMEN_ON);//这个要放到上一行去
__CONFIG(PLLEN_OFF&LVP_OFF) ;//配置位
int main(int argc, char** argv) {


    ANSELA=0;//将RA口全部设置成数字口,
    TRISAbits.TRISA5=0;//设置RA5为输出
    PORTAbits.RA5=1;//设置输出高电平点亮LED

    while(1);//程序在此无限循环
}

头文件:程序中只要有了#include<pic.h>编译器就会去自动找到相应型号的头文件,头文件中定义好了每个寄存器的地址,位的地址等。

配置位:这是十分重要即使程序没有任何错误 配置位没配置好程序一样不能用。具体如何配置可以看( 基于MPLAB X IDE配置位设置讲解 )。

模拟数字口:在使用I/O口的时候要确保对应的I/O口是被设置成数字口的。



  

  


                                           


  

 

  

 

  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
以下是使用PIC单片机的C语言编写的一个10秒的I/O口高低电平的中断程序示例: ```c #include <xc.h> // 配置配置位 #pragma config FOSC = INTOSC // 内部振荡器 #pragma config WDTE = OFF // 禁用看门狗定器 #pragma config PWRTE = ON // 电源上电延 #pragma config MCLRE = OFF // MCLR引脚功能禁用 #pragma config CP = OFF // 代码保护禁用 #pragma config CPD = OFF // 数据保护禁用 #pragma config BOREN = ON // 压控复位功能使能 #pragma config CLKOUTEN = OFF // CLKOUT引脚禁用 // 中断服务子程序 void interrupt ISR() { if (TMR0IF) { // TMR0中断标志位被置位 LATCbits.LATC0 = ~LATCbits.LATC0; // 翻转RC0引脚状态(高低电平切换) TMR0IF = 0; // 清除TMR0中断标志位 TMR0 = 15536; // 重新加载TMR0计数器初始值(10ms的间间隔) } } void main() { // 配置IO口 TRISCbits.TRISC0 = 0; // RC0引脚设置为输出模式 // 配置TMR0定器 OPTION_REGbits.TMR0CS = 0; // 内部钟源 OPTION_REGbits.PSA = 0; // 预分频器使能 OPTION_REGbits.PS = 0b111; // 预分频器设置为1:256分频 // 初始化TMR0计数器初始值为15536(10ms的间间隔) TMR0 = 15536; // 使能TMR0中断 TMR0IE = 1; // 使能全局中断 GIE = 1; // 主循环 while (1) { // 执行其他任务 } } ``` 以上示例使用了PIC单片机的C语言编写了一个10秒的I/O口高低电平的中断程序。在主函数中,我们首先配置了IO口和TMR0定器的相关设置。然后,我们初始化TMR0计数器的初始值为15536,这样每次TMR0中断发生,经过10ms的间间隔,RC0引脚的电平状态会翻转一次。最后,我们开启TMR0中断和全局中断,并在主循环中执行其他任务。 请注意,以上示例仅供参考,具体的编写方式和配置可能会根据使用的PIC单片机型号和编程环境的不同而有所差异。在实际应用中,您需要根据自己的需求和单片机的规格手册进行详细的编写和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值