📄 leak.txt
字号:
sbit secClock = P1^6;
//extern uint data delayTime;
//extern uchar data recPresetData[4];
//extern void ReadEEPROMByte(uchar orgAddr, uchar dataSize, uchar *bufPtr);
//extern void EEPROMWriteByte(uchar orgAddr, uchar dataSize, uchar *bufPtr);
void TimeGenerator(void);
void RTC_ISR(void) interrupt 10
{
static uint secCount = 0;
EA=0;
secCount++;
RTCCON &= 0x63; //清除RTC中断标志位
TimeGenerator(); //时间产生
if(secCount==WRITE_EEPROM_INTERVAL) //到写EEPROM 时间
{
ReadEEPROMByte(EEPROM_TIME_ADDR, 7, recCurrentTimeBuf);
secCount = 0;
}
EA=1;
}
//---------------------------------------------------------------------------
//函数名称:void TimeGenerator(void)
//功能描述:产生时钟
//输入:无
//输出:无
//---------------------------------------------------------------------------
void TimeGenerator(void)
{
secClock = ~secClock;
recCurrentTimeBuf[SEC]++;
if(recCurrentTimeBuf[SEC]>59)
{
recCurrentTimeBuf[SEC] = 0;
recCurrentTimeBuf[MIN]++;
delayCount++;
if(recCurrentTimeBuf[MIN]>59)
{
recCurrentTimeBuf[MIN] = 0;
recCurrentTimeBuf[HOUR]++;
if(recCurrentTimeBuf[HOUR]>23)
{
recCurrentTimeBuf[HOUR] = 0;
recCurrentTimeBuf[DATE]++;
switch(recCurrentTimeBuf[MON]) //查询当前月份
{
case 2: //是2 月份
if(((recCurrentTimeBuf[YEAR]!=0)&&(recCurrentTimeBuf[YEAR]%4==0))||((recCurrentTimeBuf[YEAR]==0)&&(recCurrentTimeBuf[CENT]%4==0)))
{
//是闰年2 月29 天
if(recCurrentTimeBuf[DATE]>29)
recCurrentTimeBuf[DATE] = 1;
}
else
{
//是平年2 月28 天
if(recCurrentTimeBuf[DATE]>28)
recCurrentTimeBuf[DATE] = 1;
}
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(recCurrentTimeBuf[DATE]>31)
recCurrentTimeBuf[DATE] = 1;
break;
default:
if(recCurrentTimeBuf[DATE]>30)
recCurrentTimeBuf[DATE] = 1;
break;
}
recCurrentTimeBuf[MON]++;
if(recCurrentTimeBuf[MON]>12)
{
recCurrentTimeBuf[MON] = 1;
recCurrentTimeBuf[YEAR]++;
if(recCurrentTimeBuf[YEAR]>99)
{
recCurrentTimeBuf[YEAR] = 0;
recCurrentTimeBuf[CENT]++;
}
}
}
}
}
}
/****************************LPC935AD.C*******************************
*程序功能:测试LPC935 AD转换功能
*转换模式:单次转换
*启动方式:定时器0触发
**************************************************************************/
/* 对于AD 转换程序的编写,主要需要注意的有5点:
1. 管脚的控制(选为AD 转换器输入的管脚,均应设置
为仅为输入状态,禁止数字功能)。
2. AD转换工作模式的设置,LPC935 具有6 种模式,
可通过设置ADMODA 获得相应的转换模式。
3. AD转换工作频率(500KHz—3.3MHz)
及附加功能(DAC 或边界检测)的选择。
4. AD转换触发、启动方式的选择
(通过设置ADCONx 获得相应的触发方式)。
5. 每一次AD 转换完成,注意将AD 转换完成标志位清0。
//***************************************************************************/
//uchar data lineVolt[3]; //[0] 保存A line volt,[1] 保存B line volt ,[3] 保存C line volt
//uchar data lineCurrent[3]; //[0] 保存A line current,[1] 保存B line current ,[3] 保存C line current
/*漏电信息
[0]--漏电情况,1 : 有漏电;0 : 无漏电
[1]--漏电电流值
[2]--漏电线路,1: 表示A相漏电;2: 表示B相漏电; 3:表示C相漏电
*/
//uchar data leakageCurrentMsg[3];
void ADConvert(void)
{
//AD0 转换器
ADINS = 0x01; //选择00 通道
ADCON0 = START_ADC;
while(!(ADCON0&0x08));
lineCurrent[0] = AD0DAT0;
ADCON0 &= 0xF7; //清除AD 转换完成标志
ADINS = 0x02; //选择02 通道
ADCON0 = START_ADC;
while(!(ADCON0&0x08));
lineCurrent[1] = AD0DAT1;
ADCON0 &= 0xF7; //清除AD 转换完成标志
ADINS = 0x03; //选择03 通道
ADCON0 = START_ADC;
while(!(ADCON0&0x08));
lineCurrent[2] = AD0DAT2;
ADCON0 &= 0xF7; //清除AD 转换完成标志
//AD1 转换器
ADINS = 0x10; //选择00 通道
ADCON1 = START_ADC;
while(!(ADCON1&0x08));
lineVolt[0] = AD1DAT0;
ADCON1 &= 0xF7; //清除AD 转换完成标志
ADINS = 0x20; //选择02 通道
ADCON1 = START_ADC;
while(!(ADCON1&0x08));
lineVolt[1] = AD1DAT1;
ADCON1 &= 0xF7; //清除AD 转换完成标志
ADINS = 0x40; //选择03 通道
ADCON1 = START_ADC;
while(!(ADCON1&0x08));
lineVolt[2] = AD1DAT2;
ADCON1 &= 0xF7; //清除AD 转换完成标志
ADINS = 0x80; //选择03 通道
ADCON1 = START_ADC;
while(!(ADCON1&0x08));
leakageCurrentMsg[1] = AD1DAT3; //漏电流数值
ADCON1 &= 0x00; //关闭AD 转换功能
}
//---------------------------------------------------------------------------
//函数名称:void ReadEEPROMByte(uchar orgAddr,uchar dataSize,uchar *bufPtr)
//功能描述:从EEPROM 中读取数据到缓冲区
//输入: orgAddr--EEPROM 中要读取数据的首地址
// dataSize--读取的数据数量
// bufPtr --存储从EEPROM 中读取数据的缓冲区指针
//输出:无
//---------------------------------------------------------------------------
void ReadEEPROMByte(uchar orgAddr, uchar dataSize, uchar *bufPtr)
{
uchar i;
for(i=0;i<dataSize;i++)
{
DEECON = 0x00; //字节读方式,不中断,第0 页
DEEADR = orgAddr;
while((DEECON&0x80)==0); //等待读操作完成否
DEECON = DEECON&0x7F; //清零读完成标识位
*bufPtr = DEEDAT;
orgAddr++;
bufPtr++;
}
}
//---------------------------------------------------------------------------
//函数名称:void EEPROMWriteByte(uchar orgAddr,uchar dataSize,uchar *bufPtr)
//功能描述:写数据到EEPROM
//输入: orgAddr--写EEPROM 首地址
// dataSize--写的数据数量
// bufPtr --数据缓冲区指针
//输出:无
//---------------------------------------------------------------------------
void EEPROMWriteByte(uchar orgAddr, uchar dataSize, uchar *bufPtr)
{
uchar i;
for(i=0;i<dataSize;i++)
{
DEECON = 0x00; //字节写方式,不中断,第0 页
DEEDAT = *bufPtr;
DEEADR = orgAddr;
while((DEECON&0x80)==0); //等待读操作完成否
DEECON = DEECON&0x7F; //清零写完成标识位
orgAddr++;
bufPtr++;
}
}
/*******************************************************************
* 申请总线
* 功能: 进行I2C总线的初始化----包括时钟选择,
I2C使能,发送起始信号等等。
* I2EN为1,设置为主机;
CRSEL位为0,使用内部SCL发生器
*******************************************************************/
void GetBus()
{
I2SCLH = 15; /* 设置SCL高电平的PCLK周期数*/
I2SCLL = 15; /* 设置SCL低电平的PCLK周期数,6MHz 时为100Kbit/S */
/* 申请成为主机,起动总线。使用内部SCL发生器,I2EN 和AA 置位*/
I2CON = RELEASE_BUS_STA;
while( SI==0 ); /* 等待起始位的发送*/
}
/*******************************************************************
* 发送数据函数
* 功能:用于向总线发送数据
* 入口参数:C 待发送的数据
*******************************************************************/
void SendByte(uchar c)
{
I2DAT = c;
I2CON = RELEASE_BUS_ACK; /* 清除SI位等等 */
while( SI==0 ); /* 等待数据的发送 */
}
/*******************************************************************
* 向有子地址器件发送多字节数据函数
* 功能:从启动总线到发送地址,子地址,数据,结束总线的全过程。
* 入口参数: sla -- 从器件地址
* subAddr-- 子地址
* s -- 发送内容的指针
* num-- 发送字节数
* 出口参数: 返回1 表示操作成功,否则操作有误。
********************************************************************/
bit ISendStr(uchar sla, uint subAddr, uchar *s, uchar num)
{
uchar i;
uchar subAddrH, subAddrL;
subAddrL = (subAddr&0x00FF);
subAddrH = (subAddr&0xFF00)>>4;
GetBus(); // 启动总线
SendByte(sla|WRITE_DATA_COM); // 发送器件地址
if( I2STAT!=0X18 ) //已发送器件地址和写信号,并已接收应答信号
{
I2CON = GENERATE_STOP;
return(0);
}
SendByte(subAddrH); //发送器件子地址高位
if( I2STAT!=0X28 ) //已发送数据,并已接收应答信号
{
I2CON = GENERATE_STOP;
return(0);
}
SendByte(subAddrL); //发送器件子地址低位
if( I2STAT!=0X28 ) //已发送数据,并已接收应答信号
{
I2CON = GENERATE_STOP;
return(0);
}
for(i=0; i<num; i++)
{
SendByte(*s); // 发送数据
if(I2STAT!=0X28) //已发送数据,并已接收应答信号
{
I2CON = GENERATE_STOP;
return(0);
}
s++;
}
I2CON = GENERATE_STOP; // 结束总线
return(1);
}
/*******************************************************************
* 向有子地址器件读取多字节数据函数
*功能:从启动总线到发送地址,子地址,读数据,结束总线的全过程。
*入口参数:sla -- 从器件地址
* subAddr-- 子地址
* s -- 读出的内容存储区的指针
* num-- 读num个字节。
*出口参数:函数返回1表示操作成功,否则操作有误。
********************************************************************/
bit IRcvStr(uchar sla, uint subAddr, uchar *s, uchar num)
{
uchar i;
uchar subAddrH, subAddrL;
subAddrL = (subAddr&0x00FF);
subAddrH = (subAddr&0xFF00)>>4;
GetBus(); // 启动总线
SendByte(sla|WRITE_DATA_COM); // 发送器件地址
if( I2STAT!=0X18) //已发送器件地址和写信号,并已接收应答信号
{
I2CON = GENERATE_STOP;
return(0);
}
SendByte(subAddrH); // 发送器件子地址高位
if( I2STAT!=0X28 ) //已发送数据,并已接收应答信号
{
I2CON = GENERATE_STOP;
return(0);
}
SendByte(subAddrL); // 发送器件子地址低位
if( I2STAT!=0X28 ) //已发送数据,并已接收应答信号
{
I2CON = GENERATE_STOP;
return(0);
}
I2CON = RELEASE_BUS_STA; // 重新启动总线
while( SI==0 );
SendByte(sla|READ_DATA_COM); //发送读数据信号
if( I2STAT!=0X40 ) //已发送器件地址和读信号,并已接收应答信号
{
I2CON = GENERATE_STOP;
return(0);
}
for(i=0; i<num-1; i++)
{
I2CON = RELEASE_BUS_ACK; // 接收一字节数据并发送应答位
while( SI==0 ); // 等待接收数据
if( I2STAT!=0X50 ) //已接收数据字节,已返回应答信号
{
I2CON = GENERATE_STOP;
return(0);
}
*s = I2DAT; // 读取数据
}
s++;
I2CON = RELEASE_BUS_NOACK; // 接收最后一字节数据并发送非应答位
while( SI==0 );
*s = I2DAT;
I2CON = GENERATE_STOP; //结束总线
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -