📄 main.c
字号:
//***************************************************//
#define __MAIN_INC_
#include ".\DAT\DEF.H"
//***************************************************//
void main(void)
{
// UINT i;
//
DisableINT(); // 禁止所有中断
SystemInit(); // 系统初始化
ClrWdt();
CLKout_Dis();
Max485Rx_ON();
WP_Enable();
VarInit(); // 变量标志初始化
AdStartInit(); // AD标志初始化
TimerSciInit(); // 运行灯初始化
RunLedInit(); // 定时器和通讯初始化
CAP6Init(); //2007-06-18 CLKEN中断初始化
IntInit(); // 中断系统初始化
DisableXINT1(); // ????????
// DisableXINT2(); // ????????
*EVBIMRC=EVBIMRCData; //2007-06-20
ClrIntFlag(); // 清除所有中断标志
EnableINT(); // 允许所有中断
EnableT1();
/************************ //2007-6-13 for WDT test
DisableINT(); // 禁止所有中断
//ClrLed0Flag();
RunLed_OFF();
for(n_AdDelay=0;n_AdDelay<2400;n_AdDelay++)
{
for(n_AdCnt=0;n_AdCnt<1000;n_AdCnt++){;}
}
while(1)
{
//SetLed0Flag();
RunLed_ON();
}
************************/
while(1)
{
ClrWdt();
WP_Enable();
SystemRinit(); // 系统初始化
IntInit(); // 中断系统初始化
EnableRxINT();
EnableTxINT();
EnableT1();
CAP6Init(); //2007-06-18 CLKEN中断初始化
EnableINT();
if(FlagRxOver) // 通讯接收完成处理
Cmd_Explain();
if(FlagAdStart==0)
{
if(n_AdDelay==0) // 没有开始处理
AdStartEdDo();
}
else
{
if(FlagAdOver==0) // 正在进行中处理
{
if((FlagAdClock) && (FlagAdTxCnt))
{
if(FlagSingleAd==0)
TX_SendCnt(n_AdCnt);
else
{
ReceiveSendCntDo();
if(FlagSingleAdF)
{
// DisableXINT1(); //????????
Timer2AND3Init();
n_T3Cnt=4;
VoltFrequency.Frequency.ULONGData=0;
}
}
}
}
else
// if(FlagAdStart&&FlagAdOver) // 结束处理
{
AdStartEdDo();
if(FlagSingleAd)
{
if(FlagSingleAdV)
{
CalVolt1();
n_AdCnt=0;
SetSingleAd();
ClrSingleAdV();
SetSingleAdF();
}
else
{
CalFrequency();
n_AdCnt=AdTotalCnt;
ClrSingleAd();
ClrSingleAdV();
ClrSingleAdF();
}
}
else
{
CalVolt2();
n_AdCnt++;
}
n_AdDot=0;
if(n_AdCnt>=AdTotalCnt)
{
SetAdHaveDone();
if(FlagAdClock)
{
ClrAdClock();
TX_EndAD();
}
}
else
if(FlagAdClock)
{
n_AdDelay=ADDELAYS;
}
}
}
}
}
//***************************************************//
void SystemInit(void)
{
asm(" setc SXM"); // 抑制符号位扩展
asm(" clrc OVM"); // 累加器中结果正常溢出
*SCSR1=SCSR1Data0;
// *SCSR2=SCSR2Data;
*WDCR=WDCRData; // 不使能看门狗,因为SCSR2中的WDOVERRIDE
SetDaramDATA(); // B0被配置为数据存储空间
// SetSaramDATA();
*MCRA=McraData; // 端口A,B的配置
*MCRB=McrbData; // 端口C,D的配置
*MCRC=McrcData; // 端口E,F的配置
*PADATDIR=PAData0; // 端口A的输入输出方式以及初始值
*PBDATDIR=PBData0; // 端口B的输入输出方式以及初始值
*PCDATDIR=PCData0; // 端口C的输入输出方式以及初始值
*PDDATDIR=PDData0; // 端口D的输入输出方式以及初始值
*PEDATDIR=PEData0; // 端口E的输入输出方式以及初始值
*PFDATDIR=PFData0; // 端口F的输入输出方式以及初始值
}
//***************************************************//
void SystemRinit(void)
{
asm(" setc SXM"); // 抑制符号位扩展
asm(" clrc OVM"); // 累加器中结果正常溢出
*SCSR1=SCSR1Data1;
// *SCSR2=SCSR2Data;
*WDCR=WDCRData; // 不使能看门狗,因为SCSR2中的WDOVERRIDE
SetDaramDATA(); // B0被配置为数据存储空间
// SetSaramDATA();
*MCRA=McraData; // 端口A,B的配置
*MCRB=McrbData; // 端口C,D的配置
*MCRC=McrcData; // 端口E,F的配置
/*
*PADATDIR|=PAData1; // 端口A的输入输出方式以及初始值
*PADATDIR&=PAData2; // 端口A的输入输出方式以及初始值
*PBDATDIR|=PBData1; // 端口B的输入输出方式以及初始值
*PBDATDIR&=PBData2; // 端口B的输入输出方式以及初始值
*PCDATDIR|=PCData1; // 端口C的输入输出方式以及初始值
*PCDATDIR&=PCData2; // 端口C的输入输出方式以及初始值
*PDDATDIR|=PDData1; // 端口D的输入输出方式以及初始值
*PDDATDIR&=PDData2; // 端口D的输入输出方式以及初始值
*PEDATDIR|=PEData1; // 端口E的输入输出方式以及初始值
*PEDATDIR&=PEData2; // 端口E的输入输出方式以及初始值
*PFDATDIR|=PFData1; // 端口F的输入输出方式以及初始值
*PFDATDIR&=PFData2; // 端口F的输入输出方式以及初始值
*/
}
//***************************************************//
void VarInit(void)
{
RunLed_OFF();
ErrLed_OFF();
OthLed_OFF();
ClrRxStart();
ClrRxOver();
ClrTxStart();
SetTxOver();
SpiWriteStatus(0xC);
// WP_Enable();
SpiRead(&DeviceNo,EEDeviceNo,1);
SpiRead(&DeviceClass,EEDeviceClass,1);
}
//***************************************************//
void Timer1Init(void) // 100hz 10ms
{
*GPTCONA=GPTCONAData;
*T1CON=T1CONData0; // Timer1为连续增计数模式,预分频值为64,使用内部时钟
*T1PER=SYSCLK/100/64; // Timer1的周期寄存器的值根据1ms延时和预分频值确定
}
//***************************************************//
void Timer2Init(void) // 10hz 100ms
{
*GPTCONA=GPTCONAData;
*T2CON=T2CONData0; // Timer2为连续增计数模式,预分频值为0,使用内部时钟
*T2PER=0XFFFF; // Timer2的周期寄存器的值根据1ms延时和预分频值确定
}
//***************************************************//
void Timer3Init(void) // 4hz 250ms
{
*GPTCONB=GPTCONBData;
*T3CON=T3CONData0; // Timer3为连续增计数模式,预分频值为128,使用内部时钟
*T3PER=SYSCLK/4/128; // Timer3的周期寄存器的值根据1ms延时和预分频值确定
}
//***************************************************//
void SciInit(void)
{
*SCICCR=SCICCRData; // 1个停止位,不使能奇偶校验,空闲线多处理器模式,8位字符
*SCICTL1=0x10; // #0010H 禁止接收和发送,SLEEP=0 禁止休眠
// 方式 , 禁止接收错误中断,TXWAKE=0 即没有选定的发送特征
*SCICTL2=SCICTL2Data; // 允许接收和发送中断
*SCIHBAUD=(SYSCLK/BAUDRATE/8-1)>>8;
*SCILBAUD=(SYSCLK/BAUDRATE/8-1)&0X00FF;
*SCICTL1=0x30; // 使SCI脱离复位状态
}
//***************************************************//
void TimerSciInit(void)
{
*T1CNT=0X00; // Timer1的计数器清零
Timer1Init(); // 定时器1初始化
EnableT1();
DisableT1(); // ????????
*T2CNT=0X00; // Timer2的计数器清零
Timer2Init(); // 定时器2初始化
EnableT2();
DisableT2(); // ????????
*T3CNT=0X00; // Timer3的计数器清零
Timer3Init(); // 定时器3初始化
EnableT3();
DisableT3(); // ????????
SciInit(); // 串口初始化
EnableRx();
DisableTx();
EnableRxINT();
EnableTxINT();
}
//***************************************************//
void CAP6Init(void) //CAP6初始化
{
*MCRC = *MCRC|0x0200; //IOPF1-->CAP6
*CAPCONB=0X9008; //cap6检测2沿.
*IMR = *IMR|0x08; //允许INT4中断
}
//***************************************************//
//***************************************************//
void Timer2AND3Init(void)
{
DisableXINT1(); //????????
// DisableXINT2(); //????????
*EVAIMRB=0X0000; // 定时器2中断禁止
*EVBIMRA=0X0000; // 定时器3周期中断禁止
*T2CNT=0X00; // Timer2的计数器清零
Timer2Init(); // 定时器2初始化
EnableT2();
DisableT2(); // ????????
*T3CNT=0X00; // Timer3的计数器清零
Timer3Init(); // 定时器3初始化
EnableT3();
DisableT3(); // ????????
*EVAIFRB=0XFFFF; // 清除中断标志
*EVBIFRA=0XFFFF; // 清除中断标志
*EVAIMRB=EVAIMRBData; // 定时器2中断禁止
*EVBIMRA=EVBIMRAData; // 定时器3周期中断允许
}
//***************************************************//
void RunLedInit(void)
{
Count1ms=0;
n_TxTimeUp=TXRESETTIME;
n_Run=RUNLEDONTIME;
SetLed0Flag();
RunLed_ON();
}
//***************************************************//
void IntInit(void)
{
*IMR=IMRData; // 允许一级中断int1,2,6
*XINT1CR&=~XINT1CRData1; // 下降沿 高优先级
// *XINT2CR&=~XINT2CRData1; // 下降沿 高优先级
*EVAIMRA=EVAIMRAData; // 定时器1周中断允
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -