void init_usart(void)
{
SPBRGH1 = 0;
SPBRG1 = 0x67; // 9600 (100) 2012.2 (103)
BAUDCON1bits.BRG16 = 0; /////////afei
BAUDCON1= 0X42;
TXSTA1 = 0b00000110; //异步、8位、无校验、使能发送 发送将字符位?? BRGH=1高速 SYNC=0异步 // dis TXEN
RCSTA1 = 0b10010000; //接收使能
IPR1bits.RC1IP = 1; // 优先级low
IPR1bits.TX1IP = 0;
PIE1bits.RC1IE = 1; //
PIR1bits.RC1IF = 0;
rx_cnt=0;
dis_485(); //1011 1111 = .> 1111 0111
// en_485();
PORTCbits.RC5=0;
rx1_cnt=0;
rx1_time2=CntMSec;
}
这是串口的初始化
void receive_frame(void)
{
tx_time=CntMSec;
// dis_485();
en_485();
PIE1bits.TX1IE = 0; //关发送中断
PIR1bits.TX1IF = 0;
TXSTA1bits.TXEN = 0;
TXSTA1bits.SYNC = 0;
RCSTA1bits.SPEN = 1;
PIR1bits.RC1IF = 1;
PIE1bits.RC1IE = 1; //开接收中断 /// 2010 25k20 UCSR0B&=~(1<<RXCIE);
RCSTA1bits.CREN = 1;
rx_cnt=0;
if(RCSTA1bits.OERR==1)
{
RCSTA1bits.CREN=0;
}
}
这是读取的设置
#pragma interruptlow InterruptServiceLow //nosave=section(".tmpdata") //save=section(".tmpdata") nosave=section("isr_tmp")// nosave=section(".tmpdata")// "interruptlow" pragma for low priority
void InterruptServiceLow(void)
{
/****************** PORTB change **********************/
/****************** PORTB change **********************/
if(INTCONbits.RBIF)
{
if(INT_time==0) //一个字节第一个下降沿中断,起始位开始 &&(count!=0)
{
pre_count=count;
rx1_time=count;
rx1_data=0xff;//接收的数据初值
j=0; //位数清零
INT_time++;//中断次数加一
rx1_bit=0;
rx_start=1;
initimes=1;
}
else
{
temp1=count;
temp2=(uint16_t)(temp1-pre_count);//取一个高/低电平的宽度 temp1
initimes++;
if(INT_time==1)
{
test=temp2;
}
if(temp2>2) // 2 //滤过窄电平(干扰信号)
{
pre_count=temp1;//记录前一次的时间值
bit_temp=0; // 此后,temp1作为bit计数
while(temp2>7)// 8个为1位 // 计算位的个数,约13为一个位(8*13=104uS)
{
// rx1_bit+=1;
temp2-=8;//
bit_temp+=1;
}
if(temp2>2) //2 // 3
{
bit_temp+=1;//计算位的个数,一般13为一个位
// rx1_bit+=1;
}
if(INT_time==1)
{
bit_temp-=1;
}
if((INT_time&0x01)!=0)//奇数次中断
{
while(bit_temp!=0)//位0的个数
{
rx1_data&=(~(0x01<<j));
bit_temp-=1;
j+=1;
rx1_bit+=1;
}
}
else
{
j+=bit_temp;//偶数,位1的个数,跳过
rx1_bit+=bit_temp;
}
INT_time+=1;//中断次数加一
}
if(rx1_bit>=8) // 起始位1 bit //9
{
rx1_temp=rx1_data;
byte_ready=1;
INT_time=0;
rx_start=0;
rx1_buf[rx1_cnt]=rx1_temp; // 8bit s时,rx1_data (rx1_temp 错误)
rx1_cnt=((rx1_cnt+1)&0x1f);
rx1_time2=CntMSec;
rx1_time=count;
}
}
rtimes=0; // 间隔字节个数
rtimes=PORTB;
INTCONbits.RBIF=0;
INTCONbits.RBIE=1; //
}
// 串口接收中断
if (PIR1bits.RC1IF) ////////afei
{
c=RCREG1; // 25k20 读取RCREG时,清零中断标志RCIF; 另:发送:TXREG
rx_buf[rx_cnt]=c;
rx_cnt=(rx_cnt+1)&0x1f;
rx_time=CntMSec;
PIR1bits.RC1IF = 0;
}
// 串口发送中断
if (PIR1bits.TX1IF)
{
if(PIE1bits.TX1IE)
{
if (tx_cnt==(tx_len+1)) //(tx_len+1) (tx_len+1) ???(tx_len+1) 2010.7.8 (tx_len+1)
{
dis_485();
PIR1bits.RC1IF = 0; // UCSR0A&=~(1<<RXC); //清接收中断请求 // 25k20
PIE1bits.RC1IE = 1; // UCSR0B|=(1<<RXCIE); //开接收中断 // 25k20
RCSTA1bits.CREN = 1; // 2010.8.9
PIE1bits.TX1IE = 0;
TXSTA1bits.TXEN = 0;
tx_cnt=0; // 2010 6.17
PORTCbits.RC6 = 1;//2010.7.15
tx_len=0; // 2010.7.15
}
else
{
TXREG1=tx_buf[tx_cnt]; // 25k20 原UDR0,不对
tx_cnt++;
}
tx_time=CntMSec;
}
}
}
读取和发送的中断函数
请大神帮忙啊,,着急啊 |