?? 單相復費率.c
字號:
//特別聲明:本代碼為單相復費率電能表源代碼 cpu為LPC932單片機
// 利用中斷0模擬的485通訊簡稱串口通訊
// 利用MCU自帶的串口進行的紅外通訊
// 簡稱紅外通訊
#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鍵盤產生中斷,禁止P0.0鍵盤中斷
break;
case 0x02 :
PulseParseFg=1;
KBMASK=KBMASK&0xdf; //允許P0.0鍵盤產生中斷,禁止P0.1鍵盤中斷
break;
case 0x03 :
PulseParseFg=1;
KBMASK=KBMASK&0xcf; //禁止鍵盤中斷
break;
}
}
}
void CMP_ISR() interrupt 8
{
unsigned char data temp,RING,LED;
EA=0; //關中斷
temp=CMP2&0x02; //判斷CMP1.1
if(temp==0x02) //如果CMP1.1為1(正向輸入端大于反向輸入端)
{
RING=~RING;
}
else if(temp==0x00) //如果CMP1.1為0
{
LED=~LED;
}
CMP2&=0xFE; //清0比較器中斷標志位
EA=1; //開中斷
}
使用LPC932制作的一款電表---InitCmd
#include <REG932.H>
#include <define.h>
#include <Stdio.h>
#include <Intrins.h>
void InitCmd(void)
{
unsigned char data ii;
if((PowerStA==0x55)|(PowerStB==0xAA))
{
PowerStA=0x55;
PowerStB=0xaa;
}
else
{
DIR=1;
ClerBuf();
DataPickup();
SeriesBufDptr=0;
SendOverFg=1;
LcdDelay=1; //由5改為1
InfraredBufDptr=0;
TimeSendFg=0;
DataProtectFg=0;
InfraredBufDptr=0;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -