PIC18F4520串口通信

2020-02-09 09:25发布

各位大大们,求个问题。
用的是PIC18F4520,串口设置和初始化如下程序。目的是从PC串口发一个字节到单片机接收,单片机回复所接收的数据。但发现用ICD3仿真调试,数据字节可以回来。比如:发个0x55,回来也是0X55。但我把程序烧到单片机里面运行的时候,发个数据。第一个回来是正确的,再发一个,回来后就都变成0XFF啦。重新上电,再发,也是第一次对着。后来就都成了0XFF啦。百思不得其解,望哪位PIC高手给指点一下。谢谢!!!
#include"Ask_I_O.H"
#include"AskFun.H"
#include"ODU_DEF.H"
__CONFIG(1,HS&FCMDIS&IESODIS);                                               //外部高频晶振
__CONFIG(2,WDTDIS&PWRTEN & BOREN & BORV42&WDTPS256);        //上电延时,欠压复位,4.2V复位
__CONFIG(3,MCLRDIS & LPT1DIS & PBADDIS);                                //MCLR使能,定时器1晶振关闭,PORTB<4:0>作IO口
__CONFIG(4,DEBUGDIS & LVPDIS & STVREN & XINSTDIS);                //堆栈溢出复位,禁止低压编程,禁止调试
__CONFIG(5,CPD);                                                                               //保护EEPROM
main()
{
        UINT8        rssivalue=0;
        UINT16        kk=0;
           asm("NOP");
        McuInitial();
        while(kk<50000)
        {
                asm("NOP");
                kk++;
        }                                                                        
        Set_Tx(1625);//发送频率设置211.137.130.19-3
        Set_Rx(1415);//接收频率设置
        Set_LO(3140);//中频设置
        Set_LO(3140);
        T_R=0;TXEN=1;
        while(1);
}
void UartInitial(void)
{
           TXSTA=0X00;      //八位数据发送,异步低速主控模式
           RCSTA=0X90;      //八位数据接收,连续接收
           BAUDCON=0X40;    //8位波特率产生器
        SPBRG=17;        //波特率9600;spbrg=Fosc/(64*baudrate)-1
}
void McuInitial(void)
{
        di();  
           SPEN=0;                         //使能串口
           TRISA=0X2F;       //RA0,RA1,RA2,RA3输入
        TRISB=0X00;       //RB2,RB3,RB4,RB5输出
           TRISC=0X98;       //RC7,RC3,RC4输入,RC6输出
           TRISD=0X00;       //输出
           TRISE=0X03;       //RE0,RE1,RE2输入
           INTCON=0X40;       //允许第二梯队中断
  
          
               
        POR=1;
           BOR=1;   
           IPEN=0;           //禁止中断优先级
           PIE1=0X00;        
           PIE2=0X00;        
           TXIE=1;           //允许发送中断
           RCIE=1;           //允许接收中断
           TMR1IE=1;         //允许TMR1中断
           PIR1=0X00;           //清中断标志
           PIR2=0X00;           //清中断标志   
          UartInitial();
          ei();
}
UINT8 Bufdata;
void interrupt SerialAndTimer1(void)
{
       
        if(TXIF==1)                                                                       
           {
                     TXEN=0;
                return ;
        }
           if(RCIF==1)                                                                               
          {
                Bufdata=RCREG;                                                               
                     TXEN=1;
                TXREG=Bufdata;
                return ;
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
lcq007
2020-02-09 18:49
回复【2楼】york_zhao  
-----------------------------------------------------------------------

"TXIF的值和TXEN是一致的"这是你自己的理解吧?一般来说清中断有读和些两种方式,就是读或者写指定的状态寄存器,跟使能位没关系吧

一周热门 更多>