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

📄 main.c

📁 采用PICC18编写的单片机源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "main.h"
#include "port.h"
#include "display.h"
#include "key.h"
#include "ADConvt.h"
#include "Ctrl14013.h"
#include "TIMER2.h"
#include "EmerTime.h"
#include "CtrlCharge.h"
#include "E2Addr.h"
#include "ChanEmerTime.h"
#include "calVol.h"
#include "serialPort.h"
//#define DEBUG    //调试开关
//#define DEBUGSP  //调试串口开关
//E2PROM初始化的值基准电压(495)、充电时间常数(24)、放电时间常数(4)
__EEPROM_DATA(0xEF, 0x01, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00);
//______________________________本机地址|放大倍数|终止电压

__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);




/*************************************中断函数初始化*****************************************
**入口:无
**出口:无
**使能TMR2中断和串口接收中断,其中TMR2匹配中断为高优先级中断,串口接收中断为低优先级中断
********************************************************************************************/
void Interpt_Initial(void)
{
   GIEH=0;           //禁止所有中断
   GIEL=0; 
   TMR2IF=0;           //TMR2与PR2匹配中断标志清0
   RCIF=0;         //串口接收中断标志清0
   TMR2IP=1;           //TMR2与PR2匹配中断设为高优先级
   RCIP=0;          //串口接收中断设为低优先级
   IPEN=1;      //使能中断优先级
   TMR2IE=1;       //定时器2中断使能
   RCIE=1;         //串口接收中断使能
   GIEH=1;         //中断使能
   GIEL=1;        
}
/**************************************高优先级中断********************************************
**入口:无
**出口:无
**对高优先级中断进行处理:定时器2匹配中断
**********************************************************************************************/
void interrupt HI_ISR(void)
{
   if(TMR2IF==1)    //是否是定时器2匹配中断
   {      
      TMR2IF=0;
      if(isTo1Sec())  //是否达到1S
      {
         flag_1Sec=1;   //1s标志置1
      }
   }
}
/**************************************低优先级中断********************************************
**入口:无
**出口:无
**对低优先级中断进行处理:串口接收中断
**********************************************************************************************/
void interrupt low_priority LOW_ISR(void)
{
   if(RCIF==1)    //是否是串口接收中断
   {
     recBuf[NumRecData]=RCREG;  //存储接收到的数据
     NumRecData++;    //已接收数据的数目+1
     ChkRecEnd();
   }
}
/**************************主函数初始化**********************
/*入口:无
/*出口:无
/*占用资源:
/*调用函数:display_initial,readkey_initial,
/***********************************************************/
void main_initial(void)
{
   taskNo=task_Display;   //当前任务显示
   FaceReg=conFaceMinNo;
   FaceChnNo=0;
   FaceEmerNo=0;
   AD_initial();    //AD初始化
   display_initial();    //显示初始化
   readkey_initial();   //按键初始化
   Ctrl14013_Initial();    //D触发器14013初始化
   Timer2_Initial();    //定时器2初始化
   Interpt_Initial();    //中断初始化
   EmerTime_Initial();    //应急时间初始化 
   CtrlCharge_Initial();   //充放电控制初始化
   ChanEmerTime_Initial();    //应急时间初始化
   CalVolt_initial();   //计算电压初始化
   serialPort_Initial();       //串口初始化
}
/**************************点亮指示*****************************
**入口:无
**出口:无
**根据FaceChnNo更新指示
**************************************************************/
void dispInsLed(void)
{
   if(FaceChnNo==0)
   {
      InsOut0=1;
      InsOut1=0;
      InsOut2=0;
      InsOut3=0;
   }
   else if(FaceChnNo==1)
   {
      InsOut0=0;
      InsOut1=1;
      InsOut2=0;
      InsOut3=0;
   }
   else if(FaceChnNo==2)
   {
      InsOut0=0;
      InsOut1=0;
      InsOut2=1;
      InsOut3=0;
   }
   else if(FaceChnNo==3)
   {
      InsOut0=0;
      InsOut1=0;
      InsOut2=0;
      InsOut3=1;
   }
}
/********************************显示指定位小数和指定位位整数*********************
*入口:floatNum-小数位数,uint8 intNum-整数位数,uint16 DispData-显示数据
*返回值:无
*全局变量:uint8 Intpart[3],Decm[2];    //整数部分数组,小数部分数组
*求取显示数据的BCD码,存入Intpart[3],Decm[2]
********************************************************************************/ 
void displayFloat(uint8 floatNum,uint8 intNum,uint16 DispData)  
{
  uint8 tmpCtr;    //循环控制
  uint16 tmpInt;
  if(floatNum>2)
  {
     floatNum=2;
  }
  if(intNum>3)
  {
     intNum=3;
  }	 
  tmpInt=DispData;
  if(floatNum!=0)
  {
     //计算小数部分
     for(tmpCtr=0;tmpCtr<floatNum;tmpCtr++)
     {
        Decm[tmpCtr]=tmpInt%10;
	    tmpInt=tmpInt/10;
     }
  }       
  //计算整数部分
  for(tmpCtr=0;tmpCtr<intNum-1;tmpCtr++)
  {
     Intpart[tmpCtr]=tmpInt%10;
	 tmpInt=tmpInt/10;
  }
  Intpart[intNum-1]=tmpInt;
}
/**************************显示充放电次数***********************
**入口:无
**出口:无
**根据FaceChnNo更新显示缓冲区      
*全局变量:uint8 Intpart[3],Decm[2],dispBuf[con_Disp_Bit];    //整数部分数组,小数部分数组                  
**************************************************************/
void dispChDNum(void)
{
   //点亮指示灯
   dispInsLed();
   //显示充电次数
   displayFloat(0,2,CtrlCharge[FaceChnNo].ChargeNum);
   dispBuf[0]=TableNum[Intpart[0]];
   dispBuf[4]=TableNum[Intpart[1]];
   //显示放电次数
   displayFloat(0,2,CtrlCharge[FaceChnNo].disChargeNum);
   dispBuf[2]=TableNum[Intpart[0]];
   dispBuf[1]=TableNum[Intpart[1]];
   //显示通道号
   dispBuf[3]=TableNum[FaceChnNo];
}
/**************************显示充放电时间***********************
**入口:无
**出口:无
**根据FaceChnNo更新显示缓冲区      
*全局变量:uint8 Intpart[3],Decm[2],dispBuf[con_Disp_Bit];    //整数部分数组,小数部分数组                  
**************************************************************/
void dispChDTime(void)
{
   //点亮指示灯
   dispInsLed();
   //显示充放电次数时间(小时)
   displayFloat(0,2,CtrlCharge[FaceChnNo].hour);
   dispBuf[0]=TableNum[Intpart[0]];
   dispBuf[4]=TableNum[Intpart[1]];
   //显示充放电时间(分钟)
   displayFloat(0,2,CtrlCharge[FaceChnNo].minute);
   dispBuf[2]=TableNum[Intpart[0]];
   dispBuf[1]=TableNum[Intpart[1]];
   //显示T
   dispBuf[3]=TableLetter[8];
}
/**************************显示应急时间***********************
**入口:无
**出口:无
**根据FaceChnNo,FaceEmerNo更新显示缓冲区      
*全局变量:uint8 Intpart[3],Decm[2],dispBuf[con_Disp_Bit];    //整数部分数组,小数部分数组                  
**************************************************************/
void dispEmerTime(void)
{
   //点亮指示灯
   dispInsLed();
   //显示应急时间
   displayFloat(0,3,ChanEmerTime[FaceChnNo].EachEmerTime[FaceEmerNo]);
   dispBuf[2]=TableNum[Intpart[0]];
   dispBuf[1]=TableNum[Intpart[1]];
   dispBuf[0]=TableNum[Intpart[2]];
   //显示次数
   dispBuf[4]=TableNum[FaceEmerNo];
   //显示E
   dispBuf[3]=TableLetter[4];
}
/**************************显示终止电压***********************
**入口:无
**出口:无
**根据FaceChnNo,FaceEmerNo更新显示缓冲区      
*全局变量:uint8 Intpart[3],Decm[2],dispBuf[con_Disp_Bit];    //整数部分数组,小数部分数组                  
**************************************************************/
void dispEmerVolt(void)
{
   //点亮指示灯
   dispInsLed();
   //显示终止电压
   if(Amp==conAmp1)
   {
      displayFloat(2,1,EmerVolt[FaceChnNo][FaceEmerNo]);
      dispBuf[2]=TableNum[Decm[0]];
      dispBuf[1]=TableNum[Decm[1]];
      dispBuf[0]=TableNumPt[Intpart[0]];
   }
   else if(Amp==conAmp2) 
   {
      displayFloat(1,2,EmerVolt[FaceChnNo][FaceEmerNo]);
      dispBuf[2]=TableNum[Decm[0]];
      dispBuf[1]=TableNumPt[Intpart[0]];
      dispBuf[0]=TableNum[Intpart[1]];
   }   
   //显示次数
   dispBuf[4]=TableNum[FaceEmerNo];
   //显示U
   dispBuf[3]=TableLetter[9];
}
/**************************显示基准电压***********************
**入口:无
**出口:无
**根据baseVolt更新显示缓冲区      
*全局变量:uint8 Intpart[3],Decm[2],dispBuf[con_Disp_Bit];    //整数部分数组,小数部分数组                  
**************************************************************/
void dispBaseVolt(void)
{
   //显示基准电压
   displayFloat(2,1,baseVolt);
   dispBuf[2]=TableNum[Decm[0]];
   dispBuf[1]=TableNum[Decm[1]];
   dispBuf[0]=TableNumPt[Intpart[0]];
   //显示U
   dispBuf[4]=TableLetter[9];
   //显示b
   dispBuf[3]=TableLetter[1];
}
/**************************显示本机地址***********************
**入口:无
**出口:无

⌨️ 快捷键说明

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