eeprom与pcf859
eeprom与DS18B20一样,在用到的时候也需要注意时间精度。
改时序
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); //通道3
IIC_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 int
uchar 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,并加1
while(1)
{
adc_value = read_pcf859();
adc_value = adc_value*99/255.0f; //将AD范围转化成0-99
ShowNumber();
}
}
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 0xA1
sbit 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;
}