⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 e2promservice.c

📁 带时钟功能温度和湿度测量的仪器
💻 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 + -