//特别声明:本代码为单相复费率电能表源代码 cpu为LPC932单片机
#include <REG932.H>
#include <define.h>
#include <Stdio.h>
#include <Intrins.h>
void main(void)
{
EA=0;
EA=0;
InitCpu(); //初始化CPU
InitCmd(); //命令初始化---判断硬复位还是软复位
InitLcd(); //初始化液晶显示驱动器
InitRTC(); //初始化时钟
WDT();
EA=1;
EA=1;
while(1)
{
LcdParse(); //显示方式处理
Temperature(); //温度采集处理
TimeSpend(); //费率时刻判断
CmdParse(); //外部通讯处理
PulseParse(); //脉冲采集处理
DataProtect(); //数据定时存储(15分钟存储一次数据)
LowPower(); //掉电检测
KeyParse(); //键盘采集处理
DataCom(); //通讯数据帧处理
StakeOut(0x00,0x01);
}
}
//485接收
void INT_INT0(void) interrupt 0
{
unsigned char BitData;
bit BitChk;
EX0=0;
WDT();
EX0=0;
BitData=0;
BitChk=1;
SeriesInData=0;
Delay(130); //等过起始位
while(BitData<9)
{
if(BitData==8)
{
SeriesBitNine=RXD;
}
if(RXD==1)
{
SeriesInData|=0x0080;
BitChk=~BitChk;
}
BitData++;
if(BitData<8)
{
SeriesInData>>=1;
}
Delay(90);
}
if(BitChk)
{
if(ComEn)
{
InfraredSt=0;
if(SeriesSt)
{
if(SeriesBufDptr<60)
{
if(SeriesBufDptr==0) //数据缓冲区地址指针是否为零
{
if(SeriesInData==0x68) //缓冲区的第一个数据是否等于0x68*/
{
ComDataBuf[0]=SeriesInData; //数据保存到缓冲区*/
SeriesBufDptr++; //缓冲区地址累加*/
}
else
{
SeriesBufDptr=0;
}
}
else
{
ComDataBuf[SeriesBufDptr]=SeriesInData; //数据保存到缓冲区*/
SeriesBufDptr++; //缓冲区地址累加*/
}
}
else
{
SeriesBufDptr=0;
}
if(ComDataBuf[ComDataBuf][9]+11]==0x16)
{
SeriesBufDptr=0;
SeriesFg=1;//串口占用数据通道有标志效
ComBit=1;
}
else//命令错误释放串口占用数据通道标志
{
SeriesFg=0;//串口占用数据通道标志失效
}
}
}
else
{
ComEn=1;
SeriesSt=1;
}
}
EX0=1;
}
void INT_T0(void) interrupt 1 //定时器---产生模拟接受时序间隔信号
{
ET0=0; //定时器0中断使能禁止
TR0=0; //定时器0中断使能禁止
TR0=0;
ET0=0;
}
void INT_INT1(void) interrupt 2 //外部中断1---红外接收中断
{
EX1=0;
}
//定时器---产生0.25秒信号
void INT_T1(void) interrupt 3
{
ET1=0;
TR1=0;
CkData++;
ComTimeA++;
WDT();
//LCD显示间隔---秒单位
if(CkData>=90)
{
CkData=0;
LcdTime++;
LcdTimeFg=1;
TimeSpendFg=1;
PingLed=~PingLed; //峰指示灯点亮
if(LcdTime>=4)
{
LcdRunData++; //状态显示时间间隔--吕顺
LcdTime=0;
}
ComTimeB++;
if(ComTimeB>=5) //通讯指示点亮时间---5秒
{
ComFg=0;
}
TemperatureTime++;
if(TemperatureTime>=100) //温度补偿程序定时时间---10分钟
{
TemperatureTime=0;
TemperatureTimeFg=1;
}
DataProtectTime++;
if(DataProtectTime>=60) //数据保护程序每一个小时运行一次
{
DataProtectTime=0;
DataProtectFg=1;
}
}
TH1=0X00;
TL1=0X00;
TR1=1;
ET1=1;
}
//串口中断-红外接收--*/
void INT_SERIAL(void) interrupt 4
{
unsigned char i,j,k,l;
ES=0;
j=0;
k=0;
l=SBUF;
//数据做偶校验
for(i=0;i<8;i++)
{
if(l & 0x80)
{ //bytedata和0x80作AND逻辑运算等于0x80
j++;
if(j==2)
{
j=0;
} //即表示位7等于1则条件成立
}
l <<=1;
} //禁止串口中断
if(j==0)
{
if(RB8)
{
k=0;
}
else
{
k=1;
}
}
else
{
if(RB8)
{
k=1;
}
}
if(k)
{
if(ComEn)
{
SeriesSt=0;
if(InfraredSt)
{
if(InfraredBufDptr<60)
{
if(InfraredBufDptr==0) //数据缓冲区地址指针是否为零
{
if(SBUF==0x68) //缓冲区的第一个数据是否等于0x68*/
{
ComDataBuf[0]=SBUF; //数据保存到缓冲区*/
InfraredBufDptr++; //缓冲区地址累加*/
}
else
{
InfraredBufDptr=0;
}
}
else
{
ComDataBuf[InfraredBufDptr]=SBUF; //数据保存到缓冲区*/
InfraredBufDptr++; //缓冲区地址累加*/
}
}
else
{
InfraredBufDptr=0;
}
if(ComDataBuf[ComDataBuf][9]+11]==0x16)
{
InfraredBufDptr=0;
InfraredFg=1;//红外占用数据通道有效
ComBit=1;
}
else
{
InfraredFg=0;//红外占用数据通道失效标志
}
}
}
else
{
ComEn=1;
InfraredSt=1;
}
}
RI=0;
ES=1; //接收标志位清零*
}
void INT_KBI(void) interrupt 7 //键盘中断处理程序*/
{
EKBI=0;
KBCON=0;
KeyTemp=~P0&0x08;
if(~P0&0x08)
{
LowPowerFg=1;
}
else
{ //清楚键盘中断标志位
KeyTemp=~P0&0x30; //提取当前中断数值---对应键盘;
KeyTemp=KeyTemp>>4;
switch(KeyTemp) //判断正向还是反向,以及脉冲是否到来/
{
case 0x01 :
PulseParseFg=1;
KBMASK=KBMASK&0xef; //允许P0.1键盘产生中断,禁
jibendianbiao.rar_电能表
版权申诉
26 浏览量
2022-07-14
07:41:53
上传
评论
收藏 10KB RAR 举报
朱moyimi
- 粉丝: 65
- 资源: 1万+
最新资源
- python-leetcode面试题解之第274题H指数.zip
- python-leetcode面试题解之第270题最接近二叉搜索树值.zip
- python-leetcode面试题解之第267题回文排列II.zip
- python-leetcode面试题解之第264题丑数II.zip
- python-leetcode面试题解之第263题丑数.zip
- python-leetcode面试题解之第258题各位相加.zip
- python-leetcode面试题解之第257题二叉树的所有路径.zip
- python-leetcode面试题解之第253题会议室II.zip
- python-leetcode面试题解之第252题会议室.zip
- python-leetcode面试题解之第249题移位字符串分组.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈