📄 main.c
字号:
#include <Reg936.h>
#include <Meter_def.h>
#include <Rscomm.h>
#include <General.h>
#define _VAR_DEFINE
#include <var.h>
//※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
//函数定义、引用
//※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
//Initial
void InitRAM(void); //RAM初始化
void McuInit(void); //MCU系统配置及初始化
void MeterInit(void); //电表系统初始化
//Interrupt
void Int1_isr(void); //外部中断1服务程序(电能脉冲输入处理)
void CMP_isr(void); //
void Timer0_isr(void); //Timer0服务程序(通讯超时监测)
void Timer1_isr(void); //
void Keyboard_isr(void); //键盘中断服务程序(RS485通讯触发)
void UART_isr(void); //串行中断通讯服务程序
void Watchdogrtc_isr(void); //RTC中断服务程序
//Measure.c
extern void Resume(void); //电表数据恢复
extern void Measure(void); //电能计量
//RTC_DSP.C
extern void DspPara_Read(void); //读显示控制参数
extern void RTC_Dsp_Proc(void); //时间、显示处理
extern void RTC_Init(void); //RTC初始化设置
extern void RTC_Read(void); //读时间
extern void Fee_CHK(void); //时段、费率检查
extern void Ery_Balance(void); //电量结算
extern void Display(uchar idata *ptr); //数据显示
//extern bit DateTerm(void); //日期条件判断
extern void BatWorkState_Proc(void); //电池工作状态处理
//RSCOMM.C
extern void Comm_Proc(void); //通讯处理
//**********************************************************
//名称:main()
//功能:
//说明:主函数
//**********************************************************
void main(void)
{
McuInit(); //MCU初始化
MeterInit(); //电表初始化
while(1)
{
Measure(); //计量处理
RTC_Dsp_Proc(); //时钟、显示处理
Comm_Proc(); //通讯处理
}
}
//**********************************************************
//名称:McuInit()
//功能:
//说明:MCU初始化
//**********************************************************
void McuInit(void)
{
uint i;
//看门狗初始化(2S)
EA = 0;
WDL = 0xC2;
WDCON = 0xE5; //WDT enable
WFEED1 = 0xA5; //Feed Watchdog
WFEED2 = 0x5A;
//======================================================
//配置I/O口工作模式
//======================================================
P0M1=0xCF; //11001111
P0M2=0xB0; //10110000
//P0.7开漏 :38K载波
//P0.6输入 :RS485通讯唤醒
//P0.5推挽输出 :RS485收发控制
//P0.4推挽输出 :PDA
//P0.3输入 :电源检测
//P0.2输入 :开端钮盒检测
//P0.1输入 :电池检测
//P0.0输入 :开表盖检测
P1M1=0x3F; //00111111
P1M2=0xCD; //11001101
//P1.7推挽输出 :LED_F
//P1.6推挽输出 :通讯信道选择
//P1.5输入 :RST(不可配置,仅为输入模式)
//P1.4输入 :PULSE(电能脉冲)
//P1.3开漏 :SDA
//P1.2开漏 :SCL
//P1.1输入 :RXD
//P1.0开漏 :TXD
P2M1=0xFC; //11111100
P2M2=0xFF; //11111111
//P2.7开漏
//P2.6开漏
//P2.5开漏
//P2.4开漏
//P2.3开漏
//P2.2开漏
//P2.1推挽输出 :平时段指示
//P2.0推挽输出 :谷时段指示
P3M1=0x03; //00000011
P3M2=0x00; //00000000
//P3.1输入 :PROG 编程开关
//P3.0输入 :REVP 电能方向
DIVM = 0x00; //振荡器初始化
TRIM &= ~0x40; //P3.0无时钟输出
PT0AD = 0x0A; //P0.1(CIN2B)、P0.3(CIN1B)模拟输入使能
DelayNms(150); //上电延时150mS
//P0:
P0 |= 0xB0; //10110000
//HW38K = 1; //P0.7置高
//RXD485 //RX485通讯唤醒
//CTRL485 = 1; //RS485接收状态
//PDA = 1; //P0.4空->置高处理
//PWRCHK //掉电检测
//KDNH //开端钮盒检测
//BATCHK //电池检测
//KBG //开表盖检测
//P1:
LED_F = 1; //峰时段指示灯灭
COMMSEL = 0; //默认红外通讯方式
//P2:
P2 = 0xFF; //对于LPC936,P2口置高处理
//LED_G //谷时段指示灯灭
//LED_P //平时段指示灯灭
//======================================================
//外部中断1初始化,电能脉冲输入
//======================================================
IT1 = 1; //外部中断1为下降沿触发
IP0H |= 0x04; //设置外部中断1的中断优先级 2级
IP0 &=~0x04;
EX1 = 1; //外部中断1使能
EX0 = 0; //外部中断0关闭
//======================================================
//电源检测、电池检测配置
//======================================================
CMP1 = 0x38; //CE1,CP1,CN1,OE1 = 1110
//正向输入为CIN1B(P0.3)
//选择内部参考电压
CMP2 = 0x38; //CE2,CP2,CN2,OE2 = 1110
//正向输入为CIN2B(P0.1)
//选择内部参考电压
//i = 0x18; //延时13uS
i = 0x50; //延时80uS
while(--i);
CMP1 &= 0xFE; //清楚比较器1的中断标志
CMP2 &= 0xFE; //清楚比较器2的中断标志
//IP1H &=~0x04; //设置中断优先级0级
//IP1 &=~0x04;
EC = 0; //关比较器中断
//////////////////////////////////////////////////////////////
//电源慢上问题
while((CMP1&0x02)==0x00); //检测上电
i = 600; //1200mS
while(i)
{
EA = 0;
WFEED1 = 0xA5;
WFEED2 = 0x5A;
DelayNms(2); //延时2mS
if((CMP1&0x02)==0x02) --i;
else AUXR1 |= 0x08; //软件复位
}
//////////////////////////////////////////////////////////////
//============================================================
//初始化Timer1定时器,使其P0.7发生翻转,输出38K的调制频率
//N=PCLK/(2*38KHz)=3.686400/76000=0x30,定时值=0x100-0x30=0xD0
//============================================================
//HW38K = 1; //P0.7置高
TMOD |= 0x21; //设置Timer0,选择定时器模式2--通讯超时检测
//设置Timer1,选择定时器模式3--红外载波
TAMOD = 0x00; //T0M2=0,T1M1=0,T1M0=1
//T1M2=0,T1M1=1,T1M0=0
TH0 = 0x70; //Timer0定时10mS初值
TL0 = 0x00;
IP0H &=~0x04; //设置Timer0的中断优先级别为1级
IP0 |= 0x04;
ET0 = 1; //使能Timer0定时溢出中断
TR0 = 1; //开启Timer0
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
//使用内部波特率发生器
//======================================================
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中断
EST = 0; //关闭TX发送中断
//======================================================
//键盘中断初始化
//======================================================
KBPATN = 0xFF;
KBCON = 0x00; //PATN_SEL=0
KBMASK = 0x40; //P0.6:RS485通讯唤醒
IP1 &=~0x02; //中断优先级为0级(最低)
IP1H &=~0x02;
EKBI = 1; //键盘中断使能
//======================================================
//SPI模块初始化,此功能在此不用
//======================================================
SPCTL = 0x84; //关闭SPI模块
ESPI = 0;
//======================================================
//关闭未用之中断
//======================================================
EBO = 0; //关闭掉电检测中断
EI2C = 0; //关闭I2C中断
//未用功能模块关闭
//======================================================
PCONA = 0x55; //0101 0101
//PCONA.7 RTCPD ;Real-time Clock
//PCONA.6 DEEPD ;eeprom
//PCONA.5 VCPD ;Analog Voltage Comparators
//PCONA.4 ADPD ;Analog Converter
//PCONA.3 I2PD ;I2C Bus
//PCONA.2 SPPD ;SPI Bus
//PCONA.1 SPD ;UART
//PCONA.0 CCUPD ;CCU
}
//**********************************************************
//名称:InitRAM()
//功能:
//说明:RAM初始化
//**********************************************************
void InitRAM(void)
{
MeterFlag = 0x00; //电表运行状态字
Flag = 0x00; //状态标志位1
SystemStates = 0x00; //状态标志位2
MSSum = 0x0000; //时间补偿为零
SystemCheckFlag =0x00; //系统自检
MeterRunFlag = 0x00; //电表运行状态字
KBG_Last_State = 1; //预置表盖状态(按下为高)
KDNH_Last_State = 0; //预置端钮盒状态(按下为低)
CommLCDSec = 0x00; //液晶通讯指示显示时间
LCDViewSec = 0x00; //液晶显示屏查看时间
ProgLEDShow = 0x00; //LED编程提示
DspSec = 0xEF; //轮显时间秒计数
DspPtr = 0xFF; //轮显指针
ComPtr = 0x00; //通信缓冲区指针
CommTimer = 0x00; //通讯帧间隔时间计数
Last_Prog_Flag = 0x01; //预置编程键上次状态为高
Prog_Flag = 0; //预置编程键无效
ProgTimer = 0x00; //编程状态计时
MainMonitor = 0; //主循环监控变量
T0Monitor = 0x0000; //Timer0监控变量
RTCMonitor = 0x0000; //RTC监控变量
ProgDeLayTimer = 0; //按键检测延时计数器
ProgActiveFlag = 0x00; //按键有效标志
}
//**********************************************************
//名称:MeterInit()
//功能:
//说明:
//**********************************************************
void MeterInit(void)
{
uchar i;
InitRAM(); //RAM初始化
if(RSTSRC&0x10) //上电满屏显示,LCD自检
{
RSTSRC &= ~0x10;
for(i=0;i<8;i++) CommVariant[i] = 0xFF;
Display(CommVariant);
}
RTC_Init(); //RTC初始化设置
Resume(); //电表电量数据恢复
RTC_Read(); //时钟读取
Fee_CHK(); //时段费率处理
Ery_Balance(); //电量结算处理
DspPara_Read(); //显示控制参数检查
BatWorkState_Proc(); //电池工作状态处理
}
//**********************************************************
// 名称:int1_isr()
// 功能:外部中断1中断处理程序
// 说明:正反向电能脉冲累计
//**********************************************************
void Int1_isr(void) interrupt 2 using 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -