📄 main.c
字号:
#include <pic.h>
#include "Pindefine.h"
#define uint unsigned int
#define uchar unsigned char
void Systemyinit(void);
#define Timer10ms 240 //10ms中断
void interrupt ISR(void);
unsigned char AD_Change(unsigned char ch_num);
void TaskLoop(void);
void StartHumidityMeasure(void);
void start_Capture(void);
void CCP_value(void);
void calcu_sidu(unsigned char ch_Num);
extern void display(void);
const unsigned char dispcod[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x00};
extern Disdata bank1 DisData;
void charg_change(void);
void Pro_Key(void);
void ReadKey(void);
void TO_Setdata(unsigned char serial_num,unsigned char set_num);
extern void TO_Displaydata(unsigned int data,unsigned int Dis_floatnum,unsigned char line);
Key_para Key_press;
unsigned char bank2 back_Data = 0x00;
unsigned char bank1 Count10ms;
unsigned char bank1 Count100ms;
unsigned char bank1 Count1s;
// unsigned char Para[21];
unsigned char bank1 Count500ms;
unsigned char bank1 T10mscount;
unsigned int bank1 AD_result[2];
char bank2 HumidityData[2];
Capture bank1 Capture_Byte;
void watchDOG(void)
{
if(WDOG) WDOG = 0;
else WDOG = 1;
}
void main(void)
{
Systemyinit();
watchDOG();
HEA1 = 0;
HEA2 = 0;
GWBJ = 0;
while(1)
{
TaskLoop();
//FANA=1;
HEA1=1;
HEA2=1;
//GWBJ=1;
}
}
void interrupt ISR(void) //中断服务程序
{
unsigned int Cycle_L,Cycle_H;
if (T0IE && T0IF)
{
T0IF = 0;
TMR0 = Timer10ms;
T10mscount++;
display(); //显示
if(T10mscount>=10)
{
Count10ms++;
T10mscount = 0;
if(Count10ms%10==0) Count100ms=1;
if((Count10ms%50)==0) Count500ms = 1;
if(Count10ms>=100)
{
Count10ms = 0;
Count1s = 1;
}
}
if(Capture_Byte.Dely)
{
Capture_Byte.Dely++;
charg_change();
}
ReadKey();
}
if((CCP1IE&&CCP1IF)|(CCP2IE&&CCP2IF==1))
{
if(CCP1IF==1)
{
Cycle_H = CCPR1H;
Cycle_L = CCPR1L;
}
else
{Cycle_H = CCPR2H;
Cycle_L = CCPR2L;
}
CCP1IF=0;
CCP2IF=0;
Capture_Byte.Cycle_Byte[Capture_Byte.Cap_sampleNum++] = Cycle_H*256 + Cycle_L;
if(Capture_Byte.Cap_sampleNum>=CAP_NUM)
{
Capture_Byte.Dely = 0;
CCP2IE= 0;//关中断
CCP1IE= 0;
CCP_value();
Capture_Byte.Cap_chNum++;
if(Capture_Byte.Cap_chNum<CAP_CH)
{
Capture_Byte.Cap_sampleNum = 0;
Capture_Byte.Dely = 1;
CCP2IE = 1;//开中断中断
}
else
{
CCP2IE = 0;//开中断
Capture_Byte.Dely =0;
}
}
}
}
void charg_change(void)
{
if(Capture_Byte.Dely>=CAP_DELY)
{
CCP1IE=0;//关中断
CCP1IF = 0;
CCP2IE=0;//关中断
CCP2IF = 0;
Capture_Byte.Dely = 0;
Capture_Byte.Cycle_value[Capture_Byte.Cap_chNum] = 0;
Capture_Byte.Cap_chNum++;
if(Capture_Byte.Cap_chNum<CAP_CH)
{
Capture_Byte.Cap_sampleNum = 0;
Capture_Byte.Dely = 1;
CCP2IE = 1;
}
else
{
Capture_Byte.Dely = 0;
CCP1IE = 0;
CCP2IE = 0;
}
}
}
/***************************************************************************
函数名称:void Systemyinit()
函数功能:系统初始化
入口参数:无
备注:
***************************************************************************/
void Systemyinit(void)
{
ADCON1=0X04;
OPTION = 0x07; //256分频
HEA2Port =0; HEA1Port =0;
LEDWX3Port =0;
LEDWX2Port =0;
LEDWX1Port =0;
FANAPort =0;
TEMBPort =1;
TEMAPort =1;
GWBJPort =0;
CANCEL_KeyPort =1;
DOWN_KeyPort =1;
UP_KeyPort =1;
ENTER_KeyPort =1;
AD_result[0]=0; //温度
AD_result[1]=0; //温度
HumidityData[0] = 0;
HumidityData[1] = 0;
Key_press.Key_value == NO_KEY;
LEDWX8Port =0;
LEDWX7Port =0;
LEDWX6Port =0;
LEDWX5Port =0;
WDOGPort = 0;
RHAPort = 1;
RHBPort = 1;
LEDWX4Port = 0;
TRISD = 0;
LEDWX1=1;
LEDWX2=1;
LEDWX3=1;
LEDWX4=1;
LEDWX5=1;
LEDWX6=1;
LEDWX7=1;
LEDWX8=1;
FANA=0;
HEA1=0;
HEA2=0;
GWBJ=0;
TMR0 = Timer10ms; //
T0IE = 1; //开定时器0中断
PEIE = 1; //开外设中断
GIE = 1; //开CPU中断
}
void TaskLoop(void) //主循环任务
{ unsigned char i;
if(Count100ms==1)
{
}
if(Count500ms==1)
{
i++;
watchDOG();
Count500ms = 0;
Pro_Key();
//watchDOG();
/* if(i>=6)
{
if(i>=12) i=0;
TO_Displaydata(AD_result[0],10,0);
TO_Displaydata(HumidityData[0],10,1);
}
else
{
TO_Displaydata(AD_result[1],10,0);
TO_Displaydata(HumidityData[1],10,1);
}*/
}
if(Count1s==1)
{
Count1s = 0;
AD_Change(0);
AD_Change(1);
StartHumidityMeasure();
}
//Task500ms();
//Task1S();
}
/*********************************************************
函数名称:void Analog_Digital(unsigned char ch_num)
函数功能:AD采样
入口参数:ch_num:采样的通道
AD_data:转换的结果
出口参数:TRUE___成功完成AD转换
FALSE—AD转换失败
**********************************************************/
unsigned char Analog_Digital(unsigned char ch_num,unsigned int *AD_data)
{
unsigned char i,j;
TEMBPort =1;
TEMAPort =1;
if(ch_num) {ADCON0=0x4d;}
else {ADCON0=0x45;}
ADCON1 = 0x84;
j = 0;
for(;;)
{
if(ADIF == 1) break;
j++;
if(j>230)
return FALSE;
}
i = ADRESL;
j = ADRESH;
ADIF=0;
*AD_data=j*256+i;
return TRUE;
}
/*********************************************************
函数名称:void AD_Change(unsigned char ch_num))
函数功能:AD采样(默认采样5次取中间值作为本次采样的结果)
入口参数:ch_num:采样的通道
备注: 将最终采样的结果放在AD_result区中
因干扰等原因本次采样失败后不更新AD_result区的值
**********************************************************/
unsigned char AD_Change(unsigned char ch_num)
{
unsigned char i,j;
unsigned long k=0;
unsigned int AD_buff[21];
if(ch_num>1)
return FALSE;
//watchDOG();
for(i = 0; i < 21; i++)
{
if(Analog_Digital(ch_num,&AD_buff[i])==FALSE)
{
return FALSE;
}
}
for(i = 1;i < 21; i++)
{
for(j = 0;j < 20;j++)
{
if(AD_buff[j]>AD_buff[j+1])
{
k = AD_buff[j];
AD_buff[j] = AD_buff[j+1];
AD_buff[j+1] = k;
}
}
}
k= AD_buff[11];
/* if(ch_num == 0)
k = (k*Para[ParaTemp1])/100;
else
k = (k*Para[ParaTemp2])/100;
*/
k=k*5000;
k = k/1024;
if(k>=500)
{
k = (k -500);
if(k>1000) k = 1000;
AD_result[ch_num] = k;
if(AD_result[ch_num]>=1000)
{
AD_result[ch_num] = 999;
return FALSE;
}
}
else
{
AD_result[ch_num] = 0;
}
return TRUE;
}
/**************************************/
void StartHumidityMeasure(void) //启动测湿,每秒1次
{
static unsigned char Test_Hum_num;
if((Capture_Byte.Cap_chNum==0)&&(Capture_Byte.Dely==0))
{
start_Capture(); //开启捕获通道
}
if(Capture_Byte.Cap_chNum>=CAP_CH)
{
if(Capture_Byte.Cycle_value[0]>700) Capture_Byte.Cycle_value[0] = 700;
if(Capture_Byte.Cycle_value[1]>700) Capture_Byte.Cycle_value[1] = 700;
Capture_Byte.All_Cycle_value[0] += Capture_Byte.Cycle_value[0];
Capture_Byte.All_Cycle_value[1] += Capture_Byte.Cycle_value[1];
Test_Hum_num++;
if(Test_Hum_num>=3)
{
calcu_sidu(0);
calcu_sidu(1);
Capture_Byte.All_Cycle_value[0] = 0;
Capture_Byte.All_Cycle_value[1] = 0;
Test_Hum_num = 0;
}
//这里加合闸电压计算
Capture_Byte.Dely = 0;
Capture_Byte.Cap_chNum = 0;
Capture_Byte.Cap_sampleNum = 0;
}
}
/*************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -