eeprom与DS18B20一样,在用到的时候也需要注意时间精度。

== 注意:在对时间精度要求高的场合,务必关闭中断读取值==
(例如在用100us的定时器中,最好关闭中断)

改时序

1. 延迟5us

#define somenop Delay5us()
void Delay5us()     //@12.000MHz
{unsigned char i;_nop_();_nop_();i = 12;while (--i);
}

2. 读取eeprom

unsigned char read_eeprom(unsigned char add)
{unsigned char dat;IIC_Start();IIC_SendByte(0xa0);     IIC_WaitAck();IIC_SendByte(add);     //发送地址IIC_WaitAck();IIC_Start();IIC_SendByte(0xa1);IIC_WaitAck();dat = IIC_RecByte();   //接收数据IIC_WaitAck();IIC_Stop();return dat;
}

3. 写入eeprom

void write_eeprom(unsigned char dat, unsigned char add)
{IIC_Start();IIC_SendByte(0xa0);         IIC_WaitAck();IIC_SendByte(add);        //发送地址IIC_WaitAck();IIC_SendByte(dat);        //传输数据IIC_WaitAck();IIC_Stop();
}

pcf859在使用之前要先进行初始化

4. 初始化pcf859

void pcf859_init()
{IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(0x03);     //通道3IIC_WaitAck();IIC_Stop();
}

板上有4个模拟输入口,分别为0,1,2,3
设置哪一个模拟输入口就是根据这句代码:IIC_SendByte(0x03);
0x03表示通道3,同理:
0x00 通道0
0x01 通道1
0x02 通道2
0x03 通道3

5. 读取ADC的值

unsigned char read_pcf859()
{unsigned char dat;//       IIC_Start();
//      IIC_SendByte(0x90);
//      IIC_WaitAck();
//      IIC_SendByte(0x03);        //可以直接读,舍去这几行代码
//      IIC_WaitAck();IIC_Start();IIC_SendByte(0x91);IIC_WaitAck();dat = IIC_RecByte();IIC_WaitAck();  IIC_Stop();return dat;
}

读取AD转换后的值,这个函数可以直接调用
注意:该函数扫描调用最好是100ms

代码

main.c

******************************************************************************
* 文件名:读取开机次数和AD转换
* 描  述:
* 作  者:思索与猫
* 日  期:  19/3/10
* 备  注:左边:开机次数      右边:AD转化为0-99内的值
*
******************************************************************************
#include<stc15f2k60s2.h>
#include<iic.h>
#define uchar unsigned char
#define uint unsigned intuchar code duan[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40}; //10black,11-
uchar dispbuff[8];
uchar opentime = 0, adc_value;   //开机次数,AD值void CloseFucker();
void Timer0Init();
void Display();
void ShowNumber();void main()
{CloseFucker();Timer0Init();pcf859_init();                      //pcf859要先初始化opentime = read_eeprom(0x44);       //将opentime存入0x44这个地址write_eeprom(++opentime, 0x44);     //读取opentime,并加1while(1){adc_value = read_pcf859();adc_value = adc_value*99/255.0f;   //将AD范围转化成0-99ShowNumber();}
}void T0_time() interrupt 1
{TL0 = 0x40;       TH0 = 0xA2;    Display();
}void ShowNumber()
{dispbuff[0] = opentime/10;dispbuff[1] = opentime%10;dispbuff[2] = 11;dispbuff[3] = 11;dispbuff[4] = 11;dispbuff[5] = adc_value/100;dispbuff[6] = adc_value/10%10;dispbuff[7] = adc_value%10;
}void Display()
{static uchar index = 0;P2 = (P2&0x1f)|0xe0;P0 = 0xff;P2 = P2&0x1f;P2 = (P2&0x1f)|0xc0;P0 = 1<<index;P2 = P2&0x1f;P2 = (P2&0x1f)|0xe0;P0 = ~duan[dispbuff[index]];P2 = P2&0x1f; index++;index &= 0x07;
}void Timer0Init()
{AUXR |= 0x80;     TMOD &= 0xF0;      TL0 = 0x40;        TH0 = 0xA2;        TF0 = 0;       TR0 = 1;   ET0 = 1;EA = 1;
}void CloseFucker()
{P2 = (P2&0x1f)|0xa0;P0 = 0xaf;P2 = P2&0x1f;
}

iic.h

#ifndef _IIC_H
#define _IIC_H#include "stc15f2k60s2.h"
#include "intrins.h"#define somenop Delay5us()
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1sbit SDA = P2^1;
sbit SCL = P2^0;  //function
void IIC_Start(void);
void IIC_Stop(void);
void IIC_Ack(unsigned char ackbit);
void IIC_SendByte(unsigned char byt);
bit IIC_WaitAck(void);
unsigned char IIC_RecByte(void);void Delay5us();
void write_eeprom(unsigned char dat, unsigned char add);
unsigned char read_eeprom(unsigned char add);
void pcf859_init();
unsigned char read_pcf859();#endif

iic.c

#include "iic.h"
void Delay5us()     //@12.000MHz
{unsigned char i;_nop_();_nop_();i = 12;while (--i);
}void IIC_Start(void)
{SDA = 1;SCL = 1;somenop;SDA = 0;somenop;SCL = 0;
}void IIC_Stop(void)
{SDA = 0;SCL = 1;somenop;SDA = 1;
}void IIC_Ack(unsigned char ackbit)
{if(ackbit) {   SDA = 0;}else {SDA = 1;}somenop;SCL = 1;somenop;SCL = 0;SDA = 1; somenop;
}bit IIC_WaitAck(void)
{SDA = 1;somenop;SCL = 1;somenop;if(SDA)    {   SCL = 0;IIC_Stop();return 0;}else  { SCL = 0;return 1;}
}void IIC_SendByte(unsigned char byt)
{unsigned char i;for(i=0;i<8;i++){   if(byt&0x80) {   SDA = 1;}else {SDA = 0;}somenop;SCL = 1;byt <<= 1;somenop;SCL = 0;}
}unsigned char IIC_RecByte(void)
{unsigned char da;unsigned char i;for(i=0;i<8;i++){   SCL = 1;somenop;da <<= 1;if(SDA) da |= 0x01;SCL = 0;somenop;}return da;
}void write_eeprom(unsigned char dat, unsigned char add)
{IIC_Start();IIC_SendByte(0xa0);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_SendByte(dat);IIC_WaitAck();IIC_Stop();
//      Delay5us();Delay5us();
}unsigned char read_eeprom(unsigned char add)
{unsigned char dat;IIC_Start();IIC_SendByte(0xa0);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_Start();IIC_SendByte(0xa1);IIC_WaitAck();dat = IIC_RecByte();IIC_WaitAck();IIC_Stop();return dat;
}void pcf859_init()
{IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(0x03);IIC_WaitAck();IIC_Stop();
}unsigned char read_pcf859()
{unsigned char dat;//       IIC_Start();
//      IIC_SendByte(0x90);
//      IIC_WaitAck();
//      IIC_SendByte(0x03);
//      IIC_WaitAck();IIC_Start();IIC_SendByte(0x91);IIC_WaitAck();dat = IIC_RecByte();IIC_WaitAck();  IIC_Stop();return dat;
}

eeprom与pcf859相关推荐

  1. ROM、PROM、EPROM、EEPROM、RAM、SRAM、DRAM的区别

    平时对于这些个相近的名词一看到就头疼,看了这篇文章后豁然开朗!!! 在微机的发展初期,BIOS都存放在ROM(Read Only Memory,只读存储器)中.ROM内部的资料是在ROM的制造工序中, ...

  2. 简介nandflash、norflash、ram、sram、dram、rom、eeprom、flash的区别

    1.nandflash     Nandflash是IO设备,数据.地址.控制线都是共用的,需要软件区控制读取时序, 所以不能像nor flash.内存一样随机访问,不能EIP(片上运行),因此不能直 ...

  3. linux除了eeprom其他的保存方法,linux的EEPROM的读写控制.doc

    毕业设计[论文]题目:基于linux的EEPROM的读写控制毕业论文(设计)原创性声明 本人所呈交的毕业论文(设计)是我在导师的指导下进行的研究工作及取得的研究成果.据我所知,除文中已经注明引用的内容 ...

  4. 10.STM32中用I2C接口发送数据到EEPROM寄存器在从此寄存器读数据

    10.STM32中用I2C接口发送数据到EEPROM寄存器在从此寄存器读数据.

  5. 读写EEPROM遇到的问题:16位地址的内容都是最后写入的数据。

    #define EE_TYPE AT24C64 如下图所示,往EEPROM的地址0x1000.0x1001.0x1002和0x1003分别写入0xAA.0xBB.0xCC和0xDD,读出来的数据都是最 ...

  6. EEPROM存储器--AT24CXX

    AT24CXX介绍: 目前,市场上I2C总线接口器件有多种,利于A/D转换器.D/A转换器.时钟芯片和存储器等.这里以典型的I2C总线接口为例进行介绍. I2C总线接口EEPROM存储器是一种采用I2 ...

  7. 延长EEPROM使用寿命的程序优化方法

    文章原始地址:http://feotech.com/?p=67 EEPROM(Electrically Erasable Programmable Read一Only Memory)即电子擦除式只读存 ...

  8. 单片机断电后不保存程序_为什么单片机语音芯片既有flash又有EEPROM

    为什么单片机语音芯片既有flash又有EEPROM 单片机语音芯片运行时的数据存在于RAM (随机存储器)中,停电后无法保留RAM的数据时,如何在停电后不丢失数据呢?这需要使用EEPROM和FLASH ...

  9. advanced installer更换程序id_浅谈更换调频发射机EEPROM的方法和步骤

    维修人员更换调频发射机主控器时,需要更换主控板上的EEPROM.一种情况是把旧板上的EEPROMU39更换过来,另一种情况是用新的EEPROMU39替换旧的U39.同时,固化程序的集成块U18和U28 ...

最新文章

  1. 杰奇数据库mysql_杰奇模板出现Unable to save result set in…可尝试修复数据库
  2. 【转载】redis开启远程访问
  3. DLedger —基于 raft 协议的 commitlog 存储库
  4. 看我打脸Message Pack
  5. 揭秘苹果“地下黑工厂”:临时工薪资无保障,男厕所门口排长龙
  6. 众信金融获“2015最佳绿色贡献奖”
  7. Java实现二维码生成及图片合成
  8. 来自CodeSmith的震撼
  9. STM32连接WIFI-ESP8266获取天气信息---STA模式运用
  10. 文件上传漏洞---Web渗透学习
  11. android 服务端技术,移动应用服务器端开发(基于JSP技术)-2017 Android系统构架 Android系统构架.docx...
  12. java ee 系统视频_更好的网站登录系统,EE协作登录系统
  13. 喜马拉雅-处世人生-老炮儿崔哥侃美国(完结)
  14. PHPnow--全自动部署php环境工具包
  15. 阿里服务器部署PPTP
  16. MATLAB绘制正弦函数与余弦函数的线性组合曲线
  17. surface pro linux服务器,在Surface Pro上安装Ubuntu
  18. 苹果cms图片外部储存使用教程
  19. 2021年美国风险投资暴增200%!
  20. 看完还不会解决滑动冲突?呵呵,我食屎!!

热门文章

  1. 华为交换机运行过多设备会导致内存不足解决方法
  2. python量化分析系列之---5行代码实现1秒内获取一次所有股票的实时分笔数据
  3. MIME类型(content-type)一览
  4. 百度网盘准备好,测绘相关资料
  5. 基于 TCP协议和sqlite3数据库的网络电子词典(个人项目)
  6. 自媒体平台营销变现,今日头条如何开通收益引流方法教程
  7. 学习编程语言最好的方法是什么
  8. grid布局浏览器兼容_CSS Grid 网格布局教程
  9. strcmp和strncmp函数
  10. 首汇农业北京油鸡专业养殖基地合作签约仪式在北京房山大石窝镇辛庄村顺利举行