📄 e2promservice.c
字号:
/*
文件名: E2PROMService.c
功能: 存储器服务函数实现
单位: 浙江工商大学-信电学院
创建日期:2004-09-24
创建人: Houseivan
修改人: Houseivan
修改日期:2005-03-11
*/
#include"Includes.h"
#if _E2PROM_TASK>0
#if _SYS_INTERRUPT>0
extern uchar data MeasureTimer; //测量用定时器1s=50x20ms
extern uchar data SampleTimer; //系统数据刷新定时器1min=60x1s
extern uchar data StoreTimer; //存储采样定时器1Hour=60x1min
extern bit WorkMode; //根据登陆成功与否确定站点工作的模式
#endif
extern uchar data TempInteger; //温度值整数和符号字节
extern uchar data TempDecimal; //温度值小数位字节
extern uchar data HumiInteger; //湿度值整数和符号字节
extern uchar data HumiDecimal; //湿度值小数位字节
extern uchar data UartRecBuf[]; //串行通讯缓冲
extern uchar data ClkLcmBuf[]; //显示时钟存储器操作缓冲
extern uchar data CurRecNum; //记录计数器 循环队列形式
extern uchar data SlaveAddr; //本地主机地址
extern uchar data MasterAddr; //远程主机地址
/*------------------------------------------------*/
/*
名称: Write24C02
功能: 对24C02进行写操作
注意:
*/
void Write24C02(uchar param)
{
uchar len=0;
IIC_clk=0;
for(len=0;len<8;len++)
{ IIC_clk=0;
IIC_dat=((param & 0x80)==0x80);
param<<=1;
IIC_clk=1;
}
IIC_clk=0;
IIC_clk=1;
while(IIC_dat); //wait ACK
IIC_clk=0;
DelayTime(1,3); //_nop_;_nop_;
}
/*------------------------------------------------*/
/*
名称: Read24C02
功能: 对24C02进行读操作
注意:
*/
uchar Read24C02(void)
{
uchar param=0;
uchar len=0;
bit cbit=0;
IIC_clk=0;
for(len=0;len<8;len++)
{ IIC_clk=0;
DelayTime(1,3);
IIC_clk=1;
param<<=1;
cbit=IIC_dat;
if (cbit)
param+=1;
}
IIC_clk=0;
DelayTime(1,3);//_nop_;_nop_
IIC_dat=1; //释放总线
DelayTime(1,3);//_nop_;_nop_
IIC_clk=1;
DelayTime(1,3);//_nop_;_nop_;
return param;
}
/*------------------------------------------------*/
/*
名称: StartSign
功能: 操作开始标志
注意:
*/
void StartSign()
{
IIC_clk=0; //dat:1 1 0 1 1 0 ... 0 1 1
DelayTime(1,3);
IIC_dat=1; //clk:0 1 1 0 1 0 ... 0 1 0
DelayTime(1,3);
IIC_clk=1;
DelayTime(1,3);
IIC_dat=0;
DelayTime(1,3);
IIC_clk=0;
}
/*------------------------------------------------*/
/*
名称: StopSign
功能: 操作终止标志
注意:
*/
void StopSign()
{
IIC_clk=0;
DelayTime(1,3);//_nop_;_nop_;
IIC_dat=0;//generate a stop sign
DelayTime(1,3);//_nop_;_nop_;
IIC_clk=1;
DelayTime(1,3);//_nop_;_nop_;
IIC_dat=1;
DelayTime(1,3);//_nop_;_nop_;
IIC_clk=0;
}
/*------------------------------------------------*/
/*
名称: WriteOneChar
功能: 向存储器写入一个字节数据
注意:
*/
void WriteOneChar(uchar addr,uchar sdata)
{
StartSign();
Write24C02(_WR_CMD);
Write24C02(addr);
Write24C02(sdata);
StopSign();
DelayTime(1,50000);
}
/*------------------------------------------------*/
/*
名称: ReadOneChar
功能: 从24C02读出一个字节的数据
注意:
*/
uchar ReadOneChar(uchar addr)
{
uchar sdata=0;
StartSign();
Write24C02(_WR_CMD); //模拟写操作 制造假象
Write24C02(addr);
StartSign();
Write24C02(_RD_CMD);
sdata=Read24C02();
StopSign();
DelayTime(1,50000);
return sdata;
}
/*------------------------------------------------*/
/*
名称: ReadOneRecord
功能: 从存储器中取出一条记录
注意:
*/
void ReadOneRecord(uchar *Buf,uchar nNum)
{
uchar nCount,nTemp;
nTemp= (nNum-1)*_REC_SIZE+16;
for(nCount=0;nCount<_REC_SIZE;nCount++)
Buf[nCount]= ReadOneChar(nTemp+nCount);
}
/*------------------------------------------------*/
/*
名称: WriteOneRecord
功能: 从存储器中取出一条记录
注意:
*/
void WriteOneRecord(uchar *Buf,uchar nNum)
{
uchar nCount,nTemp;
nTemp= (nNum-1)*_REC_SIZE+16;
for(nCount=0;nCount<_REC_SIZE;nCount++)
WriteOneChar(nTemp+nCount,Buf[nCount]);
}
/*------------------------------------------------*/
/*
名称: StoreTaskRun
功能: 执行数据存储任务
注意:
*/
/*
注意: 秒 分 时 周 日 月 年
0 2 4 6 7 8 9
*/
void StoreTaskRun(void)
{
if(StoreTimer>=_STORE_ALARM)
{
#if _DETECT_TASK>0
SensorTaskRun();
#endif
#if _CLOCK_TASK >0
ReadClock(ClkLcmBuf); //获取当前时钟
#endif
CloseScom();
UartRecBuf[0]=TempInteger;
UartRecBuf[1]=TempDecimal;
UartRecBuf[2]=HumiInteger;
UartRecBuf[3]=HumiDecimal;
UartRecBuf[4]=ClkLcmBuf[_ID_YEAR];
UartRecBuf[5]=ClkLcmBuf[_ID_MONTH];
UartRecBuf[6]=ClkLcmBuf[_ID_DAY];
UartRecBuf[7]=ClkLcmBuf[_ID_HOUR];
UartRecBuf[8]=ClkLcmBuf[_ID_MINUTE];
UartRecBuf[9]=ClkLcmBuf[_ID_SECOND];
if(WorkMode==_SITE_MODE) //存储到24C02
{
WriteOneRecord(UartRecBuf,++CurRecNum);
CurRecNum=CurRecNum%(_MAX_REC_NUM+1);
WriteOneChar(_CUR_REC_ADDR,CurRecNum); //同步更新计数器单元
}
OpenScom();
}
}
/*------------------------------------------------*/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -