问答

汇集网友智慧,解决技术难题

21ic问答首页 - 家人们,PIC串口通信的程序出问题了

嵌入式 单片机 串口通信 pic UART TE

家人们,PIC串口通信的程序出问题了

456135132021-09-10
刚学习PIC单片机的小白,用的dsPIC30f4011,程序是买板子送的,/*********************************************************************/
/*文件说明:uart发送接收*/
/*硬件配置:        MCU: DSPIC30F4011, OSC: 使用片外部4M16倍频64MHz振荡器..*/
/*版本: v1.0*/

/*使用说明:P7短路帽连接AN0,P6短路帽连接为AVDD AVSS提供标准电源*/
/*修改记录:*/
/********************************************************************/
#include "p30f4011.h"
#include "oled.h"
_FOSC(0XC307);//FCKSM = 11;时钟切换禁止 0111=带有16倍频PLL的XT??16倍频PLL使能的XT晶振模式 (晶振频率为4 MHz到10 MHz
_FWDT(0X0000);//关狗
_FBORPOR(0X3A3);//MCLREN禁止 欠压2.7V 上电延时64MS
_FGS(0X03);//
void UART_Init(void);
void UART1_TX(unsigned char c);
unsigned char UART1_RX(void);//接收数据
unsigned char Data;
void System_Init(void)//系统初始化
{
    OSCCON = 0x33e0;//主振荡器 新振荡器主振荡器 4MHz64分频 PLL锁定(使能)
        TRISB = 0x0000;
}
void UART_Init(void)
{
    U1MODE = 0x0000;//8位数据 无奇偶校验 1停止位
    U1MODEbits.UARTEN = 1;//使能UART
    U1STA = 0x0000;//状态和控制寄存器
    U1BRG = ((64000000/4/16)/9600)-1;//64MHz波特率9600(按照计算公式)
    IEC0bits.U1TXIE = 1;//发送中断允许
    IPC2bits.U1TXIP = 7;//发送中断优先级7
    U1STAbits.UTXEN = 1;// 使能发送
    IEC0bits.U1RXIE = 1;//接收中断允许
    IPC2bits.U1RXIP = 6;//接收中断优先级6
}
void UART1_TX(unsigned char TXData)//发送数据
{
    while (U1STAbits.UTXBF);
        U1TXREG = TXData;
}
unsigned char UART1_RX(void)//接收数据
{
    unsigned char RXData;
    while (!U1STAbits.URXDA);
        RXData = U1RXREG;
    return RXData;
}
void Delay_1ms(unsigned int t)//t = 1000大概1s
{
    unsigned int i,j;
    for(i = 0;i < t;i ++)
        for(j = 0;j < 100;j ++);
}

int main()
{
    System_Init();
    OLED_Init();                        //初始化OLED
    OLED_Clear();
    UART_Init();
    disn(4,0,55);disn(5,0,69);disn(6,0,76);disn(7,0,67);disn(8,0,79);disn(9,0,77);disn(10,0,69);//Welcome
  //  disn(1,1,36);disn(2,1,51);disn(3,1,48);disn(4,1,16);disn(5,1,45);disn(6,1,35);disn(7,1,53);

    while(1)
    {
        UART1_TX(UART1_RX());
        Data = UART1_RX();
        disn(4,1,Data/10000);disn(5,1,Data%10000/1000);disn(6,1,Data%1000/100);disn(7,1,Data%100/10);disn(8,1,Data%10);
    }
}
void __attribute__((__interrupt__, auto_psv)) _U1TXInterrupt(void)//发送中断
{
    IFS0bits.U1TXIF = 0;        //清中断标志
}
void __attribute__((__interrupt__, auto_psv)) _U1RXInterrupt(void)//接收中断
{
    IFS0bits.U1RXIF = 0; //清中断标志
}

最后的结果确实好像只能收发一个字节,收到1就能发1,但是收到123465这种一串就会出错,乱显示,如图:

请问各位大佬是哪里出错了呀程序,实在是找不到资料,找不到人问了

回答 +关注 20
3448人浏览 0人回答问题 分享 举报
0 个回答

您需要登录后才可以回复 登录 | 注册