eeprom与pcf859
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相关推荐
- ROM、PROM、EPROM、EEPROM、RAM、SRAM、DRAM的区别
平时对于这些个相近的名词一看到就头疼,看了这篇文章后豁然开朗!!! 在微机的发展初期,BIOS都存放在ROM(Read Only Memory,只读存储器)中.ROM内部的资料是在ROM的制造工序中, ...
- 简介nandflash、norflash、ram、sram、dram、rom、eeprom、flash的区别
1.nandflash Nandflash是IO设备,数据.地址.控制线都是共用的,需要软件区控制读取时序, 所以不能像nor flash.内存一样随机访问,不能EIP(片上运行),因此不能直 ...
- linux除了eeprom其他的保存方法,linux的EEPROM的读写控制.doc
毕业设计[论文]题目:基于linux的EEPROM的读写控制毕业论文(设计)原创性声明 本人所呈交的毕业论文(设计)是我在导师的指导下进行的研究工作及取得的研究成果.据我所知,除文中已经注明引用的内容 ...
- 10.STM32中用I2C接口发送数据到EEPROM寄存器在从此寄存器读数据
10.STM32中用I2C接口发送数据到EEPROM寄存器在从此寄存器读数据.
- 读写EEPROM遇到的问题:16位地址的内容都是最后写入的数据。
#define EE_TYPE AT24C64 如下图所示,往EEPROM的地址0x1000.0x1001.0x1002和0x1003分别写入0xAA.0xBB.0xCC和0xDD,读出来的数据都是最 ...
- EEPROM存储器--AT24CXX
AT24CXX介绍: 目前,市场上I2C总线接口器件有多种,利于A/D转换器.D/A转换器.时钟芯片和存储器等.这里以典型的I2C总线接口为例进行介绍. I2C总线接口EEPROM存储器是一种采用I2 ...
- 延长EEPROM使用寿命的程序优化方法
文章原始地址:http://feotech.com/?p=67 EEPROM(Electrically Erasable Programmable Read一Only Memory)即电子擦除式只读存 ...
- 单片机断电后不保存程序_为什么单片机语音芯片既有flash又有EEPROM
为什么单片机语音芯片既有flash又有EEPROM 单片机语音芯片运行时的数据存在于RAM (随机存储器)中,停电后无法保留RAM的数据时,如何在停电后不丢失数据呢?这需要使用EEPROM和FLASH ...
- advanced installer更换程序id_浅谈更换调频发射机EEPROM的方法和步骤
维修人员更换调频发射机主控器时,需要更换主控板上的EEPROM.一种情况是把旧板上的EEPROMU39更换过来,另一种情况是用新的EEPROMU39替换旧的U39.同时,固化程序的集成块U18和U28 ...
最新文章
- 杰奇数据库mysql_杰奇模板出现Unable to save result set in…可尝试修复数据库
- 【转载】redis开启远程访问
- DLedger —基于 raft 协议的 commitlog 存储库
- 看我打脸Message Pack
- 揭秘苹果“地下黑工厂”:临时工薪资无保障,男厕所门口排长龙
- 众信金融获“2015最佳绿色贡献奖”
- Java实现二维码生成及图片合成
- 来自CodeSmith的震撼
- STM32连接WIFI-ESP8266获取天气信息---STA模式运用
- 文件上传漏洞---Web渗透学习
- android 服务端技术,移动应用服务器端开发(基于JSP技术)-2017 Android系统构架 Android系统构架.docx...
- java ee 系统视频_更好的网站登录系统,EE协作登录系统
- 喜马拉雅-处世人生-老炮儿崔哥侃美国(完结)
- PHPnow--全自动部署php环境工具包
- 阿里服务器部署PPTP
- MATLAB绘制正弦函数与余弦函数的线性组合曲线
- surface pro linux服务器,在Surface Pro上安装Ubuntu
- 苹果cms图片外部储存使用教程
- 2021年美国风险投资暴增200%!
- 看完还不会解决滑动冲突?呵呵,我食屎!!