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

📄 mcuinitial.c

📁 it is code for briging up_machtion to down machtion,it s functions act protol changing and comunica
💻 C
字号:






#include "port.h"
#include "function.h"
#include "ExHeadFileRs232.h"
#include  "Exvariable.h"

void  MCUInitial(void)
	{
		CrystalStabilize();
		X5083Initial();
		Rs485Initial();
		Rs232Initial();
		SW_UART_ENABLE();
		UART_ENABLE();
		EA=0;
		ES0=0;			//关串口中断0	
		EIE2&=0xbf;		//关串口中断1
		EA=1;
		QueryModuleAddr();
		ES0=1;			//开串口中断0
		EIE2|=0x40;		//开串口中断1
		T2Initial();    //通过对开关状态的查询
						//选择监控盘的工作模式
	}


void  Rs485Initial(void)
	{


		SW_UART_INIT();
		SendToModuleFlag=0;
		//初始化RS485状态

  		StateTableRs485.count=0;
		StateTableRs485.RecCompleteRs485=0;
		//分析485口接收到的数据的步骤
		StepRs485=0;
		//485口初始化为接收状态
		SFRPAGE=CONFIG_PAGE;
		EnRs485 = 0;
		//用于向485口发送指令指针
		Rs485ReadPointer=0;
		Rs485RxWritePointer=0;
		SUTXST=0x00;
		SURXST=0x00;

	}



//监控盘和上位机通讯.
//波特率9600bps
void  Rs232Initial(void)
	{   
		HW_UART_INIT();
		Rs232TxSendPointer=0;		//发送缓冲区指针
		Rs232RxWritePointer=0;		//接收缓冲区指针
		AnalyseUpMachineFlag = 0;
 		RecFlagRs232=0;
 		LenDataRs232=0;				//数据的长度为0
 		Local_mvRs232=1;			//帧头的位置为1
		AnalyseUpMachineFlag=0;     //未分析上位机指令
		SendToModuleFlag=0;         //初始化监控盘向模块发送指今标志
		AnalysisFlag=0;				//RS232接收完数据,等待分析
		Rs232SendLen=0x00;
	}


//- Disables Watchdog Timer 
// - Configures external crystal; switches SYSCLK to external crystal when stable. 
void CrystalStabilize(void)
	{ 
		int i;
		//---------------
		//关掉狗
		WDTCN = 0xDE;
		WDTCN = 0xAD;
		SFRPAGE=CONFIG_PAGE;
		OSCXCN =0x67;
		CLKSEL=0x01;
		for (i=0; i < 256; i++) ;   
		while (!(OSCXCN & 0x80));
		SFRPAGE=CONFIG_PAGE;
		P5MDOUT|=0xf0;				//控制灯闪引脚
		P5|=0xf0;
		P2MDOUT|=0x01;				//控制灯闪引脚
		P2|=0x01;
		//P2.3为输入口				//SPI DATA引脚
		P2MDOUT&=0xf7;
		P2|=0x08;
		//P3.2 P3.3为输出口
		P3MDOUT|=0x05;
		P3|=0x05;					//引脚输出低电平
		P0MDOUT|=0x40;				//573的LE脚
		P0&=0xbf;
		//p4.0---p4.3 				//控制监控盘的工作模式
		P4MDOUT|=0x0f;
		P4|=0x0f;
	} 



//查询模块地址,将结果存入EEPROM中
void  QueryModuleAddr(void)
{
	unsigned int i;
	//0x01命令号是我给的
	//目的是借用现有通讯代码实现
	//查询模块功能地址的功能
	//Rs485RxBuffer[30]用于存放模块功能编码
	//Rs485RxBuffer[31]用于存放模块编码
	//根据以上两编码查看模块
	Rs485RxBuffer[30]=0x01;
	Rs485RxBuffer[31]=0x00;
	//清存储模块编号的EEPROM
	SFRPAGE=CONFIG_PAGE;
	fEepromWriteSA( &Rs485RxBuffer[31],0x00,0x06);
	WriteDisable();
	for(i=0;i<4500;i++);
	Commands=0x01;
	CountT0=0x03;
	StateTableRs485.count=50;//防止未查完模块就退出代码
	SendToModuleFlag=1;

}


//------------------------------------------------------------------------------------
// HW_UART_INIT: HW_UART Initialization Routine
// Sets up HW_UART for use in SW_UART testing.
// - HW_UART in Mode 1
// - Timer 1 used as baud rate source, clocked by SYSCLK.
//
void HW_UART_INIT(void) 
	{
		PageTemp=SFRPAGE;
		SFRPAGE=UART0_PAGE;
		SSTA0&=~0x1f;
		SSTA0=0x10;//SMOD==1
		TMOD |= 0x20; // Configure Timer 1 for use by HW_UART 
		CKCON|= 0x10; // Timer 1 derived from SYSCLK 
		TH1 = -CountUartRs232; // Timer 1 initial value 
		TL1 = -CountUartRs232; // Timer 1 reload value 
		//TH1=TL1=0xDC;
		// Configure HW_UART for Mode 1, 
		//8-bit UART,Variable Baud Rate ,Receive Enable
		//SCON0 = 0x50; 
		SCON0 |= 0x50; 
		RI0=0;
		TI0=0;
		SFRPAGE=CONFIG_PAGE;
		XBR0|=0x04;
		//开中断
		IE=0x10;
		SFRPAGE=PageTemp;
	
	}


//-----------------------------------------------------------------------------------// 
//SW_UART_INIT: SW_UART initialization routine 
// Prepares SW_UART for use. 
// - Configures PCA: Module 0 in negative capture mode; module 1 in software 
// timer mode; PCA time base = SYSCLK; PCA interrupt disabled; PCA counter 
// disabled. 
// - Clears pending PCA module 0 and 1 interrupts 
// - Resets TX and RX state variables 
void SW_UART_INIT(void)
	{ 

		PageTemp=SFRPAGE;
		SFRPAGE=PCA0_PAGE;
		PCA0CPM0 = 0x50; 		//triggle by negative lever
		PCA0CPM1 = 0x00; 
		//system clock 
		PCA0MD= 0x08;			//ECF=0
		CCF0 = 0; 
		CCF1 = 0; 
		SFRPAGE=CONFIG_PAGE;
		XBR2|=0x40;				//crossbar enable
		//XBR1=0x80;			//SYSCLK routed to port pin
		XBR0|=0x04;				//uart0 enable
		XBR2|=0x04;				//uart1 enable
		XBR0|=0x08;				//CEX0 routed to port pin
		SFRPAGE=UART0_PAGE;
		TR1=0x01;
		EIP1|=0x08;				//PPCA0=1
		SFRPAGE=PageTemp;

		//TR1=0x01;
	} 



void SW_UART_ENABLE(void)
	{
 		PageTemp=SFRPAGE;
 		SFRPAGE=PCA0_PAGE ;
 		EIE1|=0x08;				//Enable PCA0 interrupt
 		PCA0CPM0|=0x01;
		PCA0CPM1 = 0x01; 
 		SFRPAGE=PageTemp;
	}


void UART_ENABLE(void)
	{
		SFRPAGE=UART0_PAGE;
		TR1 = 1; // Start Timer 1 
		RI0=0; // Clear HW_UART receive and transmit 
		TI0=0; // complete indicators. 
		SFRPAGE=PageTemp;

	}



void X5083Initial(void)
	{
		//不用X5083的狗
		PageTemp=SFRPAGE;
		SFRPAGE=CONFIG_PAGE;
		fEepromInit(0x18);
		SFRPAGE=PageTemp;
	}



void T2Initial(void)
	{	//每隔284ms查询一次开关状态
		//决定监控盘要不要更换工作模式
		PageTemp=SFRPAGE;
		SFRPAGE=TIMER01_PAGE;
		TF2=0;
		RCAP2L=0x00;
		RCAP2H=0x00;
		TR2=0x01;
		SFRPAGE= CONFIG_PAGE;
		XBR1|=0x20;				//T2E=0x01
		SFRPAGE=PageTemp;
	}









⌨️ 快捷键说明

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