21ic问答首页 - 家人们,PIC串口通信的程序出问题了
家人们,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这种一串就会出错,乱显示,如图:
请问各位大佬是哪里出错了呀程序,实在是找不到资料,找不到人问了
/*文件说明: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这种一串就会出错,乱显示,如图:
请问各位大佬是哪里出错了呀程序,实在是找不到资料,找不到人问了
您需要登录后才可以回复 登录 | 注册