首先用一个正确的程序试一下确保软件本身没有什么问题,
然后再依次检查波特率和VPB时钟频率是否匹配,因为它们不匹配的时候同样会出现乱码。
如果最后还是乱码的话,可能就是程序的问题了,需要检查程序是否有语法以外的错误。
自己今天下午调了一个串口发送字符串的程序,就是因为没有把波特率和VPB时钟频率匹配好,导致一直出现乱码
当 UART_BPS 设为9600,Fpclk 为(Fosc/4)*1时是正确的组合,
错误一:UART_BPS 设为9600,Fpclk为 (Fosc/4)*2,出现了乱码,
错误二:UART_BPS 设为115200,Fpclk 为(Fosc/4)*1,出现了乱码
错误三:UART_BPS 设为115200,Fpclk 为(Fosc/4)*2,出现了乱码
程序如下所示:
方法一:
#include
void UART1_Init(void);
void UART1_SendStr(char *Str);
void UART1_SendByte(char byte);
void delayn(unsigned long n);
#define UART_BPS 9600 //设置串口通信波特率
#define Fosc 12000000 //晶振频率
#define Fpclk (Fosc/4)*1 //VPB时钟频率,MD此处公式写错了,导致字符串显示不出
//UART1串口初始化
void UART1_Init(void)
{
//unsigned char Fdiv;
U1FCR=1; //FIFO使能
U1LCR=0x83; //使能访问除数锁存,8位字符长度,1个停止位,禁止奇偶产生和校验,
//Fdiv=(Fpclk/16)/UART_BPS; //设置波特率
U1DLL=Fpclk/(16*9600); //除数的底8位
U1DLM=(Fpclk/(16*9600))>>8; //除数的高8位
U1LCR=0x03; //禁止访问除数锁存器
}
//发送字符串
void UART1_SendStr(char *Str)
{
while((*Str)!='') //遇到结束符,退出
{
UART1_SendByte(*Str); //发送数据
Str++;
}
}
//发送单个字符
void UART1_SendByte(char byte)
{
while((U1LSR&0x20)==0); //等待数据发送完毕
U1THR=byte; //写入数据
}
//延时函数
void delayn(unsigned long n)
{
while(n--);
}
int main(void)
{
PINSEL0=0x00050000; //P0.8,P0.9选择UART0
UART1_Init(); //UART1串口初始化
while(1)
{
UART1_SendStr("UART1 TEST.n");
delayn(100000);
}
}
方法二:
#include
void UART1_Init(void);
void UART1_SendStr(char *Str);
void UART1_SendByte(char byte);
void delayn(unsigned long n);
#define UART_BPS 9600 //设置串口通信波特率
#define Fosc 12000000 //晶振频率
//#define Fcclk (Fosc*4) //系统频率
#define Fpclk (Fosc/4)*1 //VPB时钟频率,MD此处公式写错了,导致字符串显示不出
//unsigned char Fdiv;
typedef unsigned short U16;
/*************************串口1初始化******************************************/
void UART1_Init ()
{
U16 Fdiv;
U0LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv =(Fpclk/16)/UART_BPS;
U0DLL = Fdiv%256;
U0DLM = Fdiv/256;
U0LCR = 0x03;
}
//发送字符串
void UART1_SendStr(char *Str)
{
while((*Str)!='') //遇到结束符,退出
{
UART1_SendByte(*Str); //发送数据
Str++;
}
}
//发送单个字符
void UART1_SendByte(char byte)
{
while((U1LSR&0x20)==0); //等待数据发送完毕
U1THR=byte; //写入数据
}
//延时函数
void delayn(unsigned long n)
{
while(n--);
}
int main(void)
{
PINSEL0=0x00050000; //P0.8,P0.9选择UART0
UART1_Init(); //UART1串口初始化
while(1)
{
UART1_SendStr("xiao mu lang shi ge da duan dan.hahan");
delayn(1000000);
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』