📄 system.c
字号:
/***************************系统时钟初始化********************************/
void SYSCLK_Init (void)
{
int i; // delay counter
char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = CONFIG_PAGE;
OSCXCN = 0x77; // start external oscillator with 22.1184MHz crystal
// start system clock 11.592MHZ;
for (i=0; i< 256; i++ ); // XTLVLD blanking interval (>1ms)
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
CLKSEL = 0x01; // select external oscillator as SYSCLK
OSCICN = 0x88; // source and enable missing clock
// detector
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
// ************************端口初始化******************************//
void PORT_Init (void)
{
char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = CONFIG_PAGE; // set SFR page
XBR0 = 0x04; // Enable UART0(TX0--P0.0 ;RX0--P0.1)
XBR3 = 0x80; // Set CAN TX pin to push-pull
XBR2 = 0x44; // Enable crossbar and weak pull-up
// Enable UART1(TX1--P0.2 ;RX1--P0.3)
P0MDOUT |= 0x05; // Set TX0、TX1 pin to push-pull
P1MDOUT |= 0xFF; // Set P1 pin to push-pull
P2MDOUT |= 0x80; // Set P2.7 pin to push-pull
P4MDOUT |= 0xFF; // Set P4 pin to push-pull
P5MDOUT |= 0xFF; // Set P5 pin to push-pull
P6MDOUT |= 0xFF; // Set P6 pin to push-pull
P7MDOUT |= 0xFF; // Set P7 pin to push-pull
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/**********************串口0初始化*******************************/
// 用定时器2,4作波特率发生器,数据格式为1位起始位、8位数据位、1位停止位
void UART0_Init (void)
{
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = UART0_PAGE;
SCON0 = 0x50; //设定串口0工作在方式1,(即8位数据位、1位停止位、波特率可变)
SSTA0 = 0x0D; //定时器2的溢出率作接收波特率的时钟源,定时器4的溢出率作发送波特率的时钟源
SFRPAGE = TMR2_PAGE;
TMR2CN = 0x00; // Stop Timer2; Clear TF2;
TMR2CF = 0x08; // Sysclk is the source of timer2 ; // use SYSCLK as timebase
RCAP2 = -(22118400/10400/16); // Init reload values
TMR2 = RCAP2; // set to reload immediately
TMR2CN |= 0x04; // start Timer2
SFRPAGE = TMR4_PAGE; // set SFR page
TMR4CN = 0x00; // Stop Timer4; Clear TF4;
TMR4CF = 0x08; // Sysclk is the source of timer2 ; // use SYSCLK as timebase
RCAP4 = -(22118400/10400/16); // Init reload values
TMR4 = RCAP4; // set to reload immediately
TMR4CN |= 0x04; // start Timer4
//ES0=1; // Enable UART0 interrupt.
EA=1; // Enalbe all interrupt
TI0=0;
RI0=0;
REN0=1;
SFRPAGE=SFRPAGE_SAVE;
}
/***************************************************************
IN:
OUT:
COMMENT:串口1初始化,用定时器1作波特率发生器,数据格式为1位起始位
8位数据位、1位停止位
***************************************************************/
void UART1_Init (void)
{
char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = UART1_PAGE; // set SFR page
SCON1 = 0x50; // SCON1: mode 1, 8-bit UART, enable RX
SFRPAGE = TIMER01_PAGE;
TMOD = 0x20; // Timer1:mode 2, 8-bit auto.
TH1 = -(22118400/57600/2); // set Timer1 reload value for baudrate
TL1 = TH1;
TL1 = 0xFF; // Set to reload immediately
TR1 = 1; // start Timer1
CKCON |= 0x10; // Timer1 uses SYSCLK as time base
EIE2 |= 0x40; // Enable UART1 interrupt.
EA=1;
TI1=0;
RI1=0;
REN1=1;
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/****************************************************************
IN:
OUT:
COMMENT:设定定时器3的定时时间为1ms.
*****************************************************************/
void Timer3_Init (void)
{
char SFRPAGE_SAVE = SFRPAGE; // 保存当前SFR页
SFRPAGE = TMR3_PAGE; // set SFR page
TMR3CN = 0x00; // Stop Timer3; Clear TF3;
TMR3CF = 0x00; // 使用 SYSCLK/12 做Timer3的时钟源
RCAP3 = -(22118400/1000/12); // Timer3 装载值
TMR3 = RCAP3;
EIE2 |= 0x01; // Enable Timer 3 interrupts
TR3 = 1; // Start Timer 3
//TR3=0;
SFRPAGE = SFRPAGE_SAVE; // Restore SFRPAGE
}
/****************************************************************
IN:
OUT:
COMMENT:部分变量初始化函数
*****************************************************************/
void Variable_Init(void)
{
unsigned short i; // 初始化时,串口1只允许接收
Timer3_OverTimes=0; // 初始化时,上行桢发送的数据类型设为正常返回的上行桢
for(i=0;i<1000;i++)
CarComputerSendData[i]=CarComputerSendData1[i];
for(i=0;i<255;i++)
Comm0RecData[i]=0;
for(i=0;i<255;i++)
Comm0SendData[i]=0;
Comm1RecPtr=0;
Comm1SendPtr=0; //串口0接收、发送指针
Comm1RecLength=0;
Comm1SendLength=0;
MultiDtcFlag=0;
}
/*****************************************************************
IN:
OUT:
COMMENT:通道,通讯协议设置程序
******************************************************************/
void PortSet(void)
{
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE= CONFIG_PAGE; // set SFR page
P4&=~0x01; //选择通道4 CTL1=0 设置发
P5=0x3A; //设置收,发
//P4&=0XF7 //选择通道5
//P5=0X22
SFRPAGE=SFRPAGE_SAVE;
}
/***************************************************
IN:输入延时时间值X
OUT:
COMMENT:延时时间=X*1MS
****************************************************/
/*void DelayTime(unsigned short int delay)
{
unsigned short int i=0;
unsigned short int j=0;
for(j=0;j<delay;j++)
{
while(i!=1350)
{
i++;
}
i=0;
}
}*/
/***************************************************
IN:NONE
OUT:返回收到的一个字节
COMMENT:接受一字节
****************************************************/
/*unsigned char RecByte(void)
{
unsigned char i=0;
EA=0;
RI0=0;
while(RI0==0)
{}
RI0=0;
i=SBUF0;
EA=1;
return i;
}*/
/***************************************************
IN:输入一字节
OUT:NONE
COMMENT:发送一字节
****************************************************/
/*void SendByte(unsigned char senddata)
{
EA=0;
TI0=0;
SBUF0=senddata;
while(TI0==0)
{}
TI0=0;
EA=1;
}*/
/***************************************************
IN:NONE
OUT:Save5bps
COMMENT:把解码器按5BPS发送的数据保存到Save5bps
****************************************************/
/*unsigned char Check5bps(void)
{
unsigned char Save5bps;
Save5bps=0x00;
while(RXD0==1)
{}
DelayTime(200);
DelayTime(100);
if(RXD0==1)
{
Save5bps |=0x01;
}
DelayTime(200);
if(RXD0==1)
{
Save5bps |=0x02;
}
DelayTime(200);
if(RXD0==1)
{
Save5bps |=0x04;
}
DelayTime(200);
if(RXD0==1)
{
Save5bps |=0x08;
}
DelayTime(200);
if(RXD0==1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -