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

📄 main.c

📁 江苏单相复费率电能表方案
💻 C
📖 第 1 页 / 共 2 页
字号:
	TL0   = 0x33;	
	
    ET0   = 1;
    
	IP0H &=~0x04;								//设置Timer0的中断优先级别为1级 
	IP0  |= 0x04;
  	
	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       
	//使用内部波特率发生器
	//======================================================
	//PCON   = 0x80;							//SMOD1=1,SMOD0=0   ???????
	//PCON   = 0x00;							//SMOD1=0,SMOD0=0   
	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中断
  	
	
	//======================================================
	//键盘中断初始化
	//======================================================    
    KBPATN  = 0xFF;
    KBCON   = 0x00; 							//PATN_SEL=0
    KBMASK  = 0x40; 							//P0.6:RS485通讯唤醒
    				
  	IP1    &=~0x02;								//中断优先级为0级(最低) 
 	IP1H   &=~0x02;    

    EKBI    = 1; 								//键盘中断使能
}





//**********************************************************
//名称:MeterInit
//功能:
//说明:
//**********************************************************
void MeterInit(void)
{
  	uchar i;

	//P0:
	P0      |= 0xB5;							//10110101
  	//HW38K    = 1;    							//P0.7置高	
  	//CTRL485  = 1;                				//RS485接收状态
	//PDA      = 1;			   					//P0.4空->置高处理
	//LED_COMM = 1;   							//通讯指示灯灭
	//LED_G    = 1;          					//谷时段指示灭
	
	//P1:
  	LED_F    = 1;         			  		    //峰时段指示灭
	COMMSEL  = 0;               				//默认红外通讯方式
	
	//P2:	
	P2       = 0xFF;  							//对于LPC931,P2口空->置高处理 

  	
	MSSum    = 0x0000;							//时间补偿为零
	
	//※※※※※※※※※※※※※※※※※※※※※※※※※※※
  	//显示设置
	//※※※※※※※※※※※※※※※※※※※※※※※※※※※
 	if(RSTSRC&0x10)								//上电满屏显示
 	{
 		RSTSRC &= ~0x10; 		
		for(i=0;i<8;i++)	RTC[i] = 0xFF; 
   		Display(RTC); 

 	}
	//※※※※※※※※※※※※※※※※※※※※※※※※※※※
	
	
	//※※※※※※※※※※※※※※※※※※※※※※※※※※※  	
	RTC_Init();									//RTC初始化设置
	//※※※※※※※※※※※※※※※※※※※※※※※※※※※	
	
	
	//※※※※※※※※※※※※※※※※※※※※※※※※※※※
	Addr[0] = 0xA0;
  	Addr[1] = 0x00;  	  
  	//Len[0]  = 0x02;
  	Len[1]  = 0x06;	
	ReadData(PulseTmp);	   						//剩余脉冲数据恢复
  	if(PulseTmp[5]!=SumCHK(PulseTmp,5))	ArrayInit(PulseTmp,6);	
  	
  	Resume();									//电表电量数据恢复
	RTC_Read();									//时钟读取  	
	Fee_CHK();									//时段费率处理	
	//※※※※※※※※※※※※※※※※※※※※※※※※※※※
	Watchdog_feed();
	
	Ery_Balance();								//电量结算处理	
	
	DspPara_Read();								//显示控制参数检查
	
	AdjDate=DateTerm();							//日期条件
}




//**********************************************************
// 名称:CMP_isr
// 功能:掉电数据保存
// 说明:
//**********************************************************
void CMP_isr(void) interrupt 8 using 1
{	
	uchar i;
	uchar j;
	
	i = 0xFF;
	while(--i);

  	if(CMP1&0x01)										//电源跃变中断(低->高,高->低)
  	{
  		CMP1 &= 0xFE;             						//清除比较器CMP2中断标志
  		
  		if(TxdWork==0)                                  //不在发送状态
  		{
  			if(CMP1&0x02)	AUXR1 |= 0x08;				//复位(用于电压低->高跃变过程)
  			else										//掉电处理(用于电压高->低跃变过程)
  			{
  				//PulseTmp[5] = PulseTmp[0]+PulseTmp[1]+
  				//		  	  PulseTmp[2]+PulseTmp[3]+PulseTmp[4];   					  
  		
 	 			if( I2EN == 1 )    	  					//I2C总线忙
  				{                              
   	 				I2CON = 0x54;      					//STO=1&AA=1 发送停止标志,结束其他I2C操作   	 												
    				while(STO == 1);			 			
   					for(i=0;i<100;i++)					//延时10mS
   					{  				
   						j = 184;
						while(--j);
   					}
  				}  			
  			
  				//※※※※※※※※※※※※※※※※※※※※※※※※※※※※※  			
   				//屏蔽秒脉冲输出
  				/*
				I2SCLH = 0x14;		    				//设置SCL高电平的PCLK周期数
 				I2SCLL = 0x14;          				//设置SCL低电平的PCLK周期数
  				I2CON  = 0x64;         	 				//申请成为主机,起动总线。使用内部SCL发生器,I2EN和AA置位  
  				while( SI==0 );         				//等待起始信号的发送,申请总线   		
						 			
  				I2DAT = RX_8025;   						//发送器件地址
    			I2CON = 0x44;       					//清除SI位等等
    			while( SI==0 );     					//等待数据的发送
  		
  				I2DAT = 0xE0;      						//发送从地址
    			I2CON = 0x44;       					//清除SI位等等
    			while( SI==0 );     					//等待数据的发送  
    		
    			I2DAT = 0x20;      						//发送从地址
    			I2CON = 0x44;       					//清除SI位等等
    			while( SI==0 );     					//等待数据的发送
    					
  				I2CON = 0x54;      						//结束总线
  				while(STO == 1); 
				*/
  				//※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
 			
  			
  			
  				//※※※※※※※※※※※※※※※※※※※※※※※※※※※※※  			
  				I2SCLH = 0x14;		    				//设置SCL高电平的PCLK周期数
 				I2SCLL = 0x14;          				//设置SCL低电平的PCLK周期数
  				I2CON  = 0x64;         	 				//申请成为主机,起动总线。使用内部SCL发生器,I2EN和AA置位  
  				while( SI==0 );         				//等待起始信号的发送,申请总线
  			  			
  				I2DAT = 0xA0;      						//发送器件地址
    			I2CON = 0x44;       					//清除SI位等等
    			while( SI==0 );     					//等待数据的发送
  		
  				I2DAT = 0x00;      						//发送从地址
    			I2CON = 0x44;       					//清除SI位等等
    			while( SI==0 );     					//等待数据的发送  		
  		
  				for(i=0;i<6;i++)						//发送数据
  				{
    				I2DAT = PulseTmp[i];
    				I2CON = 0x44;        				//清除SI位等等
    				while( SI==0 );	
  				}
  				I2CON = 0x54;      						//结束总线 
  		
 				while((CMP1&0x02)==0x00); 				//检测上电(低->高)情况;等待
 				AUXR1 |= 0x08;							//复位
 			}	
 		}
 	}
 	 	     	
    if(CMP2&0x01)	CMP2 &= 0xFE; 						//清除CMP1中断标志
}




//**********************************************************
// 名称:int1_isr
// 功能:外部中断1中断处理程序
// 说明:电能脉冲处理方法

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -