[求助] 51单片机串口通信

ace2050   2013-10-15 11:36 楼主
大家好,新手,单片机AT89S52,实现与上位机的通信,现在测试程序主要功能是用上位机向单片机发送数据,单片机再将数据返回,用的串口猎人。
程序如下
#include
#include
void delay_us(unsigned int us);

void main()
{
uchar buffer;
usart0_initial();
while(1)
{
delay_us(10);
buffer=get_char();  //读取上位机数据
delay_us(10);
send_char(buffer);  //发送数据至上位机
  }
  }
/*****************************************************************************************************
*函数名称:delay_us(unsigned int us)
*函数功能:微秒级延时函数
*函数入口:us
*函数出口:无
******************************************************************************************************/
void delay_us(unsigned int us)
{
uchar delayi;
while(--us)
{
  for(delayi=0;delayi<10;delayi++);
  }
  }

#define TARGET_GLOBAL 1
#include
/*****************************************************************************************************
*函数名称:usart0_Inital(void)
*函数功能:初始化串口
*入口函数:无
*出口函数:无
******************************************************************************************************/
void usart0_Initial(void)
{/*************************************TH1=256-(K*oscFreq)/384*BaudRate*********/
  SCON=0x50;//SM0=0;SM1=1;REN=1,工作于方式1,允许接受数据,因为SCON存在位地址,可以进行位操作
  TI=0;//发送中断标志位清零,准备数据发送
  RI=0;//接受中断标志位清零,准备数据接收
  PCON=0; //波特率不加倍
  TH1=0xf3;//bode=2400
  TL1=0xf3;
  TMOD=0x20;  //设定定时器1工作于方式2,即自动重载8位定时器
  ET1=0;   //关闭定时器1中断
  TR1=1;   //启动定时器1,因为TCON寄存器存在位地址,可以进行位操作
  ES=0; //关闭串行口中断,因为IE寄存器存在位地址,可以进行位操作
  }
/*****************************************************************************************
*函数名称: send_char(uchar txd)
*函数功能: 串口发送一个字符
*入口函数: 要发送的一个字符 txd
*出口函数: 无
*******************************************************************************************/
void send_char(uchar txd)
{
   TI=0;
   SBUF=txd;
   while(!TI);  //等待数据传送
   TI=0;   //清除数据传送标志
   }
/*******************************************************************************************
*函数名称:send_str(uchar *str, uchar len)
*函数功能:串口发送一行字符串
*函数入口:字符串指针*str,字符串长度len
*函数出口:无
********************************************************************************************/
void send_str(uchar*str, uchar len)
{
   uchar i;
   for(i=0;i    send_char(str);

}
/**********************************************************************************************
*函数名称:get_char(void)
*函数功能:串口接收一个字符
*函数入口:串口接收的字符?rxd?
*函数出口:无
*************************************************************************************************/
uchar get_char(void)
{
   uchar temp;
   RI=0;//接受中断标志位清零,准备数据接收
   while(!RI); //等待上位机传送数据
   temp=SBUF; //从缓冲寄存器中读取数据,接受到8位数据时,RI会自动置1
   RI=0;   //接受中断标志位清零,准备下一次的数据接收
   return temp;


发现在收发的过程中会出现错误,上位机对单片机发01,单片机返回的数值有时变成81 而且没有规律可循!
另外我现在想用串口实现单片机对上位机的数据传送
功能就是,当串口连上上位机后,就自动向上位机传送数据,希望能尽量避免数据错误或丢失。希望有校验功能 我的用的是MAX232D
哪位高人有类似的参考程序,谢谢了

回复评论 (1)

问题分析

我看一下,你使用的是2400,我建议不要使用2400波特率,最好使用工业标准的9600,并对单片机使用晶振最好11.0592M(这也工业标准频率),若还是不行,软件仿真一下。
点赞  2013-10-18 13:31
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复