找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 24018|回复: 27
收起左侧

MCP23017 IIC接口16路IO扩展模块Arduino与单片机源码与资料下载

  [复制链接]
ID:285857 发表于 2018-2-27 09:42 | 显示全部楼层 |阅读模式
非常实用的IO扩展模块
0.png

简介
模块为 I2C 接口的 16 路 IO 扩展模块,采用 MicroChip 的 MCP23017 芯片。芯片功能完备,每个 IO可任意配置为输入或输出,可设置使用上拉电阻,并且配置为输入的 IO 都可以启用中断功能。IO 接口驱动能力强,灌电流、拉电流可达25mA。
        MCP23017 为高速 IIC 接口,支持 100KHz、400KHz、1.7MHz 的 IIC 频率。芯片有 3 个地址引脚,可设置8个不同地址,所以通过两根 IIC总线可连接8个模块,实现最多 128 个IO扩展。
        资料中提供了模块驱动程序(包含 51 单片机驱动程序、Arduino 库文件和例程),程序的各个函数使用起来非常方便,很容易集成到其他程序中。

特性
1)驱动IC:MCP23017-E/SS
2)工作电压  3.3V、5V
3)输入电压  3V-5.5V
4)工作温度:-40℃~12℃
5)模块尺寸:66x19mm
6)多个并联:可以,最多支持8 个
0.png 0.png 0.png

1)驱动IC

MCP23017 是专用IIC接口IO扩展芯片,一个芯片可以扩展 16路IO,16 个IO可以独立任意设置为输入、输出,设置为输入时可设置为中断输入。输出端口的电流驱动能力强,最大25mA。详细参数见MCP23017数据手册。

2)模块供电
模块控制接口的工作电压3V~5.5V,VCC电源不要供超过此范围的电压,否则可能烧毁模块。

3)控制接口
模块控制接口采用的是双排接口,每个标号同时有两个排针,这样方便多个模块并联接线,免得从单片机开发板引出多根线到每个模块。 控制接口包括SCL、SDA、RST、ITA、ITB。
  RST接到低电平时,芯片复位,在板上有一个10K欧姆的上拉电阻将RST拉到了VCC,如果不需要通过单片机控制芯片复位,在使用模块时,此引脚可不接线。
  ITA、ITB是中断输出引脚,ITA对应GPIOA上的输入中断,ITB对应GPIOB 上的输入中断。不使用中断可不接,使用中断时可接到单片机的外部中断引脚上。
ITA、ITB可联合在一起使用,即当16 个IO上任何一个中断输入产生中断时,ITA和ITB同时产生中断输出。具体在驱动函数的MCP23017 初始化函数中配置。
ITA、ITB的输出类型可设置位 OD输出,推挽输出-高电平有效,推挽输出-低电平有效,具体在具体在驱动函数的MCP23017 初始化函数中

4)硬件地址配置

  模块上A0、A1、A2 为芯片的3行操作时,注意程序中定义的芯片地址

例程使用方法
1、51 单片机例程
   
  我们提供的51单片机例程为Keil UV4中配置。
3 个硬件地址线。总共可产生8 个地址0x00~0x07地址要与模块的硬件地址相同。
Keil UV4工程,需要使用Keil UV4软件打开。
0.png
  在I2C_Core.c文件中定义了程序使用的
  如果您使用的是51 开发板,则可以按照此定义连接开发板和模块,如果需要修改使用的引脚,可以在此处修改后重新编译项目。

2、Arduino例程使用方法
   
  我们提供了Arduino IDE的库文件和例程,使用非常简单。只需要将《到Arduino IDE安装目录的arduino-1.0.5文件中定义了程序使用的51 单片机的引脚:
0.png
开发板,则可以按照此定义连接开发板和模块,如果需要修改使用的引脚,可以
的库文件和例程,使用非常简单。只需要将《TM16681.0.5-r2\libraries目录下。然后退出 Arduino IDE,重新启动开发板,则可以按照此定义连接开发板和模块,如果需要修改使用的引脚,可以
TM1668》这个文件夹整体复制,重新启动 ArduinoIDE,
在Arduino IDE的File-->Examples下会出现例程:
0.png

原理图
0.png

应该如何学习电子技术?
  电子技术是充满魅力并且引领未来的,但同时也是复杂的。那么,我们应该怎样去掌握它?
  1、实践——动手实践是最有效最扎实的学习途径。那么应该怎样实践?
  2、“先简单后复杂,先单一后综合”——这是学习复杂知识最有效的途径。
  3、了解每一个细节——细节就是知识基础和精华。所以要遵循这样的原则,打好坚实的基础。
  所以,我们专门设计了独具特色的开发板和各种应用模块。让应用更容易。

MCP23017_MCP23S17的中文资料与英文资料:
0.png

arduino库函数编写经验(源码可在附件下载)
1、例程的名字不能是以字母开头
2、每个例程都要放在一个同名的单独的文件夹中
3、每个类有一个构造函数,构造函数无返回值
4、检查每一行的结尾是否都有分号
5、error: expected `)' before numeric constant,一般是少逗号,少分号等
0.png
0.png


单片机源程序如下:
  1. /*------------------------------------------------------------------------------------
  2. * 项目名称:
  3.      MCP23017 IIC IO扩展模块测试程序v1.0

  4. * 功能描述:
  5.         1、程序首先将GPIOA和GPIOB都配置为输出,实现流水灯效果
  6.         2、然后将GPIOA设置为输出,GPIOB设置为输入,并开启GPIOB的中断,每次GPIOB上有中断时,
  7.         讲GPIOB的值写到GPIOA
  8. * 接线说明
  9.         VCC        —— 连接5V电源正极
  10.         GND —— 连接5V电源负极
  11.         SCL —— 连接单片机P1.0
  12.         SDA —— 连接单片机P1.1
  13.         RST —— 未连接,RST引脚为低电平时,器件复位
  14.         INTA —— 连接到单片机P3.2(INT0)
  15.         INTB —— 连接到单片机P3.3(INT1)

  16. * MCP23017使用方法
  17.         0、上电复位后,器件所有IO默认为输入状态
  18.         1、首先调用初始化函数初始化MCP23017
  19.         2、调用相关的输入输出配置函数,上拉电阻配置函数,中断配置函数配置各个IO
  20.         3、然后可以读取或设置GPIO的状态

  21. * 版权信息:

  22.      (c) 飞翼电子, 2017.

  23. * 历史版本:
  24.          
  25.      2017-06-08:
  26.        - 初始版本 V1.0.0;

  27. * 配置说明:
  28.      MCU:             AT89S51
  29.      晶振:                外部晶振:11.0592MHz
  30.      扩展模块:            -
  31.      软件:            Keil.C51.V9.01

  32.      - 编译前,请根据硬件连接配置MCU与模块的通讯接口
  33.          - 将开发板的串口与PC连接

  34. /************************包含头文件***************************************************/

  35. #include <reg51.h>
  36. #include "MCP23017.H"
  37. #include "usart.h"


  38. /************************公共常量定义*************************************************/
  39. //定义MCP23017器件硬件地址,取值范围0x00~0x07,需要与模块上A0、A1、A2的配置相同
  40. //根据实际地址进行修改
  41. unsigned char deviceAddr = 0x00;
  42. /************************全局变量****************************************************/                               
  43. unsigned char IntFlag;
  44. /*************************************************************************************
  45. *函数名:Delay(unsigned char time)
  46. *功  能:延时函数
  47. **************************************************************************************/
  48. void Delay(unsigned char time)
  49. {
  50.         int i,j,k;
  51.         for(i=0;i<time;i++)
  52.                 for(j=0;j<50;j++)
  53.                         for(k=0;k<200;k++)
  54.                         {
  55.                                 ;
  56.                         }
  57. }

  58. /************************主程序*******************************************************/
  59. void main()
  60. {       
  61.         unsigned char addr=0;
  62.         unsigned char i;
  63.         unsigned char tmp = 0x01;
  64.         bit res;                                                                //定义一个BOOL变量
  65.        
  66.         EA=1;                                                                        //使能全局中断
  67.         IT0=0;                                                                        //设置外部中断0为低电平有效中断
  68.         EX0=1;                                                                        //使能外部中断0
  69.         IT1=0;                                                                        //设置设置外部中断1为低电平中断
  70.         EX1=1;                                                                        //使能外部中断1

  71.         InitSerialPort();
  72.                                        
  73.         //初始化MCP23017,INTA和INTB独立,使能硬件地址,INTA和INTB设置为开漏输出
  74.         MCP23017_INIT(deviceAddr,INTA_INTB_INDEPENDENT,HWA_EN,INT_OD);

  75.         Delay(1);
  76.         //将PORTA和PORTB都设置为输出
  77.         MCP23017_IO_DIR(deviceAddr,MCP23017_PORTA,ALLPIN,OUTPUT);

  78.         //将PORTB设置为输入,使能上拉,并配置中断低电平中断
  79.         MCP23017_IO_DIR(deviceAddr,MCP23017_PORTB,ALLPIN,INPUT);
  80.         MCP23017_IO_PU(deviceAddr,MCP23017_PORTB,ALLPIN,ENABLE);
  81.         MCP23017_IO_INT(deviceAddr,MCP23017_PORTB,ALLPIN,LOWLEVEL_INTERRUPT);
  82.        
  83.         while(1)
  84.         {
  85.            //发生中断后
  86.            if(IntFlag == 1)
  87.            {
  88.                    //读取PORTB端口值,写到PORTA
  89.                    i = MCP23017_READ_GPIO(deviceAddr,MCP23017_PORTB);
  90.                    MCP23017_WRITE_GPIO(deviceAddr,MCP23017_PORTA,i);

  91.                    IntFlag = 0;
  92.            }
  93.            //把端口值通过串口发送
  94.            SendByte(i);
  95.            Delay(1);
  96. ……………………

  97. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
MCP23017 IIC接口16路IO扩展模块资料v1.0.rar (6.26 MB, 下载次数: 483)
回复

使用道具 举报

ID:293685 发表于 2018-3-18 19:21 | 显示全部楼层
这么好的模块,在哪里购买呢
回复

使用道具 举报

ID:394963 发表于 2018-9-7 13:40 来自手机 | 显示全部楼层
下下来学习一下
回复

使用道具 举报

ID:196774 发表于 2018-9-8 21:24 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:404261 发表于 2018-9-30 10:25 | 显示全部楼层
谁可以发给我参考一下嘛
回复

使用道具 举报

ID:426026 发表于 2018-11-13 21:36 来自手机 | 显示全部楼层
我买了1个不大会用,黑币不够,谁给发个邮箱912163586@qq.com
回复

使用道具 举报

ID:150905 发表于 2018-12-8 09:05 | 显示全部楼层

这么好的模块,在哪里购买呢
我买了1个不大会用
回复

使用道具 举报

ID:439095 发表于 2018-12-24 14:32 | 显示全部楼层
我买了1个不大会用 正好看到论坛有介绍 了解一下
回复

使用道具 举报

ID:477982 发表于 2019-2-19 09:50 | 显示全部楼层
请问这个芯片怎么配置为16位的模式,还是说只能对PORTA和PORTB分别操作?
回复

使用道具 举报

ID:480504 发表于 2019-2-25 17:10 | 显示全部楼层
谢谢分享,正准备去买一个
回复

使用道具 举报

ID:82863 发表于 2019-5-11 18:56 | 显示全部楼层
现在单片机那么多IO口,还用到扩展吗?选型的时候就选个144IO口的还不够?
回复

使用道具 举报

ID:539125 发表于 2019-5-15 17:56 | 显示全部楼层
看一看
回复

使用道具 举报

ID:627156 发表于 2019-11-3 13:38 | 显示全部楼层
学学iic和spi
回复

使用道具 举报

ID:634994 发表于 2019-11-3 20:58 | 显示全部楼层
太赞了  好好学习一下
回复

使用道具 举报

ID:333807 发表于 2020-2-4 12:20 | 显示全部楼层
谢谢分享,正准备去买一个
回复

使用道具 举报

ID:337014 发表于 2020-3-5 22:30 | 显示全部楼层
学习一下
回复

使用道具 举报

ID:687471 发表于 2020-5-24 15:26 | 显示全部楼层
感谢楼住分享
回复

使用道具 举报

ID:775711 发表于 2020-7-10 23:23 | 显示全部楼层
大佬,资料怎么下载啊
回复

使用道具 举报

ID:803440 发表于 2020-7-15 00:27 | 显示全部楼层
买了一个不太会用啊
回复

使用道具 举报

ID:556672 发表于 2020-11-30 19:38 | 显示全部楼层
刚买一块不会用,这个帖子中文介绍的很全,值得参考,感谢楼主分享。
回复

使用道具 举报

ID:66915 发表于 2021-1-18 21:50 | 显示全部楼层
不错不错啊,有没有 spi 的 io 扩展芯片驱动 ??
回复

使用道具 举报

ID:90718 发表于 2021-1-19 16:54 | 显示全部楼层
hpdell 发表于 2021-1-18 21:50
不错不错啊,有没有 spi 的 io 扩展芯片驱动 ??

MCP23S17哈
回复

使用道具 举报

ID:66915 发表于 2021-1-24 17:57 | 显示全部楼层

芯片貌似不好买呀,

我刚刚查到另外一款 spi 的 io 口扩展芯片】

MAX7301AAX 可以扩展 28个 io 口,速度是 26MHz, 只是不知道程序是否比较好调试啊 ?

有没有谁使用过这个芯片啊 ???
回复

使用道具 举报

ID:603678 发表于 2021-1-29 12:48 | 显示全部楼层
scamel 发表于 2018-3-18 19:21
**** 作者被禁止或删除 内容自动屏蔽 ****

τ 宝上有,几元一个
回复

使用道具 举报

ID:891690 发表于 2021-3-14 08:09 | 显示全部楼层
scamel 发表于 2018-3-18 19:21
**** 作者被禁止或删除 内容自动屏蔽 ****

τ 宝网上搜索MCP23017模块就行的
回复

使用道具 举报

ID:796531 发表于 2021-7-7 10:41 | 显示全部楼层
好东西,写的很详细,最近正在学习这个芯片,谢谢!
回复

使用道具 举报

ID:272119 发表于 2021-7-21 16:02 | 显示全部楼层
正在选型,这种锁存方式的扩展比LS164专业的多.
回复

使用道具 举报

ID:961861 发表于 2021-8-23 11:47 | 显示全部楼层
我们准备用ATtiny202和MCP23017来实现8个按键开关控制8个继电器工作;这样行吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表