打印

pic18f25k22 串口可以发数据,但是从pc发的数据单片机不识别

[复制链接]
2680|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ad25fgh30|  楼主 | 2013-7-9 15:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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;
                }
        }
}

读取和发送的中断函数


请大神帮忙啊,,着急啊
沙发
wolfdong7| | 2013-8-15 17:26 | 只看该作者
我也遇到这样的问题,LZ解决了吗?

使用特权

评论回复
板凳
ygl968| | 2013-8-15 17:28 | 只看该作者
mark

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

35

帖子

0

粉丝