PIC IIC读写

发布者:skyhcg最新更新时间:2016-11-02 来源: eefocus关键字:PIC  IIC读写 手机看文章 扫描二维码
随时随地手机看文章
用c语言实现24LC256读写(非软件模拟方式)

#include
unsigned CHAR i=0;
unsigned CHAR receive=0x00;

void i2c_start()
{
    SEN=1;   //启动
    do{
    }while(SSPIF==0);
    SSPIF=0;
}

void i2c_stop()
{
    PEN=1;       //产生停止条件
    do{
    ;
    }while(SSPIF==0);
    SSPIF=0;
}

void i2c_restart()
{
    RSEN=1;  //启动,反复启动
    do{
    ;
    }while(SSPIF==0);
    SSPIF=0;
}

void i2c_dataout()   //数据发送等待过程
{
    do{
    ;
    }while(SSPIF==0);
    SSPIF=0;
}

void i2c_datain()   //读取24LC256时,不是读的最后一个字节时使用
{
    RCEN=1;
    do{
    ;
    }while(SSPIF==0);
    SSPIF=0;
    receive=SSPBUF;
    ACKDT=0;
    ACKEN=1;
    do{
    ;
    }while(SSPIF==0);
    SSPIF=0;
}

void i2c_datainlast()   //读取最后一个字节,或只读取24LC256中一个字节
{
    SSPIF=0;
    RCEN=1;
    do{
    ;
    }while(SSPIF==0);
    SSPIF=0;
    receive=SSPBUF;
    ACKDT=1 ;
    ACKEN=1;
    do{
    ;
    }while(SSPIF==0);
    SSPIF=0;
    
}

void i2c_error()
{
    i2c_stop();
    return;
}

void write(unsigned int addr,unsigned CHAR data,unsigned int n)  //向iic写入一字节数据 地址,数据,字节个数
{
    i2c_start();
    SSPBUF=0xA0;//EEPROM寻址码和写操作命令码
    i2c_dataout(); //发送
    
    if(ACKSTAT)
    i2c_error();   //无应答,错误!
    else if(!ACKSTAT)
    SSPBUF=addr/256;
        //高eeaddr/256  ,取EEPROM数据地址高字节
    i2c_dataout(); //发送
    
    if(ACKSTAT)
    i2c_error();   //无应答,错误!
    else if(!ACKSTAT)
    SSPBUF=addr%256;//低eeaddr%256 ,取EEPROM数据地址低字节
    i2c_dataout(); //发送
    
    for(i=0;i     {
        if(ACKSTAT)//应答
        i2c_error();  //无应答,错误!
        else if(!ACKSTAT)
        SSPBUF=data;//eedata      EEPROM的数据
        i2c_dataout();//发送
    }
    
    if(ACKSTAT)//应答
    i2c_error();
    
    i2c_stop();   //产生停止位,启动EEPROM内部些过程
    
    do{
    i2c_start();
    SSPBUF=0xA0;
    i2c_dataout();
    i2c_stop();
    if(!ACKSTAT)break;
    }while(ACKSTAT);
}

unsigned int current_read(void)//current address read ok!
{
    i2c_start();
    SSPBUF=0xA1;//寻址命令码0xA0 和 读命令
    i2c_dataout();
    if(ACKSTAT)//应答
    i2c_error();
    else if(!ACKSTAT)
    i2c_datainlast();
    i2c_stop();

    return ((unsigned int)receive);
}

unsigned int random_read(unsigned int EEPROMaddress)
{
    i2c_start();
    SSPBUF=0xA0;//EEPROM寻址码和写操作命令码
    i2c_dataout(); //发送
    
    if(ACKSTAT)
    i2c_error();   //无应答,错误!
    else if(!ACKSTAT)
    SSPBUF=EEPROMaddress/256;
        //高eeaddr/256  ,取EEPROM数据地址高字节
    i2c_dataout(); //发送
    
    if(ACKSTAT)
    i2c_error();   //无应答,错误!
    else if(!ACKSTAT)
    SSPBUF=EEPROMaddress%256;//低eeaddr%256 ,取EEPROM数据地址低字节
    i2c_dataout(); //发送
    
    if(ACKSTAT)
    i2c_error();   //无应答,错误!
    else if(!ACKSTAT)
        
    i2c_restart();
    SSPBUF=0xA1;//寻址命令码0xA0 和 读命令
    i2c_dataout();
    
    if(ACKSTAT)//应答
    i2c_error();
    else if(!ACKSTAT)
    i2c_datainlast();
    i2c_stop();
     return ((unsigned int)receive);
    
}

void i2c_init()
{
    SSPSTAT=0x00;
    TRISC=0xD8;
    SSPADD=19;
    SSPIE=0;
    SSPCON=0x28;    
}

 


//在主程序中,先i2c_init();然后开始读/写24LC256中数据,经多次运行
  no bug
//程序中的寄存器必须芯片内部包含,否则无法实现硬件iic读写。

关键字:PIC  IIC读写 引用地址:PIC IIC读写

上一篇:基于PIC单片机的实时温度控制系统
下一篇:PIC串口通信程序(2)中断1602回显

推荐阅读最新更新时间:2024-03-16 15:19

PIC单片机开发需注意的几个问题
1 怎样进一步降低功耗 功耗,在电池供电的仪器仪表中是一个重要的考虑因素。PIC16C××系列单片机本身的功耗较低(在5V,4MHz振荡频率时工作电流小于2mA)。为进一步降低功耗,在保证满足工作要求的前提下,可采用降低工作频率的方法,工作频率的下降可大大降低功耗(如PIC16C××在3V,32kHz下工作,其电流可减小到15μA),但较低的工作频率可能导致部分子程序(如数学计算)需占用较多的时间。在这种情况下,当单片机的振荡方式采用RC电路形式时,可以采用中途提高工作频率的办法来解决。 具体做法是在闲置的一个I/O脚(如RB1)和OSC1管脚之间跨接一电阻(R1),如图1所示。低速状态置RB1=0。需进行快速运算时先置R
[单片机]
基于PIC单片机的热能表研制
摘要:随着我国福利制度的改革和热能计量的规范化,对热能的准确计量成为一个比较关键的环节。文中介绍了热能表的组成和工作原理,给出了一种基于PIC16C64单片机的热能表设计方案,同时对设计和使用中的一些问题进行了讨论并提出了解决办法。 关键词:热能表 单片机 温度传感器 PIC16C64 随着我国福利制度的改革,供暖制度也发生了相应的变化。原来的供暖收费存在着对使用的热能估算不准确、收费不合理等问题。为此,国家建设部在一些城市实施供暖制度改革试点,并对热能实行计量收费,这就要求对使用的热能进行准确的计量。本文给出了一种基于PIC16C64单片机的、针对热水供暖的热能表设计方案。 1 热能表的组成原理 一般热能表的原理框图如图
[应用]
PIC做的红外线遥控接收程序
红外接收目前用的比较多的有三种方法. 1,查询法,既软件不停地查询是否为低(遥控信号)然后通过精确延时读头码.和 数据0或1码. 2,读到有信号输入时开打开定时计数器,然后通过读定时器的中断次数,来判定头码和0,1的. 3 RB0或RB4-RB7加定时器(或软件延时)利用输入中断的好处是可做实时控制. 如下: ;***发射为6221,把接收到的码值送到 IC D的PORTC口显示****** ;**************** *************** org 0000h nop goto start org 0004h goto serv ;**********
[单片机]
pic单片机IIC通信读24C02程序例 16F877A 主频4M
文本名为 iic.h #ifndef _iic_h_ #define _iic_h_//pic单片机IIC通信初始化函数声明 void iiccsh(void); //pic单片机IIC通信读外围设备函数声明 //功能:传送一个8位地址,返回一个8位数据 unsigned char iicread(unsigned char data); //pic单片机IIC通信给外围器件发送函数声明 //功能:传送一个8位地址,传送一个8位数据或指令 void iicwrite(unsigned char diz,unsigned char data); #endif 文本名为 iic.c#ifndef _iic_h_ //立
[单片机]
Windows下PIC 8位单片机源程序汇编和固化(四)
4 在MPLAB中创建项目 项目管理程序(Project Manager)是MPLAB集成开发软件的重要组成部分。不创建项目就不能进行符号(源程序代码)汇编和调试,在整个项目管理中可进行以下操作:创建项目——把源代码文件加入到项目中——汇编源代码——编辑源代码——重建所有源文件——调试源代码等。 创建项目也是汇编源程序之前必要的准备工作,其操作过程如下:按照以上介绍的方法,在PC机上打开MPLAB集成开发软件的桌面,选择Project(项目)命令,用鼠标键点击菜单栏中的Project,在其下拉菜单中选择New Project(新项目)命令,并用鼠标键点击它,则可在MPLAB的桌面上打开New Project(新项目)的对话框,如图
[单片机]
PIC16位单片机CAN(5)中断
CAN数据的接收使用中断来处理。ECAN 模块会产生三种不同中断,每种中断都具有自己的中断向量、中断允许控制位、中断状态标志和中断优先级控制位。这些中断是: ? CiTX ECAN 发送数据请求 ? CiRX ECAN 接收数据就绪 ? Ci ECAN 事件中断 具体这三种中断的意义就不说了,看手册就行了。我使用的是事件中断也就是当成功接收报文并装入一个接收缓冲区 (报文缓冲区 0 至 31)时产生中断。 中断算是比较简单的,看一下初始化代码: /* Enable ECAN1 Interrupt */ void Interrupt_Init(void) { INTCON2bits.GIE = 1;//使能全局中断
[单片机]
PIC16C71/PIC16C84单片机应用中问题和对策
一:PIC16C71单片机的问题和对策 问题1:在芯片进入低功耗睡眠模式 (SLEEP MODE)后,其振荡脚将处于浮态,这将使芯片的睡眠功耗上升,比原手册中的指标高了10μA以上。 对策:在振荡脚OSC1和地 (GND)之间加一10MΩ电阻可防止OSC1进入浮态,且不会影响单片机正常振荡。 问题2:RA口方向寄存器TRISA目前只是一个4位寄存器,对应于RA0~RA3,并非手册中所言是8位寄存器,对应于RA0~RA4,即RA4并没有相应的输入/输出方向控制位,它是一个具有开极输出,施密特输入I/O脚。 对策:避免使用对RA口进行读-修改-写指令(如BCF RA, BSF RA),以免非意愿地改变RA4的输入/输出
[单片机]
提高PIC16C711单片机片内A/D分辨率的方法
摘要:介绍一种将PIC16C711片内8位A/D提高到11位的方法。此方法电路简单,速度快,可提高单片机应用系统的性能价格比,具有一定的推广价值。 关键词:PIC16C711 单片机 A/D 分辨率 目前,单片机中嵌入的A/D一般为8位到10位,难以满足信号处理应用中高分辨率的要求;而外接高分辨率的A/D将使成本明显提高,因为A/D转换器的价格将随其位数的增加而成倍增加。本文介绍一种提高PIC16C711单片机片内A/D分辨率的方法,将PIC16C711片内的8位A/D提高到11位。这种方法在PIC系列的其他单片机也适用。 美国Microchip公司推出的8位单片机PIC16C711是一种性能价格比很高的单片机。它价格低、封
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved