eeprom与pcf859

eeprom与pcf859eeprom与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;
}