打印
[51单片机]

51单片机串口通信

[复制链接]
1559|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ace2050|  楼主 | 2013-10-15 13:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,新手,单片机AT89S52,实现与上位机的通信,现在测试程序主要功能是用上位机向单片机发送数据,单片机再将数据返回,用的串口猎人。
程序如下
#include <AT89X51.h>
#include <target.h>
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 <target.h>
/*****************************************************************************************************
*函数名称: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<len;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
哪位高人有类似的参考程序,谢谢了

相关帖子

沙发
ayb_ice| | 2013-10-15 14:08 | 只看该作者
上位机是按一下发送就发一个字节数据吗

使用特权

评论回复
板凳
NE5532| | 2013-10-15 14:23 | 只看该作者
先调单片机向上位机发送,再调接收,动下脑筋想想为什么要这样调。

使用特权

评论回复
地板
追梦人_梦| | 2013-10-16 22:44 | 只看该作者
接收最好在中断中进行因为用函数可能导致接收数据出现类似问题

使用特权

评论回复
5
xiaoyigechaos| | 2013-10-18 21:27 | 只看该作者
看程序 感觉没有什么问题呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

33

帖子

0

粉丝