📄 mcuinitial.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 + -