📄 at24c64.h
字号:
#include "DS1302.H"
#include "math.h"
#define uchar unsigned char
#define uint unsigned int
sbit SDA = P1^3; /* iic数据传送位 */
sbit SCL = P1^2; /* iic时钟控制位 */
uint NUM;
uint HEAD=1;
uint HEAD_NUM=0;
uint dataflag=1;
uchar data_AT24C1[] = {"无数据"};
uchar data_AT24C2[] = {"删除此数据成功"};
uchar data_AT24C3[] = {"请稍候"};
uchar data_AT24C4[] = {"正在处理中"};
uchar data_AT24C5[] = {"删除所有数据成功"};
/*24C64子程序 */
void iic_start(void);
void iic_stop(void);
void iic_ack(void);
void iic_no_ack(void);
void iic_send_Byte( uchar);
uchar iic_receive_Byte(void);
void AT24C64_R(uchar read_data[], uchar address, uchar num);
void AT24C64_W(uchar write_data[], uchar address, uchar num);
/************************************************************************/
/* iic延时 */
void iic_wait(void)
{
_nop_();
_nop_();
}
/************************************************************************/
/* 开启iic总线 */
void iic_start(void)
{
SDA = 1;
SCL = 1;
iic_wait();
SDA = 0;
iic_wait();
SCL = 0;
}
/************************************************************************/
/* 关闭iic总线 */
void iic_stop(void)
{
SDA=0;
SCL=0;
iic_wait();
SCL=1;
iic_wait();
SDA=1;
}
/************************************************************************/
/* 发送ACK信号 */
void iic_ack(void)
{
SDA=0;
iic_wait();
SCL=1;
iic_wait();
SCL=0;
}
/************************************************************************/
/* 发送NOACK信号 */
void iic_no_ack(void)
{
SDA=1;
iic_wait();
SCL=1;
iic_wait();
SCL=0;
}
/********************************************************************
函 数 名:iic_wait_ack
功 能:等待ACK信号
说 明:
入口参数:
返 回 值:1-ACK 0-ERROR
设 计:蓝海微芯
***********************************************************************/
bit iic_wait_ack(void)
{
uchar errtime=255;
//uint errtime = 1000;
SDA=1;
iic_wait();
SCL=1;
iic_wait();
while(SDA)
{
errtime--;
if(!errtime)
return 0;
}
SCL=0;
return 1;
}
/********************************************************************
函 数 名:iic_send_byte
功 能:MCU向iic设备发送一个字节
说 明:
入口参数:sbyte 待发送的字节数据
返 回 值:
设 计:蓝海微芯
***********************************************************************/
void iic_send_byte(uchar sbyte)
{
uchar i = 8;
while(i--)
{
SCL = 0;
_nop_();
SDA = (bit)(sbyte&0x80);
sbyte <<= 1;
iic_wait();
SCL = 1;
iic_wait();
}
SCL=0;
}
/********************************************************************
函 数 名:iic_receive_byte
功 能:MCU从iic设备接收一个字节
说 明:
入口参数:
返 回 值:ddata 接收数据
设 计:蓝海微芯
***********************************************************************/
uchar iic_receive_byte(void)
{
uchar i=8;
uchar ddata=0;
SDA=1;
while(i--)
{
ddata <<= 1;
SCL=0;
iic_wait();
SCL=1;
iic_wait();
ddata |= SDA;
}
SCL=0;
return ddata;
}
/********************************************************************
函 数 名:write_iic_data
功 能:向iic设备写入N个字节
说 明:
入口参数:write_data 存放写入字节的数组
address 指定从address处开始写入
num 写入的字节数
返 回 值:无
设 计:蓝海微芯
***********************************************************************/
void AT24C64_W(uchar write_data[], uchar address, uchar num)
{
uchar n;
iic_start();
iic_send_byte(0xa0);
iic_wait_ack();
iic_send_byte(address>>8);
iic_wait_ack();
iic_send_byte(address & 0xff);
iic_wait_ack();
for(n=0; n<num; n++)
{
iic_send_byte(write_data[n]);
iic_wait_ack();
}
iic_stop();
}
/********************************************************************
函 数 名:read_iic_data
功 能:从iic设备读取N个字节
说 明:
入口参数:read_data 存放读取字节的数组
address 指定从address处开始读取
num 读取的字节数
返 回 值:无
设 计:蓝海微芯
***********************************************************************/
void AT24C64_R(uchar read_data[], uchar address, uchar num)
{
uchar n;
uchar *pread_data;
pread_data = read_data;
iic_start();
iic_send_byte(0xa0);
iic_wait_ack();
iic_send_byte(address>>8);
iic_wait_ack();
iic_send_byte(address & 0xff);
iic_wait_ack();
iic_start();
iic_send_byte(0xa1);
iic_wait_ack();
for (n=0; n<num; n++)
{
*pread_data = iic_receive_byte();
pread_data++;
if (n != (num - 1)) //最后一个数据不应答
{
iic_ack();
}
}
iic_no_ack();
iic_stop();
}
/**********************************************************************************/
void testdata(uchar data1[],uchar data2[],uchar num,uint flag_num)
{
uint test=1;
uint i;
again:
while(test==1)
{
for(i=0;i<num;i++)
{
if(data1[i]!=data2[i])
{
AT24C64_R(&data1[0],flag_num,num);
AT24C64_R(&data2[0],flag_num,num);
test=1;
goto again;
}
else
test=0;
}
}
}
/**********************************************************************************/
void translate(uchar datas[])
{
uchar datas2[9];
datas2[0] = datas[0] + '0'; //Date值
datas2[1] = datas[1] + '0';
datas2[2] = '-';
datas2[3] = datas[2] + '0';
datas2[4] = datas[3] + '0';
datas2[5] = '-';
datas2[6] = datas[4] + '0';
datas2[7] = datas[5] + '0';
datas2[8] = '\0';
setPosition(0,3);
writeString(datas2);
datas2[0] = datas[6] + '0'; //Time值
datas2[1] = datas[7] + '0';
datas2[2] = ':';
datas2[3] = datas[8] + '0';
datas2[4] = datas[9] + '0';
datas2[5] = ':';
datas2[6] = datas[10] + '0';
datas2[7] = datas[11] + '0';
datas2[8] = '\0';
setPosition(1,3);
writeString(datas2);
datas2[0] = datas[12] + '0'; //温度
datas2[1] = datas[13] + '0';
datas2[2] = '\0';
setPosition(2,3);
writeString(datas2);
datas2[0] = datas[14] + '0'; //湿度
datas2[1] = datas[15] + '0';
datas2[2] = '\0';
setPosition(2,7);
writeString(datas2);
datas2[0] = datas[16] + '0'; //SPAD值
datas2[1] = datas[17] + '0';
datas2[2] = '\0';
setPosition(3,3);
writeString(datas2);
}
/**********************************************************************************/
void LCD_DISPLAY(void)
{
setPosition(0,0);
writeString("Date: ");
setPosition(1,0);
writeString("Time: ");
setPosition(2,0);
writeString("温度:");
setPosition(2,4);
writeString("湿度:");
setPosition(3,0);
writeString("SPAD:");
}
/**********************************************************************************/
void key_work(void)
{
uint s;
uchar read_data1[50],read_data2[50];
uint ad0=0,ad1=0;
float idata SPAD;
uint i;
uchar datas1[20];
uchar num[1];
if(P1_5==0) //工作模式
{
delayMs(5);
while(!P1_5);
setPosition(3,0);
writeString("仪器测量SPAD模式");
while(1)
{
if(P1_4==0) //呼出数据
{
delayMs(5);
while(!P1_4);
if(NUM!=0)
{
init();
if(HEAD_NUM==NUM)
HEAD_NUM = 0;
HEAD = 9*HEAD_NUM+1+(HEAD_NUM/3)*5;
HEAD_NUM = HEAD_NUM+1;
LCD_DISPLAY();
AT24C64_R(&read_data1[0],HEAD,9);
AT24C64_R(&read_data2[0],HEAD,9);
testdata(read_data1,read_data2,9,HEAD);
for(i=0;i<10;i++)
{
datas1[2*i] = read_data1[i]/10;
datas1[2*i+1] = read_data1[i]%10;
}
translate(datas1);
setPosition(3,5);
writeString("数据");
setPosition(3,7);
datas1[0] = HEAD_NUM/10 + '0';
datas1[1] = HEAD_NUM%10 + '0';
datas1[2] = '\0';
writeString(datas1);
}
else
{
init();
setPosition(1,2);
writeString(data_AT24C1);
}
}
/*if(P1_5==0)
{
init();
ad0 = ad1 = 0;
for(i=0;i<10;i++) //接收光光照强度
{
s=ADC_Convert(0);
if(s>ad0)
ad0 = s;
}
ad0 = ad0 - 22;
for(i=0;i<10;i++)
{
s=ADC_Convert(1);
if(s>ad1)
ad1 = s;
}
ad1 = ad1 - 30;
read_data1[0]=ad0/1000 + '0';
read_data1[1]=(ad0%1000)/100 + '0';
read_data1[2]=(ad0%100)/10 + '0';
read_data1[3]=ad0%10 + '0';
read_data1[4]='\0';
setPosition(0,0);
writeString(read_data1);
read_data1[0]=ad1/1000 + '0';
read_data1[1]=(ad1%1000)/100 + '0';
read_data1[2]=(ad1%100)/10 + '0';
read_data1[3]=ad1%10 + '0';
read_data1[4]='\0';
setPosition(1,0);
writeString(read_data1);
SPAD = fabs(1000*(log10((ad1*2182.00)/(ad0*3447.00))));//K值未确定,公式还得修改
read_data1[0]=(int)SPAD/10 + '0';
read_data1[1]=(int)SPAD%10 + '0';
read_data1[2]='\0';
setPosition(3,0);
writeString(read_data1);}*/
if(P1_5==0) //求SPAD
{
delayMs(5);
while(!P1_5);
init();
ad0 = ad1 = 0;
for(i=0;i<10;i++) //接收光光照强度
{
s=ADC_Convert(0);
if(s>ad0)
ad0 = s;
}
ad0 = ad0 - 22;
for(i=0;i<10;i++)
{
s=ADC_Convert(1);
if(s>ad1)
ad1 = s;
}
ad1 = ad1 - 30;
NUM = NUM+1;
num[0] = NUM;
AT24C64_W(&num[0],0,1); //储存数据组数
SPAD = fabs(500*(log10((ad1*2182.00)/(ad0*3447.00))));//K值未确定,公式还得修改
LCD_DISPLAY();
DS1302_GetTime(&CTE); //显示时间
DateToStr(&CTE);
TimeToStr(&CTE);
setPosition(0,3);
writeString(CTE.DateString);
setPosition(1,3);
writeString(CTE.TimeString);
setPosition(1,7);
writeString(" ");
TEM_HUM_DISP(); //显示温度 湿度
setPosition(3,0);
writeString("SPAD: ");
read_idata[6] = sht11[0]; //收集当前温度数据
read_idata[7] = sht11[1]; //收集当前湿度数据
read_idata[8] = (int)SPAD; //收集当前SPAD数据
AT24C64_W(&read_idata[0],9*(NUM-1)+1+((NUM-1)/3)*5,9);//存储当前数据
datas1[0] = (int)SPAD/10 + '0';
datas1[1] = (int)SPAD%10 + '0';
datas1[2] = '\0';
setPosition(3,3);
writeString(datas1);
if(NUM==1)
{
setPosition(3,5);
writeString("00");
}
else
{
dataflag = 9*(NUM-2)+1+((NUM-2)/3)*5;
AT24C64_R(&read_data1[0],dataflag,9);
AT24C64_R(&read_data2[0],dataflag,9);
testdata(read_data1,read_data2,9,dataflag);
datas1[0] = read_data1[8]/10 + '0';
datas1[1] = read_data1[8]%10 + '0';
datas1[2] = '\0';
setPosition(3,5);
writeString(datas1);
}
}
if(P1_6==0) //删除当前测量的一个数据
{
delayMs(5);
while(!P1_6);
if(NUM!=0)
{
NUM = NUM-1;
num[0] = NUM;
AT24C64_W(&num[0],0,1); //储存数据组数
init();
if(HEAD_NUM!=0)
HEAD_NUM = HEAD_NUM - 1;
setPosition(1,1);
writeString(data_AT24C3);
setPosition(2,1);
writeString(data_AT24C4);
delayMs(5000);
init();
setPosition(1,0);
writeString(data_AT24C2);
}
else
{
init();
setPosition(1,2);
writeString(data_AT24C1);
}
}
if(P1_7==0)//删除所有数据
{
delayMs(5);
while(!P1_7);
NUM=0;
HEAD_NUM=0;
num[0] = NUM;
AT24C64_W(&num[0],0,1); //储存数据组数
init();
setPosition(1,1);
writeString(data_AT24C3);
setPosition(2,1);
writeString(data_AT24C4);
delayMs(5000);
init();
setPosition(1,0);
writeString(data_AT24C5);
delayMs(10000);
init();
break;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -