📄 lpc932.txt
字号:
//特别声明:利用中断0模拟的485通讯简称串口通讯
// 利用MCU自带的串口进行的红外通讯
// 简称红外通讯
#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(); //命令初始化---判断硬复位还是软复位
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; //开中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -