📄 20051130152364.c
字号:
RCAP4H=0XFF;
RCAP4L=0XB8;
T4CON |=0X04; //
PCON |= 0x10; // SMOD1 = 1
EIE2 |= 0x40; // enable UART1 interrupts
TX1_Ready = 1; // indicate TX ready for transmit
RX1_Ready = 0; // indicate RX string not ready
TX1_ptr = NULL;
}
//
void UART1_ISR (void) interrupt 20 using 3
{
static unsigned char TX1_index = 0; // send buffer index
unsigned char the_char;
if ((SCON1 & 0x01) == 0x01)
{ // handle receive function
SCON1 &= ~0x01; // RI1 = 0; clear RX complete
if (RX1_Ready == 0) //可以接收
{ the_char = SBUF1; // check to see if message pending
if(RX1_index >=RX1_LENGTH)
{
if (the_char == RX1_END) //是结束符
{
RX1_Buf[RX1_index] = the_char; // NULL-terminate message
RX1_Ready = 1; // post message ready
RX1_index = 0; // reset RX message index
}
else //不是结束符
{
RX1_Ready =0; // post message ready
RX1_index = 0; // reset RX message index
}
}
else
{
if(RX1_index==0)
{
if (the_char == RX1_START) //是起始符
{
RX1_Buf[RX1_index] = the_char;
RX1_index++;
RECEIVENUM1=2;
}
else //不是起始符
{
RX1_Ready =0;
RX1_index = 0;
RECEIVENUM1=1;
}
}
else
{
if (the_char == RX1_END) //是结束符
{
RX1_Buf[RX1_index] = the_char; // NULL-terminate message
RX1_Ready = 1; // post message ready
RX1_index = 0; // reset RX message index
}
else //不是结束符
{
RX1_Buf[RX1_index] = the_char;
RX1_index++;
RECEIVENUM1++;
}
}
}
}
else
{
; // ignore character -- previous message has not been processed
}
}
else if ((SCON1 & 0x02) == 0x02)
{// handle transmit function
SCON1 &= ~0x02; // TI1 = 0; clear TX complete
// indicator
the_char = *TX1_ptr; // read next character in string
if(TX1_index<SENDNUM1)
{
TX1_ptr++;
TX1_index++; // get ready for next character
SBUF1 = the_char; // transmit it
}
else
{
TX1_Ready = 1; // indicate ready for next TX
TX1_index=0;
}
}
}
//定时器0初始化
void Timer0_Init (void)
{
TMOD |=0X01;
TH0=0XB8;
TL0=0X00;
ET0=1;
}
//---------------------------------------------------------------------------------------
/*定时器T0溢出中断处理子程序*/
void Timer0_ISR(void) interrupt 1
{
//tend=temp;
// if(time>=tend)
if(time>=password_time)
{
TL0=0X00; /*11.0592MHZ T0低8位初值:定时10ms*/
TH0=0XB8; /*T0高8位初值*/
TR0=0; /*终止定时器T0*/
//sendinterval=1;
password_flag=0;
time=0;
LED=1;
}
else
{
LED=0;
TL0=0X00; /*T0低8位初值:定时50ms*/
TH0=0XB8; /*T0高8位初值*/
time=time+1;
//sendinterval=0;
}
}
//---------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
//
void UART0_Init (void)
{ /*
SCON0 = 0x50; // SCON0: mode 1, 8-bit UART, enable RX
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit reload
TH1 = 0x6F; // set Timer1 reload value for baudrate
CKCON |= 0x10; // Timer1 uses SYSCLK as time base
PCON |= 0x90; // SMOD0 = 1
ES0 = 1; // enable UART0 interrupts
TI0 = 1; // Indicate TX0 ready
TR1 = 1; // start Timer1
TX0_Ready = 1; // indicate TX ready for transmit
RX0_Ready = 0; // indicate RX string not ready
TX0_ptr = NULL;*/
SCON0 = 0x50; // SCON0: mode 1, 8-bit UART, enable RX
TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit reload
TH1 = -(SYSCLK/BAUDRATE/16); // set Timer1 reload value for baudrate
TR1 = 1; // start Timer1
CKCON |= 0x10; // Timer1 uses SYSCLK as time base
PCON |= 0x80; // SMOD00 = 1
ES0 = 1; // enable UART0 interrupts
TX0_Ready = 1; // indicate TX ready for transmit
RX0_Ready = 0; // indicate RX string not ready
TX0_ptr = NULL;
}
void UART0_ISR (void) interrupt 4
{
static unsigned char TX0_index = 0; // send buffer index
unsigned char the_char0;
if (RI0 == 1)
{
RI0 = 0;
if (RX0_Ready == 0) //可以接收
{ the_char0 = SBUF0;
if(valid_cmd0[the_char0]==1)
{
switch(recv_state)
{
case fsa_init:
if(valid_cmd1[the_char0]==1) //有效命令
{
recv_state=fsa_data; //下一个状态
RX0_Buf[0]=the_char0;
j=0;
}
break;
case fsa_data: //数据
if(j>=RX0_LENGTH-1)
{
RX0_BufClear();
RX0_Ready=0;
recv_state=fsa_init; //帧长超过rlength,非法,返回初始状态
}
else
{
j=j+1;
if(the_char0==RX0_END ) //帧长不超过rlength,检测到帧尾,合法,返回初始状态
{
RX0_Buf[j]=the_char0;
RX0_Ready=1; //有合法命令,置需处理命令标志位为1
recv_state=fsa_init;
}
else
{
RX0_Buf[j]=the_char0;
RX0_Ready=0;
}
}
break;
default:
recv_state=fsa_init;
break;
}
}
else
{
}
}
else
{
; // ignore character -- previous message has not been processed
}
}
else if (TI0 == 1)
{
TI0 = 0; // clear TX complete indicator
the_char0 = *TX0_ptr; // read next character in string
if(TX0_index<SENDNUM0)
{
TX0_ptr++;
TX0_index++; // get ready for next character
SBUF0 = the_char0; // transmit it
}
else
{
TX0_Ready = 1; // indicate ready for next TX
TX0_index=0;
}
}
}
//------------------------------------------------------------------------------------
//RX0_BufClear()
//-----------------------------------------------------------------------------------
void RX0_BufClear(void)
{
unsigned char m;
for(m=0;m<RX0_LENGTH;m++)
{
RX0_Buf[m]=0x00;
}
}
//-----------------------------------------------------------------------------
//串口0发送一个字符串子程序
//入口函数 要发送的数组名称(指针),要发送的字符个数
//-----------------------------------------------------------------------------
void send_string_com(unsigned char *str,unsigned char strlen)
{
while (!TX0_Ready) ; // wait for transmitter to be available
TX0_Ready = 0; // claim transmitter
TX0_ptr = str; // set TX buffer pointer to point to
// received message
SENDNUM0=strlen;
TI0 = 1;
}
//-------------------------------------------------------------------------------------
//写FLASH
//-------------------------------------------------------------------------------------
void FlashWrite(unsigned char xdata *pwrite,unsigned char *BufFrom)
{
unsigned char i;
WDTCN = 0xde; // disable watchdog timer
WDTCN = 0xad;
EA=0;
FLSCL |= 0x01; // Enable FLASH writes/erases
PSCTL |= 0x03; // set PSWE = PSEE = 1
PSCTL |= 0x04; // set SFLE = 1 (enable
// access to scratchpad)
*pwrite = 0x00; // erase SCRATCH PAGE 该页被擦除
PSCTL &= ~0x07; // set PSWE = PSEE = SLFE = 0
PSCTL |= 0x01; // set PSWE = 1 写FLASH允许
for(i=0;i<2;i++)
{
PSCTL |= 0x04; // set SFLE to enable FLASH writes
// to Scratch Pad memory
*pwrite++=*BufFrom++;
PSCTL &= ~0x04; // set SFLE to enable FLASH writes
// to Scratch Pad memory
}
PSCTL &= ~0x07; // set PSWE = PSEE = SFLE = 0
FLSCL &= ~0x01; // clear FLWE to disable FLASH
// write/erases
EA=1;
}
//--------------------------------------------------------------------------------------
//读FLASH
//--------------------------------------------------------------------------------------
void FlashRead(unsigned char code *pread,unsigned char *BufTo)
{
unsigned char i;
for(i=0;i<2;i++)
{
PSCTL |= 0x04; // set SFLE to enable FLASH writes
// to Scratch Pad memory
BufTo[i]=*pread;
pread++;
PSCTL &= ~0x04; // clear SFLE to disable access
// to Scratch Pad memory
}
}
//--------------------------------------------------------------------------------------
//RX1_BufClear(void)
//--------------------------------------------------------------------------------------
void RX1_BufClear(void)
{
unsigned char m;
for(m=0;m<RX1_LENGTH;m++)
{
RX1_Buf[m]=0x00;
}
}
//---------------------------------------------------------------------------------------
//定时器T2初始化子程序
//---------------------------------------------------------------------------------------
void Timer2_Init(void)
{
TH2=0XB8;
TL2=0X00;
T2CON |=0X00; //T2定时器方式1,自动重装载
ET2=1; //定时器T2允许中断
}
//---------------------------------------------------------------------------------------
//定时器T2溢出中断处理子程序
//---------------------------------------------------------------------------------------
void Timer2_ISR(void) interrupt 5
{
TF2=0; /*定时器T2溢出标志零*/
tend2=temp2;
if(time2>=tend2)
{
TR2=0; //终止定时器T0
sendinterva2=1;
time2=0;
}
else
{
time2=time2+1;
sendinterva2=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -