⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 本代码为电子式单相多费率电能表的源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -