51单片机串口通信
我想用单片机向电脑发送数据用串口调试助手观察 但我总是收到乱码,晶振是12M 波特率600
////////////////////////////////////////////////////////////////////////////////////////
#include <reg51.h>
#include <string.h>
unsigned char ch='a';
bit TX_flag= 0 ;
void init_serialcom( void ) //串口通信初始设定
{
SCON = 0x50 ; //UART为模式1,8位数据,允许接收
TMOD= 0x20 ; //定时器1为模式2,8位自动重装
PCON= 0x80 ; //SMOD=1;
TH1=TL1=0xcc ; //Baud:19200 fosc="12MHz
IE= 0x90 ; //Enable Serial Interrupt
TR1= 1 ; // timer 1 run
TI=1;
}
//向串口发送一个字符
void send_char_com( unsigned char ch)
{
SBUF=ch;
while (TI==0);
TI=0 ;
}
//串口接收中断函数
void serial () interrupt 4 using 3
{
if (TI)
{
TI = 0 ;
SBUF=ch;
TX_flag= 1 ; //就置位发送标志
}
}
main()
{
init_serialcom(); //初始化串口
while ( 1 )
{
if (TX_flag) //如果取数标志已置位,就将读到的数从串口发出
{
TX_flag= 0 ; //取数标志清0
send_char_com(ch);
}
}
}
[解决办法]
没有加奇偶校验吗?你加上校验之后再试试,还有你程序里说波特率设置成19200,你掉低些再试一下。
void init_serialcom( void ) //串口通信初始设定
{
SCON = 0x50 ; //UART为模式1,8位数据,允许接收
TMOD= 0x20 ; //定时器1为模式2,8位自动重装
PCON= 0x80 ; //SMOD=1;
TH1=TL1=0xcc ; //Baud:19200 fosc="12MHz ←←←←←←←←←←←←←←←
IE= 0x90 ; //Enable Serial Interrupt
TR1= 1 ; // timer 1 run
TI=1;
}
[解决办法]
你那串口中断里面的TI是发送中断标志啊
应该是这样的
if(RI){
ch=SBUF;
RI=0;
TX_flag= 1 ; //就置位发送标志
}