?? main.txt
字號(hào):
使用LPC932制作的一款電表---MAIN
redbug 發(fā)表于 2005-10-14 16:39:00
參考學(xué)習(xí)使用!請(qǐng)勿應(yīng)用到實(shí)際產(chǎn)品中!
//特別聲明:利用中斷0模擬的485通訊簡(jiǎn)稱串口通訊
// 利用MCU自帶的串口進(jìn)行的紅外通訊
// 簡(jiǎn)稱紅外通訊
#i nclude <REG932.H>
#i nclude <define.h>
#i nclude <Stdio.h>
#i nclude <Intrins.h>
void main(void)
{
EA=0;
EA=0;
InitCpu(); //初始化CPU
InitCmd(); //命令初始化---判斷硬復(fù)位還是軟復(fù)位
InitLcd(); //初始化液晶顯示驅(qū)動(dòng)器
InitRTC(); //初始化時(shí)鐘
WDT();
EA=1;
EA=1;
while(1)
{
LcdParse(); //顯示方式處理
Temperature(); //溫度采集處理
TimeSpend(); //費(fèi)率時(shí)刻判斷
CmdParse(); //外部通訊處理
PulseParse(); //脈沖采集處理
DataProtect(); //數(shù)據(jù)定時(shí)存儲(chǔ)(15分鐘存儲(chǔ)一次數(shù)據(jù))
LowPower(); //掉電檢測(cè)
KeyParse(); //鍵盤(pán)采集處理
DataCom(); //通訊數(shù)據(jù)幀處理
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); //等過(guò)起始位
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) //數(shù)據(jù)緩沖區(qū)地址指針是否為零
{
if(SeriesInData==0x68) //緩沖區(qū)的第一個(gè)數(shù)據(jù)是否等于0x68*/
{
ComDataBuf[0]=SeriesInData; //數(shù)據(jù)保存到緩沖區(qū)*/
SeriesBufDptr++; //緩沖區(qū)地址累加*/
}
else
{
SeriesBufDptr=0;
}
}
else
{
ComDataBuf[SeriesBufDptr]=SeriesInData; //數(shù)據(jù)保存到緩沖區(qū)*/
SeriesBufDptr++; //緩沖區(qū)地址累加*/
}
}
else
{
SeriesBufDptr=0;
}
if(ComDataBuf[ComDataBuf][9]+11]==0x16)
{
SeriesBufDptr=0;
SeriesFg=1;//串口占用數(shù)據(jù)通道有標(biāo)志效
ComBit=1;
}
else//命令錯(cuò)誤釋放串口占用數(shù)據(jù)通道標(biāo)志
{
SeriesFg=0;//串口占用數(shù)據(jù)通道標(biāo)志失效
}
}
}
else
{
ComEn=1;
SeriesSt=1;
}
}
EX0=1;
}
void INT_T0(void) interrupt 1 //定時(shí)器---產(chǎn)生模擬接受時(shí)序間隔信號(hào)
{
ET0=0; //定時(shí)器0中斷使能禁止
TR0=0; //定時(shí)器0中斷使能禁止
TR0=0;
ET0=0;
}
void INT_INT1(void) interrupt 2 //外部中斷1---紅外接收中斷
{
EX1=0;
}
//定時(shí)器---產(chǎn)生0.25秒信號(hào)
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; //峰指示燈點(diǎn)亮
if(LcdTime>=4)
{
LcdRunData++; //狀態(tài)顯示時(shí)間間隔--呂順
LcdTime=0;
}
ComTimeB++;
if(ComTimeB>=5) //通訊指示點(diǎn)亮?xí)r間---5秒
{
ComFg=0;
}
TemperatureTime++;
if(TemperatureTime>=100) //溫度補(bǔ)償程序定時(shí)時(shí)間---10分鐘
{
TemperatureTime=0;
TemperatureTimeFg=1;
}
DataProtectTime++;
if(DataProtectTime>=60) //數(shù)據(jù)保護(hù)程序每一個(gè)小時(shí)運(yùn)行一次
{
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;
//數(shù)據(jù)做偶校驗(yàn)
for(i=0;i<8;i++)
{
if(l & 0x80)
{ //bytedata和0x80作AND邏輯運(yùn)算等于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) //數(shù)據(jù)緩沖區(qū)地址指針是否為零
{
if(SBUF==0x68) //緩沖區(qū)的第一個(gè)數(shù)據(jù)是否等于0x68*/
{
ComDataBuf[0]=SBUF; //數(shù)據(jù)保存到緩沖區(qū)*/
InfraredBufDptr++; //緩沖區(qū)地址累加*/
}
else
{
InfraredBufDptr=0;
}
}
else
{
ComDataBuf[InfraredBufDptr]=SBUF; //數(shù)據(jù)保存到緩沖區(qū)*/
InfraredBufDptr++; //緩沖區(qū)地址累加*/
}
}
else
{
InfraredBufDptr=0;
}
if(ComDataBuf[ComDataBuf][9]+11]==0x16)
{
InfraredBufDptr=0;
InfraredFg=1;//紅外占用數(shù)據(jù)通道有效
ComBit=1;
}
else
{
InfraredFg=0;//紅外占用數(shù)據(jù)通道失效標(biāo)志
}
}
}
else
{
ComEn=1;
InfraredSt=1;
}
}
RI=0;
ES=1; //接收標(biāo)志位清零*
}
void INT_KBI(void) interrupt 7 //鍵盤(pán)中斷處理程序*/
{
EKBI=0;
KBCON=0;
KeyTemp=~P0&0x08;
if(~P0&0x08)
{
LowPowerFg=1;
}
else
{ //清楚鍵盤(pán)中斷標(biāo)志位
KeyTemp=~P0&0x30; //提取當(dāng)前中斷數(shù)值---對(duì)應(yīng)鍵盤(pán);
KeyTemp=KeyTemp>>4;
switch(KeyTemp) //判斷正向還是反向,以及脈沖是否到來(lái)/
{
case 0x01 :
PulseParseFg=1;
KBMASK=KBMASK&0xef; //允許P0.1鍵盤(pán)產(chǎn)生中斷,禁止P0.0鍵盤(pán)中斷
break;
case 0x02 :
PulseParseFg=1;
KBMASK=KBMASK&0xdf; //允許P0.0鍵盤(pán)產(chǎn)生中斷,禁止P0.1鍵盤(pán)中斷
break;
case 0x03 :
PulseParseFg=1;
KBMASK=KBMASK&0xcf; //禁止鍵盤(pán)中斷
break;
}
}
}
void CMP_ISR() interrupt 8
{
unsigned char data temp,RING,LED;
EA=0; //關(guān)中斷
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比較器中斷標(biāo)志位
EA=1; //開(kāi)中斷
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -