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

📄 main.c

📁 dsp2407,采集卡
💻 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 + -