📄 uart1_int1.c
字号:
p5pan=RX0_Buf[3];
firstoff17_20=p5pan;
p5pas=~((~p5pas)|p5pan);
P5=p5pas;
hkqg17_20=1;
TR2=1;
RX0_Ready=0;
break;
default:
RX0_Ready=0;
}
RX0_BufClear();
}
//---------------------------------------------------------------------------------------
if(sendinterva2)
{
sendinterva2=0;
if(qkhg1_16)
{
p7pas=firstoff1_8;
p6pas=firstoff9_16;
p7pas=p7pas<<1;
p6pas=p6pas<<1;
P7=p7pas;
P6=p6pas;
qkhg1_16=0;
}
if(hkqg1_16)
{
p7pas=firstoff1_8;
p6pas=firstoff9_16;
p7pas=p7pas>>1;
p6pas=p6pas>>1;
P7=p7pas;
P6=p6pas;
hkqg1_16=0;
}
if(qkhg17_20)
{
p5pas=firstoff17_20;
p5pas=p5pas<<1;
P5=p5pas;
qkhg17_20=0;
}
if(hkqg17_20)
{
p5pas=firstoff17_20;
p5pas=p5pas>>1;
P5=p5pas;
hkqg17_20=0;
}
}
//--------------------------------------------------------------------------------------
if(cdma) //定时采集开
{
if(sendinterval) //间隔采集定时时间到
{
if(addr>=addh) //到最后一个地址
{
cgqsend(addr);
addr=addl;
addend=1; //addend=1,发送到最后一个地址
sendinterval=0;
TR0=1;
}
else //没到最后一个地址
{
cgqsend(addr);
addr=addr+1;
addend=0; //addend=1,发送到最后一个地址
sendinterval=0;
TR0=1;
}
}
}
//---------------------------------------------------------------------------------------
if(RX1_Ready == 1)
{
unsigned char e;
for (e=0;e<RECEIVENUM1;e++)
{
if(RX1_Buf[e]!=0x0d)
{
if(RX1_Buf[e]==0x05)
{
ardata[packge]=RX1_Buf[e]+RX1_Buf[e+1];
packge=packge+1;
e=e+1;
}
else
{
ardata[packge]=RX1_Buf[e];
packge=packge+1;
}
}
else
{
ardata[packge]=RX1_Buf[e];
packge=packge+1;
}
}
//ardata[packge]=0x0d;
/*
while (!TX0_Ready) ; // wait for transmitter to be available
TX0_Ready = 0; // claim transmitter
TX0_ptr = ardata; // set TX buffer pointer to point to
SENDNUM0=packge+1;
TI0 = 1;
packge=0;
*/
//
if(RX1_Buf[1]==addh)//收到最后一个地址数据了吗
{
if(RX1_Buf[4]>=0x80) //需要发送确认命令吗
{
cgqqrsend(RX1_Buf[1],RX1_Buf[4]);
addrnd=0;
}
else
{
P4=0xff;
//status[9]=P4;
//unsigned char i;
//ReadStatus();
//for(i=0;i<12;i++)
//{
ardata[packge]=P4;
packge++;
// }
addrnd=1;
}
}
else
{
addrnd=0;
} //
RX1_BufClear();
RX1_Ready = 0;
}
//将打包的数据发往总控中心
if((addend==1 || addrnd==1))
// if(addrnd==1)
{
while (!TX0_Ready) ; // wait for transmitter to be available
TX0_Ready = 0; // claim transmitter
TX0_ptr = ardata; // set TX buffer pointer to point to
SENDNUM0=packge;
TI0 = 1;
packge=0;
//设置相应标志位
//下一次打包开始
addend=0;
addrnd=0;
}
//---------------------------------------------------------------------------------------
}
}
//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
//
// This routine initializes the system clock to use an 22.1184MHz crystal
// as its clock source.
//
void SYSCLK_Init (void)
{
int i; // delay counter
OSCXCN = 0x67; // start external oscillator with
// 22.1184MHz crystal
for (i=0; i < 256; i++) ; // wait for crystal osc. to start up
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
// source and enable missing clock
// detector
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports
//
void PORT_Init (void)
{
XBR0 = 0x05; // Enable UART0
XBR1 = 0x00;
XBR2 = 0x44; // Enable crossbar and weak pull-ups
P0MDOUT |= 0x11; // enable TX0 as a push-pull output
P2MDOUT |= 0x03; // enable P2 as push-pull output
P74OUT |=0Xf4;
}
//-----------------------------------------------------------------------------
// UART1_Init
//-----------------------------------------------------------------------------
//
// Configure UART1 using Timer1, for <baudrate> and 8-N-1.
//
void UART1_Init (void)
{
SCON1 |= 0xd0; // SCON1: mode 1, 8-bit UART, enable RX
T4CON |=0X30; // Stop Timer; clear int flags; enable
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
if(even[the_char]==0)
SCON1 &= ~0x08;
else
SCON1|= 0x08;
SBUF1 = the_char; // transmit it
}
else
{
TX1_Ready = 1; // indicate ready for next TX
TX1_index=0;
RE485=0;
}
}
}
/*
//--------------------------------------------------------------------------------------------
//串口通过485向传感器发送命令子程序,addr为传感器地址
//--------------------------------------------------------------------------------------------
void cgqsend(unsigned char addr)
{
unsigned char Cd[6];
unsigned char SendCd[7];
unsigned char r,s;
Cd[0]=0X7E;
Cd[1]=addr;
Cd[2]=0xff-addr+1;
Cd[3]=0x50;
Cd[4]=(0XFF-(Cd[1]+Cd[2]+Cd[3]))+1;
Cd[5]=0X0D;
r=0;
for(s=0;s<6;s++)
{
if(s!=5)
{
if((Cd[s]==0X0D)||(Cd[s]==0X05)) //如果Cd[s]=13或5,则拆分/
{
SendCd[r]=0x05;
r=r+1;
SendCd[r]=Cd[s]-0x05;
r=r+1;
}
else
{
SendCd[r]=Cd[s];
r=r+1;
}
}
else
{
SendCd[r]=0X0D;
}
}
while (!TX1_Ready); // wait for TX ready
TX1_Ready = 0; // claim transmitter
TX1_ptr = SendCd; // set buffer pointer
SENDNUM1=r+1;
RE485=1;
SCON1 |= 0x02; // TI1 = 1; start transmit
} */
//定时器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)
{
TL0=0X00; /*11.0592MHZ T0低8位初值:定时10ms*/
TH0=0XB8; /*T0高8位初值*/
TR0=0; /*终止定时器T0*/
sendinterval=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -