PIC单片机之I2C总线

发布者:自在逍遥最新更新时间:2020-02-04 来源: eefocus关键字:PIC单片机  I2C总线  主从结构 手机看文章 扫描二维码
随时随地手机看文章

大家好,通过前一期的学习,我们已经对ICD2 仿真烧写器和增强型PIC 实验板的使用方法及学习方式有所了解与熟悉,学会了如何用单片机来控制发光管、继电器、蜂鸣器、按键、数码管、RS232 串口、步进电机、温度传感器等资源,体会到了学习板的易用性与易学性,看了前几期实例,当你实验成功后一定很兴奋,很有成就感吧!现在我们就趁热打铁,再向上跨一步,一起来学习一下I2C 总线的工作原理及使用方法,这样我们可以将一些我们要保存的数据存储到I2C总线的非易失存储器中,实现断电保持的功能,比如:你设置了一个密码,但不至于这个设备断过电以后就要重新设置过,我们可以将密码数据写在非易失存储器里面,还有如汽车的量程表的读数是不断累计的,可以通过不断访问I2C 存储器实现。


一、I2C总线特点


I2C 总线是主从结构,单片机是主器件,存储器是从器件。一条总线可以带多个从器件( 也可以有多主结构),I2C 总线的SDA 和SCL 是双向的,开路门结构,通过上拉电阻接正电源。进行数据传输时,SDA 线上的数据必须在时钟的高电平周期保持稳定。数据线的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变,如图1 所示。


图1 数据位的有效性规定


图1 数据位的有效性规定


在SCL 线是高电平时,SDA 线从高电平向低电平切换表示起始条件;当SCL 是高电平时SDA 线由低电平向高电平切换表示停止条件如图2 所示。


图2 起始和停止信号


图2 起始和停止信号


发送到SDA 线上的每个字节必须为8 位。


可以由高位到低位传输多个字节。每个字节后必须跟一个响应位(ACK)。响应时钟脉冲由主机产生。主机释放SDA 线从机将SDA 线拉低,并在时钟脉冲的高电平期间保持稳定。如图3 示。当主机接受数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。这个信号是由主机对从机的“非应答”来实现的。然后,从机释放SDA 线,以允许主机产生终止或重复起始信号。


图3 字节格式与应答


图3 字节格式与应答




二、数据帧格式


(1)主机向从机发送数据,数据的传送方向在传输过程中不改变,如图4 所示。


图4 主机向从机发送数据


图4 主机向从机发送数据


注:阴影部分:表示主机向从机发送数据;无阴影部分:表示主机向从机读取数据。


A:表示应答;:表示非应答。S:起始信号;P :终止信号。


(2)主机在第一个字节后,立即向从机读取数据,如图5 所示。


图5 主机在第一个字节后立即读从机


图5 主机在第一个字节后立即读从机


(3)复合格式,如图6 所示。传输改变方向的时候,起始条件和从机地址都会被重复,但R/ W-位取反。如果主机接收器发送一个停止或重复起始信号,它之前应该发送了一个不响应信号()。


图6 复合格式


图6 复合格式


由以上格式可见,无论哪种传输方式,起始信号、终止信号和地址均由主机发出(图中阴影部分),数据字节的传送方向则由寻址字节中的方向位规定,每个字节的传送都必须有应答位(A 或)。


下面通过24C02 实例在增强型PIC 实验板上编程,其硬件原理图如图7 所示,U7 为实验板上24C02 芯片,SDA 与单片机的RB5 口相连,SCL 与单片机RB4 相连,七段数码管D5、D7、D8 组成了显示单元,字形码的数据通过RC 口送入,各数码管的显示片选信号分别不同的RA 口进行控制。


图7 读/ 写AT24C 系列存储器原理图


图7 读/ 写AT24C 系列存储器原理图


在MPLab IDE 软件中新建工程,加入源程序代码,同时进行芯片型号的选择和配置位的设置,我们实验所用的芯片型号为PIC16F877A。


编写的程序代码如下,其中程序流程图如图8 所示。




三、软件流程图


图8 I2C 总线读/ 写数据流程图


图8 I2C 总线读/ 写数据流程图


四、软件代码


/**********/


/* 目标器件:PIC16F877A */


/* 晶振:4.0MHZ */


/* 编译环境:MPLAB V7.51 */


/**********/


/**********


包含头文件


**********/


#include


/**********


数据定义


**********/


#define address 0xa


#define nop() asm("nop")


#define OP_READ 0xa1


// 器件地址以及读取操作


#define OP_WRITE 0xa0


// 器件地址以及写入操作


/**********


端口定义


**********/


#define SCL RB4


#define SDA RB5


#define SCLIO TRISB4


#define SDAIO TRISB5


/**********


共阴LED 段码表


**********/


const char table[]={0xC0,0xF9,0xA4,0x


B0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x


83,0xC6,0xA1,0x86,0x8E};


/**********


函数功能: 延时子程序


**********/


void delay()


{


int i;


for(i=0;i<100;i++)


{;}


}


/**********


函数功能: 开始信号


**********/


void start()


{


SDA=1;


nop();


SCL=1;


nop();nop();nop();nop();nop();




SDA=0;


nop();nop();nop();nop();nop();


SCL=0;


nop();nop();


}


/**********


函数功能: 停止信号


**********/


void stop()


{


SDA=0;


nop();


SCL=1;


nop();nop();nop();nop();nop();


SDA=1;


nop();nop();nop();nop();


}


/**********


函数功能: 读取数据


出口参数:read_data


**********/


unsigned char shin()


{


unsigned char i,read_data;


for(i=0;i<8;i++)


{ nop();nop();nop();


SCL=1;


nop();nop();


read_data《=1;


if(SDA == 1)


read_data=read_data+1;


nop();


SCL=0;


}


return(read_data);


}


/**********


函数功能: 向EEPROM 写数据


入口参数:write_data


出口参数:ack_bit


**********/


bit shout(unsigned char write_data)


{


unsigned char i;


unsigned char ack_bit;


for(i = 0; i < 8; i++)


{


if(write_data&0x80)


SDA=1;


else


SDA=0;


nop();


SCL = 1;


nop();nop();nop();nop();nop();


SCL = 0;


nop();


write_data 《= 1;


}


nop();nop();


SDA = 1;


nop();nop();


SCL = 1;


nop();nop();nop();


ack_bit = SDA; // 读取应答


SCL = 0;


nop();nop();


return ack_bit;


// 返回AT24Cxx 应答位


}


/**********


函数功能: 向指定地址写数据


入口参数:addr,write_data


**********/


void write_byte(unsigned char addr,


unsigned char write_data)


{


start();


shout(OP_WRITE);


shout(addr);




SDAIO = 0;


// 在写入数据前SDA 应设置为输出


shout(write_data);


stop();


delay();


}


/**********


函数功能: 向指定地址读数据


入口参数:random_addr


出口参数:read_data


**********/


unsigned char read_random(unsigned


char random_addr)


{ unsigned char read_data;


start();


shout(OP_WRITE);


shout(random_addr);


start();


shout(OP_READ);


SDAIO = 1;


// 读取数据前SDA 应设置为输入


read_data = shin();


stop();


return(read_data);


}


/**********


函数功能: 显示子程序


入口参数:k


**********/


void display(unsigned char k)


{


TRISA=0X00;


// 设置A 口全为输出


PORTC=table[k/1000];


// 显示千位


PORTA=0xEF;


delay();


PORTC=table[k/100%10];


// 显示百位


PORTA=0xDF;


delay();


PORTC = table [k/ 10%10] ;


// 显示十位


PORTA=0xFB;


delay();


PORTC=table[k%10]; // 显示个位


PORTA=0xF7;


delay();


}


/**********


函数功能: 主程序


**********/


void main()


{


unsigned char eepromdata;


TRISB=0X00;


OPTION&=~(1《7);


// 设置RB 口内部上拉电阻有效


TRISC=0X00;


PORTB=0X00;


PORTC=0xff;


TRISA=0X00;


eepromdata=0;


write_byte(0x01,0x55);


// 向0x01 地址写入0x55(85) 的数据


delay();


write_byte(0x02,0xaa);


// 向0x02 地址写入0xAA(170) 的数据


delay();


eepromdata=read_random(0x02);


// 读取其中一个地址内的数据来验证


while(1)


{


display(eepromdata);


}


}


编好程序后将编译好的HEX 码通过ICD2仿真烧写器烧入单片机芯片,上电运行,主程序中在0x01 地址写入了“0x55”, 在0x02 地址写入了“0xaa”,然后在while 循环中读出0x02地址的值,也就是我们之前写入的“0x55”,读出后显示在数码管上,我们可以看到数码管显示“170”,即“0xaa”相应的十进制数。


作为初学者的读者一定对有些语句会有点疑问,可以看程序中的注释部份,24c 系列IC 数据手册和源程序相结合来进行分析。

关键字:PIC单片机  I2C总线  主从结构 引用地址:PIC单片机之I2C总线

上一篇:基于PIC单片机产生SPWM信号控制逆变桥的方法设计
下一篇:PIC单片机之步进电机

推荐阅读最新更新时间:2024-11-08 18:09

PIC单片机学习心得
1.前言 为了给前一段时间学习PIC16F616型单片机的一个总结和方便大家的交流,我写了这篇关于PIC单片机的学习心得,都是在看了手册和编程调试后用自己的语言组织的,其中有不足或者有疑问的地方希望大家能及时的给予纠正和批评,提出宝贵的意见. 2.PIC单片机的概述 PIC16F616是一款14引脚、8位的CMOS单片机.采用精简指令集,仅有35条指令,由于采用了数据总线和指令总线分离的哈佛总线结构,使得除少量指令不是单周期之外,大部分的指令都是单周期指令.这样有利于提高单片机的运行速度和执行效率. PIC16F616 这款单片机供电电压可以在2V到5.5V之间,内部集成了一个RC振荡器,频率可以配置成8MHZ或者4
[单片机]
PIC单片机+LCD12864显示汉字程序
#include pic.h #define RS RD2 #define CS2 RD1 #define CS1 RD0 #define E RD4 #define RW RD3 #define BUSY RC7 const unsigned char tab2 ={ /*-- 文字: 福 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x08,0x08,0x89,0xCE,0x28,0x18,0x02,0x7A,0x4A,0x4A,0x4A,0x4A,0x4A,0x7A,0x02,0x00, 0x02,0x01,0x00,0xFF,0x01,0x02,0xF
[单片机]
<font color='red'>PIC单片机</font>+LCD12864显示汉字程序
通过长距离I2C总线可实现模拟信号的数字传输
  内部集成电路总线(I2C)是一种同步串行数据通信总线,其中由主器件发起通信,从器件通过寻址机制加以控制。I2C总线上的节点很容易连接,因为只需连接两条开漏形式的信号线(SDA用于数据,SCL用于时钟)。这些线上的电容是限制传输速率和节点间距离的主要因素。要想扩展速率和距离,有必要使用能够识别数据方向的缓冲器。本文所述的设计案例充分展示了PCA9605缓冲器的优势。   PCA9605是一种单片CMOS集成电路,可在包括I2C总线的应用中实现总线缓冲功能。该缓冲器可以通过缓冲驱动SCL和SDA线来扩展总线负载,缓冲器两侧可达到最大允许的总线电容。在其最基本的实现中,该缓冲器允许扩展数量的从器件连接到一个主器件。在本例设计中,主器件
[嵌入式]
PIC单片机简介
PIC单片机简介: PIC单片机(Peripheral Interface Controller)是一种用来可开发的去控制外围设备的可编程集成电路(IC)。由美国Microchip(微星)公司推出的PIC单片机系列产品,首先采用了RISC结构的嵌入式微控制器,其高速度、低电压、低功耗、大电流LCD驱动能力和低价位OTP技术等都体现出单片机产业的新趋势。现在PIC系列单片机在世界单片机市场的份额排名中已逐年升位,尤其在8位单片机市场,据称已从1990年的第20位上升到目前的第二位。PIC单片机从覆盖市场出发,已有三种(又称三层次)系列多种型号的产品问世,所以在全球都可以看到PIC单片机从电脑的外设、家电控制、电讯通信、智能仪器、
[单片机]
<font color='red'>PIC单片机</font>简介
基于PIC单片机的智能目标跟踪系统设计方案
摘 要: 通过借鉴嵌入式系统在电子技术、信号处理以及计算机等领域应用的成功经验,在分析目标检测与跟踪算法的基础上,将目标检测与跟踪算法与嵌入式技术相结合,设计一种基于嵌入式PIC32单片机的目标检测与跟踪系统,可以实现目标检测跟踪系统的小型化,智能化,并以具体飞行目标为例进行了目标的识别和跟踪。 研究目的 随着现代社会对军用和民用设备需求的不断扩大及要求的不断提高,运动目标的识别和跟踪技术已经迅速发展成为现代信息处理领域中一项非常重要的技术,也是无人机野外战场侦察技术中的重点和难点,并在许多领域内发挥着不可替代的作用。目前,基于PC 机的目标检测与跟踪技术已趋于成熟,但其在嵌入式平台的应用研究还处于初级阶段。由于嵌入式系统具有
[单片机]
基于<font color='red'>PIC单片机</font>的智能目标跟踪系统设计方案
PIC单片机SPI通信的设计
#include #define uchar unsigned char #define uint unsigned int #define cs RC2 #define dout RC4 #define nop() asm(“nop”) __CONFIG(0x3B31); const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar data_temp; void delay(uint x); void init(); void didi(uchar num); void
[单片机]
<font color='red'>PIC单片机</font>SPI通信的设计
PIC单片机开发环境搭建
1.PIC单片机的开发环境常用的是MPLAB, MPLAB可以从微芯公司网站上(http://www.microchip.com)下载;这个开发环境自带的是汇编程序的编译器,如果想用C语言做开发,那么需要下载相应的C语言编译器并安装,配套的C语言编译器为 MPLAB-C18, 可以从微芯公司网站上(http://www.microchip.com)下载。 2.首先下载好MPLAB和MPLAB-C18两个软件并解压。 首先安装MPLAB,解压好的MPLAB如下图所示: 双击setup,前半部分直接点击next即可,到中间部分会出现如下图所示的选择框: 这里可以选择是,后面的点击next即可。MPLAB安装完成之后,重启系统
[单片机]
基于UCC3895与PIC单片机的智能充电器
l 与温度无关的基准 与温度无关的电压或电流基准在许多模拟电路中是必不可少的。如何产生一个对温度变化保持恒定的量?假设有正温度系数的电压V1和负温度系数的电压V2,这两个量以适当的权重相加,那么结果就会显示出零温度系数。选取a和b使得aV1/ T+bv2/ T=0,可以得到具有零温度系数的电压基准,VREF=aV1+bV2。 上述假设提供了一个可行的方法实现与温度无关的电压基准,就是分别找到正温度系数的电压和负温度系数的电压。 1.1 负温度系数电压 双极晶体管的基极一发射极电压VBE或者pn结二极管的正向电压,具有负温度系数。根据已推导的VBE温度系数表达式 : 式(1)给出了在给定温度T下VBE的温度
[电源管理]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved