📄 main.c
字号:
#pragma sfr
#pragma DI
#pragma EI
#pragma NOP
#pragma HALT
#pragma STOP
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
文件名: main.C
功能: 主程序,监测硬件变化,配合其它模块功能的实现
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#pragma interrupt INTTM000 MD_INTTM000
#pragma interrupt INTSR6 SERIAL_INTTM000
#pragma interrupt INTTMH1 MD_INTTMH1
#pragma section @@CNST OPEN AT 0x80
const unsigned char open=0xF1;
#include "main.h"
#include "WRE2PROM.h"
#include"serialRC.h"
#include"POWER_COUNT.h"
#include"LCD.h"
uchar arrl=0;
uchar relay_timer=0;
uchar incept_leisure=0;
extern uchar STB[MAX_STB_COUNT];
_level_counter_s Positive;
_level_counter_s Reverse;
uchar timer_event=0;
uchar KwConstant=0;
uchar Comm_Pin_Check=0;
sreg uchar key_timer;
uint program_timer=0;
bit Error_7755,UartState;
void Event_18mS(void);
void intRAM(void);
void Check_Sys(void);
void Power_CHeck(void);
void Power_off_io_int(void)
{
MK0=MK1=0xFF;
PM12=0xF6; //P121,P122输入模式。P123为输出模式,输出0.
P12=0;
P13=0x01;
PM2 = 0x08; /* P23为输入模式,P20~P22为输出模式,输出1. */
P2=0x07;
PM3 = 0x00; /* 输出模式,输出0 */
P3=0x00;
PM4=0xFF; //ASICL6ISC=0; D0
POWER6=0;
LVIS=0x02; //3//3.9V
TMC00=0x00; //16位定时器关
//
TMHMD1=0x50; //中断
CMP01=0xFF;
TMIFH1=0;
TMHE1=1;//开
MK0&=0xEF;
}
void int_MCU(void) //硬件初始化设置
{
PM12=0x00;
P12=0x00;
P13=0x01; //高电平
PM2 = 0x08; /* P23为输入模式,P20~P22为输出模式,输出1 */
PMC2 = 0x00; //P2口为端口模式
P2 = 0x04; /* P22(SDL)输出1 */
PM3 = 0x03; /* P30,P31为输入模式 */
P3 = 0x00;
PM4=0xF0; /*ASICL6ISC=0; D0 */
P4 =0xF9; /* P41,P42输出0 */
MK0=MK1=0xFF;
//38K
#ifdef NEED_IR
TMHMD1=0x03;
CMP01=46;
#else
TMHMD1=0;
#endif
//38K
TMIFH1=0;
TMHE1=0;//关闭
//串口*****
CKSR6=0x03;
BRGC6=186;//104;
ASIM6=0x1D;
ASICL6=2;
POWER6=1;
RXE6=1;
MK1 &= 0xdf;
//低压检测
LVIS=0x03;
LVIM=0x80;
//*****6mS中断
TMC00=0x00;
TOC00=0;
PRM00 = 0x02; /* 内部时钟计数 */
CRC00 = 0x00;
CR000 =84; /* 设置计数值 */
TMC00 = 0x0c; /* 开始interval timer功能 */
MK0 &= 0xdf; /* INTTM000使能 */
EI();
//Positive.count=Reverse.count=0;
//****
}
void main(void)
{
PCC=0x00;
PPCC=0x00;
WDTM = 0x67; //WDTM 7E禁止 0x67;
LSRCM=0x00; //启动低速晶振
OSTS=0x00; //stop起来后用最小的时间
PU2=PU3=PU4=PU12=0;//不接上拉
int_MCU();
//P4&=0xFF; //测试用20081224
Error_7755=0;
LCD_Show.timer=0;//INT LCD
Positive.count=Reverse.count=0;
//LCD_Show.Relay_State=0;
//LCD_Show.Relay_State=ReadChar(RELAY_STATE);
//relay(LCD_Show.Relay_State);
load_KwConstant();//读脉冲常数
LCD_Show.Relay_State=ReadChar(RELAY_STATE);
relay(LCD_Show.Relay_State);
//++++++++++++++++++++++++++++++++
//********WHILE循环开始
//++++++++++++++++++++++++++++++++
while(1)
{//<< << << << << << 10
#ifdef NEED_IR
if(UartState)
{
Comm_Pin_Check&=IR_IN_RECOGNISE;
}
#endif
if ( timer_event>2 )
{
DI();
timer_event=0;
EI();
Event_18mS();
}
}
}
//++++++++++++++++++++++++++++++++
//********WHILE循环结束
//++++++++++++++++++++++++++++++++
//中断程序
__interrupt void MD_INTTMH1(void)//136.17021276595744680851063829787 mS
{
timer_event++;
}
#define NATURAL_PLUSE_WIDTH 4 //正常最少脉冲宽度
#define NATURAL_PLUSE_INTERVAL 16 //正常最少脉冲间隔 102mS
/*-------------------------------------------------------------<
功能: 定时器2mS中断,为发送准备,编程按键,接收准备,电量脉冲长度计时
返回值: 无
全局变量: sendready,Programme_On,incept_leisure,Positive.highlevel
对全局变量的影响: 详见代码
-------------------------------------------------------------->*/
__interrupt void MD_INTTM000(void)//6mS
{
static uchar interval=NATURAL_PLUSE_INTERVAL;//保证刚上电的第一个脉冲有计数
TMIFH1=0;
if(interval<NATURAL_PLUSE_INTERVAL)
{
interval++;
}
if (POSITIVE_PIN)
{
if (Positive.highlevel < (NATURAL_PLUSE_WIDTH+1) )
{
Positive.highlevel++;
}
Reverse.highlevel=0;
}
else
{
if (Reverse.highlevel < (NATURAL_PLUSE_WIDTH+1) )
{
Reverse.highlevel++;
if (Reverse.highlevel > NATURAL_PLUSE_WIDTH )
{
if (Positive.highlevel > NATURAL_PLUSE_WIDTH )
{
if(interval<NATURAL_PLUSE_INTERVAL)
{
Error_7755=1;
}
else
{
if (PEVERSE_PIN)
{
Reverse.count++;
}
Positive.count++;
}
interval=0;
}
Positive.highlevel =0;
}
}
if (Positive.highlevel < (NATURAL_PLUSE_WIDTH+1) )
{
Positive.highlevel=0;
}
}
timer_event++;
}
/*-------------------------------------------------------------<
功能: 串口接收中断程序,识别?据帧并保存,发送完一字节清TT,半双工
返回值: 无
全局变量: COMM,arrl,STB,ncept_leisure,serial_frame,REN
-------------------------------------------------------------->*/
__interrupt void SERIAL_INTTM000( )
{
SRIF6=0;
incept_leisure=3;
if(UartState==UART_WAIT_START)
{
if(RXB6==UART_START_BYTE)
{
STB[0]=RXB6;
arrl=1;
UartState=UART_WAIT_RXDING;
Comm_Pin_Check=IR_PIN_HIGH;
}
}
else
{
if (arrl<MAX_STB_COUNT)
{
STB[arrl++]=RXB6;
}else
{
UartState=UART_WAIT_START;
}
}
}
void Measure(void)
{
if(!KwConstant)
{
KwConstant=8;
}
if (Positive.count>=KwConstant)
{
updataPower(DEGREE_OF_ABCPHASIC_ACT); //更新EEPROM
DI();
Positive.count-=KwConstant;
EI();
}
if ((Reverse.count)>=KwConstant)
{
updataPower(DEGREE_OF_ABCPHASIC_REV);//更新EEPROM
DI();
Reverse.count-=KwConstant;
EI();
}
}
void program_Check(void)
{
if(PROGR_KEY)
{
if(key_timer<KEY_PRESS_TIME)
{
key_timer++;
if(key_timer==KEY_PRESS_TIME-1)
{
if(PROGR_ENABLE)
{
program_timer=0;
}
else
{
program_timer=PROGR_15_MIN;
Update_LCD(1);
LCD_Show.timer=LCD_TURN_TIME;
}
}
}
}
else
{
key_timer=0;
}
if(PROGR_ENABLE)
{
program_timer--;
}
}
void comm_check(void)
{
DI();
if(incept_leisure)
{
incept_leisure--;
}
EI();
if(!incept_leisure)
{
MK1.5=1;//关接收中断
if(UartState==UART_WAIT_RXDING)
{
RXE6=0;
if (STB[9]<MAX_STB_COUNT-11)
{
if(STB[STB[9]+10]==uand(STB,STB[9]+10))
{
if (Parse_RxFrame()==OK)
{
sentarr();
if(PROGR_ENABLE)
{
program_timer=PROGR_15_MIN;
}
}
}
}
MemSetTo0(STB,MAX_STB_COUNT);
RXE6=1;
}
RESETGET;
MK1.5=0;
Update_LCD(0);
}
}
#define SHOW_TIME 29 //4//4S
#define CYCLE_TIME 76//10S
void Power_check(void)
{
if(POWER_LOW)
{
LCD_Show.Showing_ItemNO=0;
LCD_Show.timer=0;
program_timer=0;
LCD_Show_Turn();
Power_off_io_int();
while(POWER_LOW)
{
if(timer_event == SHOW_TIME )
{
Write_Order(LCD_OFF);
Write_Order(SYS_DIS);
}
else if(timer_event== (CYCLE_TIME-4) )
{
Write_Order(SYS_EN);
}
else if(timer_event== CYCLE_TIME )
{
timer_event=0;
Write_Order(LCD_ON);
}
WDTE=0xAC;
STOP();
}
Write_Order(SYS_EN);
LCD_Show.timer=35;
LCD_Show.Showing_ItemNO=0;
int_MCU();//
}
}
void Event_18mS(void)
{
WDTE=0xAC;
comm_check();
if(relay_timer)
{
relay_timer--;
if(relay_timer==0)
{
RELAYFREE;
}
}
else
{
Measure();
}
Power_check();
LCD_Show_Turn();
program_Check();
}
void load_KwConstant(void)
{
KwConstant=ReadChar(KWCONSTANT);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -