PIC单片机模拟读写24C01 EEPROM

发布者:HarmonyJoy最新更新时间:2016-11-17 来源: eefocus关键字:PIC单片机  模拟读写  24C01  EEPROM 手机看文章 扫描二维码
随时随地手机看文章

//************************************************** 
//实验目的: 
//熟悉使用单片机模拟读写24C01 EEPROM 
//1、首先向24C01 EEPROM写入数据 
//2、在从24C01 EEPROM中读取数据,并用LED显示 
//************************************************** 

//************************************************** 
//硬件设置: 
//1、SW4开关全部闭合 
//2、SW2开关1闭合,其它断开 
//3、SW3开关7和8闭合,其它断开 
//************************************************** 

//************************************************** 
//*****************定义头文件********************** 
//************************************************** 
#include 

//************************************************** 
//******************定义配置位********************* 
//************************************************** 
__CONFIG(0x3545);        
//FLASH代码不保护,RB6和RB7为调试模式,FLASH不写保护,数据代码不保护 
//RB3为数字IO口,低电压复位使能,上电延时开,看门狗开,4M晶体XT振荡器 

//************************************************** 
//******************定义常量*********************** 
//************************************************** 
#define uchar unsigned char 
#define uint  unsigned int  
#define SCL  TRISC3  
#define SDA  TRISC4  

//************************************************** 
//****************定义写入EEPROM数据**************** 
//************************************************** 
uchar code[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};  

//************************************************** 
//**************定义读取EEPROM数据变量************* 
//************************************************** 
uchar ack,data[8];  

//*********************************************** 
//函 数 名:delayus(uchar time); 
//入口参数:time 
//出口参数:无 
//函数作用:微妙延时 
//说    明: 
//*********************************************** 
void delayus(uchar time) 

  while(time--) 
  { 
    asm("nop"); 
  } 


//*********************************************** 
//函 数 名:delayms(uchar time); 
//入口参数:time 
//出口参数:无 
//函数作用:延时 
//说    明: 
//*********************************************** 
void delayms(uchar time) 

  uint i; 
  while(time--) 
  { 
    for(i=93;i>0;i--){;} 
  } 


//*********************************************** 
//函 数 名:i2c_start(void); 
//入口参数:无 
//出口参数:无 
//函数作用:产生启动信号 
//说    明: 
//*********************************************** 
void i2c_start(void)  
{  
  SDA=1;       //当SCL为高电平时使SDA产生一个负跳变  
  delayus(1);  
  SCL=1;  
  delayus(5); 
  SDA=0; 
  delayus(2);  
  SCL=0;       //钳住I2C总线,准备发送数据或接收数据  
  delayus(2);  
}  

//*********************************************** 
//函 数 名:i2c_stop(void); 
//入口参数:无 
//出口参数:无 
//函数作用:产生停止信号 
//说    明: 
//*********************************************** 
void i2c_stop(void)  
{  
  SDA=0;       //当SCL为高电平时使SDA产生一个正跳变  
  delayus(1);  
  SCL=1;  
  delayus(5);  
  SDA=1;  
  delayus(4); 
}  

//*********************************************** 
//函 数 名:i2c_writebyte(uchar data); 
//入口参数:data 
//出口参数:无 
//函数作用:写一个字节函数 
//说    明: 
//*********************************************** 
void i2c_writebyte(uchar data)  
{  
  uchar i;  
  for(i=0;i<8;i++)        //写8位数据 
  {  
    if(data&0x80){SDA=1;} //先写高位 
    else {SDA=0;}  
    delayus(1);  
    SCL=1;  
    delayus(5);  
    SCL=0;  
    data=data<<1;         //写下一位 
  }  
  delayus(2); 
  SDA=1;  
  delayus(2); 
  SCL=1;  
  delayus(3); 
  while(RC4){;}          //等待应答信号,RC4=0则有应答 
  SCL=0;  
  delayus(2);  
}  

//*********************************************** 
//函 数 名:i2c_writedata(uchar addr,uchar *ptt); 
//入口参数:addr,*ptt 
//出口参数:无 
//函数作用:按地址向EEPROM写数据块 
//说    明: 
//*********************************************** 
void i2c_writedata(uchar addr,uchar *ptt)  
{  
  uchar i;  
  i2c_start();            //产生启动信号 
  i2c_writebyte(0XA0);    //I2C写指令和IC地址 
  i2c_writebyte(addr);    //写EEPROM地址 
  for(i=0;i<8;i++,ptt++)  //写8个数据 
  {  
    i2c_writebyte(*ptt);    
  }  
  i2c_stop();             //产生停止信号 


//*********************************************** 
//函 数 名:i2c_readbyte(void); 
//入口参数:无 
//出口参数:SSPBUF 
//函数作用:从EEPROM读取一个字节数据 
//说    明: 
//*********************************************** 
unsigned char i2c_readbyte(void)  
{  
  uchar data,i;  
  data=0;  
  SDA=1;  
  for(i=0;i<8;i++)     //读8位数据 
  {  
    delayus(1);  
    SCL=0;  
    delayus(5); 
    SCL=1;  
    delayus(2); 
    data=data<<1;  
    if(RC4)           //判断读取数据是否为1 
    { 
      data=data|0x01; 
    }  
    delayus(2);  
  }  
  SCL=0;  
  delayus(2);  
  return (data);      //返回读取的数据 
}  

//*********************************************** 
//函 数 名:i2c_readdata(uchar addr); 
//入口参数:addr 
//出口参数:data[8] 
//函数作用:按地址从EEPROM读取数据块 
//说    明: 
//*********************************************** 
void i2c_readdata(uchar addr) 

  uchar i; 
  for(i=0;i<8;i++,addr++) 
  { 
    i2c_start();            //产生启动信号 
    i2c_writebyte(0xA0);    //I2C写指令和IC地址  
    i2c_writebyte(addr);    //读EEPROM数据的地址  
    i2c_start();            //重新产生启动信号  
    i2c_writebyte(0xA1);    //I2C读指令和IC地址  
    data[i]=i2c_readbyte(); //读取数据 
    i2c_stop();             //产生停止信号 
  } 


//*********************************************** 
//函 数 名:main(void); 
//入口参数:无 
//出口参数:无 
//函数作用:MAIN函数 
//说    明: 
//*********************************************** 
void main(void)  
{  
  uchar i;  
  TRISA=0X00;               //设置RA口为输出口 
  PORTA=0X00;               //RA口输出低电平 
  ADCON1=0X07;              //设置RA口和RE口为普通IO口 
  TRISC=0Xff;               //RC3和RC4为输入,RC3为SCL线,RC4为SDA线。  
  TRISD=0X00;               //RD口为输出 
  OPTION=0X8F;              //分频给WDT,分频比为128 
  PORTC=0X00;        
  PORTD=0X00;      
  i2c_writedata(0x00,code); //调用写数据函数,写EEPROM地址,要写的数据  
  delayms(250); 
  CLRWDT();                 //清看门狗 
  i2c_readdata(0x00);       //调用读数据函数,读EEPROM数据地址 
  while(1)  
  {  
    for(i=0;i<8;i++)  
    {   
      CLRWDT();             //清看门狗 
      PORTD=data[i];        //输出指示 
      delayms(250); 
    }  
  }  
}

关键字:PIC单片机  模拟读写  24C01  EEPROM 引用地址:PIC单片机模拟读写24C01 EEPROM

上一篇:DS18B20温度传感器PIC测温并用1602显示屏显示温度
下一篇:PIC单片机的中断过程

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

ATtiny13 EEPROM数据存储器
ATtiny13包含64字节的EEPROM数据存储器。它是作为一个独立的数据 可以按字节读写。EEPROM的寿命至少为 100,000 次擦除周期。EEPROM 的访问由地 址寄存器、数据寄存器和控制寄存器决定。详见 P100 中 EEPROM的串行数据下载。 EEPROM 读/ 写访问 EEPROM 读/ 写访问EEPROM 的访问寄存器位于I/O 空间。 EEPROM的写访问时间由Table 1给出。自定时功能可以让用户软件监测何时可以开始写 下一字节。用户操作 EEPROM 需要注意如下问题:在电源滤波时间常数比较大的电路 中,上电 下电时 VCC 上升 下降速度会比较慢。此时 CPU 可能工作于低于晶振所要求 的电源电压。
[单片机]
ATtiny13 <font color='red'>EEPROM</font>数据存储器
实例讲解PIC单片机之中断程序
什么是中断程序呢? 形象的生活比喻就比如你现在这在看我的文章,突然你的朋友喊你一起去烤地瓜,这时候你就中断了看文章和朋友烤地瓜去了,烤完地瓜之后你又回来看文章。烤地瓜这件事就好比中断程序,他中断了你看文章这件事。在程序方面来说 当CPU在执行一个程序的时候,突然产生了中断事件CPU就去执行中断程序了,当执行完成后CPU又回来执行原先的程序。 中断事件 什么是中断事件,就是引起中断的事件。对于单片机来说这些事件是多种多样的。比如 说一个按键按下,一定的时间到了,一串数据发送完毕,或接收完一个数据。 讲到中断不得不讲讲和中断相对的 查询。其实不管是按键按下 还是 时间到,还是数据发送完毕,这些事实上都可以用查询的方式办
[单片机]
PIC单片机的SPWM控制技术介绍
在UPS等电力电子设备中,控制方法是核心技术。早期的控制方法使得输出为矩形波,谐波含量较高,滤波困难。SPWM技术较好地克服了这些缺点。目前SPWM的产生方法很多,汇总如下。 1)利用分立元件,采用模拟、数字混和电路生成SPWM波。此方法电路复杂,实现困难且不易改进; 2)由SPWM专用芯片SA828系列与微处理器直接连接生成SPWM波,SA828是由规则采样法产生SPWM波的,相对谐波较大且无法实现闭环控制; 3)利用CPLD(复杂可编程逻辑器件)设计,实现数字式SPWM发生器; 4)基于单片机实现SPWM,此方法控制电路简单可靠,利用软件产生SPWM波,减轻了对硬件的要求,且成本低,受外界干扰小。 而当今单片机的应用已经从
[单片机]
<font color='red'>PIC单片机</font>的SPWM控制技术介绍
I2C之知(六)--s3c2440用I2C接口访问EEPROM
在前面阅读理解了I2C的官方协议文档后,就拿s3c2440和EEPROM来验证一下. 本来是想用s3c2440的SDA和SCL管脚复用为GPIO来模拟的,但在没有示波器的情况下搞了一周,怎么都出不来,最后还是放弃了.甚至参考了linux下i2c-algo-bit.c和i2c-gpio.c,依然没调出来.如果有示波器,可能很快就能找到原因,现在完全不知道问题出在哪里.其实想用GPIO模拟I2C的目的很简单,以一种简单而又深刻的方式来理解I2C. 既然这条路暂时没法走,退而求其次,用s3c2440的I2C接口来访问EEPROM,只要按照datasheet的来做,基本上不用考虑时序咯. 从s3c2440
[单片机]
I2C之知(六)--s3c2440用I2C接口访问<font color='red'>EEPROM</font>
关于PIC单片机的模块和功能总结
PIC 单片机的概述 PIC16F616 是一款 14 引脚、8 位的 CMOS 单片机。采用精简指令集,仅有 35 条指令,由于采用了数据总线和指令总线分离的哈佛总线结构,使得除少量指令不是单周期之外,大部分的指令都是单周期指令。这样有利于提高单片机的运行速度和执行效率。 PIC16F616 这款单片机供电电压可以在 2V 到 5。5V 之间,内部集成了一个 RC 振荡器,频率可以配置成 8MHZ 或者 4MHZ,也可以用外部晶振提供时钟。内部集成有 AD 转换、比较器等硬件模块,还具有上电复位、欠压复位、看门狗、代码保护等功能。三个定时器、PWM 发生器等可以由用户编程。下面我来一一介绍关于 PIC 单片机的这些模块和功能
[单片机]
PIC单片机系统开机的时候一直会复位可能的原因?
可能的原因:也许,您该检查一下您的电源走线是不是够粗,或者,程序是不是一开始运行就点亮LED或者叫BUZZER?因为,PICmicro开始任务的电压通常是蛮低的。如果因为上述原因而让电压骤降,可能会让Vcc电压瞬间掉至reset电压以下,而造成重置。如果您的示波器不够好,很有可能根本观察不到此电压变动之状况。 WDT TIMEOUT 的标准时间为18mSec, 但是非常重要的一点, WDT TIMEOUT 的最小值为7~9mSec, 而且会受温度的影响 并且这个值不是测试值,而是计算值,请不要太相信. 若你有使用WDT,建议在5mSec以内Clear WDT较好 注意芯片的LVP(低压编程使能)一定要禁止,如果你确实需要它开,你确
[单片机]
PIC单片机循环程序应用实例
在这里介绍一种定时程序,说明循环程序在PIC单片机上的应用。笔者仍以PIC16F84单片机为例建立其定时源程序清单。该定时器源程序只需改变一条指令的常数设置,即可使定时时间从分钟级到38小时的连续变化(4MHz晶振条件)。PIC16F84单片机的硬件电路,请见本报第32期实验编程器101实验板电路。在该实验板电路上,若读者改变晶振的频率(2MHz、1MHz、500kHz)等,很易直观看出定时时间成比例相应地增加,这对了解PIC单片机的性能十分直观有趣。若在该源程序上再多设置一次循环,可使定时时间长达1月以上。   该PIC16F84单片机定时源程序可直接在MPLAB集成开发环境软件下进行汇编,其汇编后生成的HEX文件可在实验编程
[单片机]
基于PIC单片机的便携式磁记忆检测仪
引言   金属构件和零部件发生损坏的主要原因,是各种微观和宏观机械应力集中导致疲劳失效,其基本特征表现为材料在低于静强度极限的交变应力持续作用下,生成多种类型的微观内部缺陷,并逐渐演化为宏观裂纹,裂纹扩展最终导致结构破坏。因此,进行疲劳分析,有效评价应力变形状况,测定未来裂缝发展的位置、大小和方向,成为评价金属零部件与构件结构强度和可靠性的一个重要依据。为了及时准确的找出最大机械应力变形区域,20世纪90年代后期,以杜波夫为代表的俄罗斯学者率先提出一种崭新的诊断技术—金属磁记忆检测。本文采用PIC单片机,设计了高性价比的便携式磁记忆检测仪,具有低成本、低功耗和快速检测等特点,可以满足各种场合,特别是难以到达部位的应力集中区检测。
[单片机]
基于<font color='red'>PIC单片机</font>的便携式磁记忆检测仪
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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