📄 main.c
字号:
TL0 = 0x33;
ET0 = 1;
IP0H &=~0x04; //设置Timer0的中断优先级别为1级
IP0 |= 0x04;
TH1 = 0xD0; //Timer1设置自动重装值
TL1 = 0xD0;
AUXR1|= 0x20; //ENT1=1,Timer1溢出使P0.7发生翻转
//AUXR1 |= 0x80; //选择时钟电路低功耗模式
//======================================================
//1000mS定时器初始化
//======================================================
RTCH = 0xE1; //设置自动重装值
RTCL = 0x00;
RTCCON = 0x62; //选择RTC时钟源,RTC中断使能
IP0H &=~0x40; //中断优先级为1级
IP0 |=~0x40;
EWDRT = 1; //中断使能
RTCCON |= 0x01; //RTC运行使能
//======================================================
//UART_init
//使用UART的模式3,波特率为1200bps
//使用内部波特率发生器
//======================================================
//PCON = 0x80; //SMOD1=1,SMOD0=0 ???????
//PCON = 0x00; //SMOD1=0,SMOD0=0
SCON = 0xD0; //SM0=1,SM1=1,REN=1
SSTAT = 0x00;
BRGCON = 0x00; //配置内部波特率发生器
BRGR0 = 0xF0;
BRGR1 = 0x17;
BRGCON = 0x03;
IP0H &=~0x10; //设置中断服务优先级为0
IP0 &=~0x10;
ES = 1; //使能UART中断
//======================================================
//键盘中断初始化
//======================================================
KBPATN = 0xFF;
KBCON = 0x00; //PATN_SEL=0
KBMASK = 0x40; //P0.6:RS485通讯唤醒
IP1 &=~0x02; //中断优先级为0级(最低)
IP1H &=~0x02;
EKBI = 1; //键盘中断使能
}
//**********************************************************
//名称:MeterInit
//功能:
//说明:
//**********************************************************
void MeterInit(void)
{
uchar i;
//P0:
P0 |= 0xB5; //10110101
//HW38K = 1; //P0.7置高
//CTRL485 = 1; //RS485接收状态
//PDA = 1; //P0.4空->置高处理
//LED_COMM = 1; //通讯指示灯灭
//LED_G = 1; //谷时段指示灭
//P1:
LED_F = 1; //峰时段指示灭
COMMSEL = 0; //默认红外通讯方式
//P2:
P2 = 0xFF; //对于LPC931,P2口空->置高处理
MSSum = 0x0000; //时间补偿为零
//※※※※※※※※※※※※※※※※※※※※※※※※※※※
//显示设置
//※※※※※※※※※※※※※※※※※※※※※※※※※※※
if(RSTSRC&0x10) //上电满屏显示
{
RSTSRC &= ~0x10;
for(i=0;i<8;i++) RTC[i] = 0xFF;
Display(RTC);
}
//※※※※※※※※※※※※※※※※※※※※※※※※※※※
//※※※※※※※※※※※※※※※※※※※※※※※※※※※
RTC_Init(); //RTC初始化设置
//※※※※※※※※※※※※※※※※※※※※※※※※※※※
//※※※※※※※※※※※※※※※※※※※※※※※※※※※
Addr[0] = 0xA0;
Addr[1] = 0x00;
//Len[0] = 0x02;
Len[1] = 0x06;
ReadData(PulseTmp); //剩余脉冲数据恢复
if(PulseTmp[5]!=SumCHK(PulseTmp,5)) ArrayInit(PulseTmp,6);
Resume(); //电表电量数据恢复
RTC_Read(); //时钟读取
Fee_CHK(); //时段费率处理
//※※※※※※※※※※※※※※※※※※※※※※※※※※※
Watchdog_feed();
Ery_Balance(); //电量结算处理
DspPara_Read(); //显示控制参数检查
AdjDate=DateTerm(); //日期条件
}
//**********************************************************
// 名称:CMP_isr
// 功能:掉电数据保存
// 说明:
//**********************************************************
void CMP_isr(void) interrupt 8 using 1
{
uchar i;
uchar j;
i = 0xFF;
while(--i);
if(CMP1&0x01) //电源跃变中断(低->高,高->低)
{
CMP1 &= 0xFE; //清除比较器CMP2中断标志
if(TxdWork==0) //不在发送状态
{
if(CMP1&0x02) AUXR1 |= 0x08; //复位(用于电压低->高跃变过程)
else //掉电处理(用于电压高->低跃变过程)
{
//PulseTmp[5] = PulseTmp[0]+PulseTmp[1]+
// PulseTmp[2]+PulseTmp[3]+PulseTmp[4];
if( I2EN == 1 ) //I2C总线忙
{
I2CON = 0x54; //STO=1&AA=1 发送停止标志,结束其他I2C操作
while(STO == 1);
for(i=0;i<100;i++) //延时10mS
{
j = 184;
while(--j);
}
}
//※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
//屏蔽秒脉冲输出
/*
I2SCLH = 0x14; //设置SCL高电平的PCLK周期数
I2SCLL = 0x14; //设置SCL低电平的PCLK周期数
I2CON = 0x64; //申请成为主机,起动总线。使用内部SCL发生器,I2EN和AA置位
while( SI==0 ); //等待起始信号的发送,申请总线
I2DAT = RX_8025; //发送器件地址
I2CON = 0x44; //清除SI位等等
while( SI==0 ); //等待数据的发送
I2DAT = 0xE0; //发送从地址
I2CON = 0x44; //清除SI位等等
while( SI==0 ); //等待数据的发送
I2DAT = 0x20; //发送从地址
I2CON = 0x44; //清除SI位等等
while( SI==0 ); //等待数据的发送
I2CON = 0x54; //结束总线
while(STO == 1);
*/
//※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
//※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
I2SCLH = 0x14; //设置SCL高电平的PCLK周期数
I2SCLL = 0x14; //设置SCL低电平的PCLK周期数
I2CON = 0x64; //申请成为主机,起动总线。使用内部SCL发生器,I2EN和AA置位
while( SI==0 ); //等待起始信号的发送,申请总线
I2DAT = 0xA0; //发送器件地址
I2CON = 0x44; //清除SI位等等
while( SI==0 ); //等待数据的发送
I2DAT = 0x00; //发送从地址
I2CON = 0x44; //清除SI位等等
while( SI==0 ); //等待数据的发送
for(i=0;i<6;i++) //发送数据
{
I2DAT = PulseTmp[i];
I2CON = 0x44; //清除SI位等等
while( SI==0 );
}
I2CON = 0x54; //结束总线
while((CMP1&0x02)==0x00); //检测上电(低->高)情况;等待
AUXR1 |= 0x08; //复位
}
}
}
if(CMP2&0x01) CMP2 &= 0xFE; //清除CMP1中断标志
}
//**********************************************************
// 名称:int1_isr
// 功能:外部中断1中断处理程序
// 说明:电能脉冲处理方法
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -