微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机串口通信

51单片机串口通信

时间:10-02 整理:3721RD 点击:
51单片机串口通信大家好,新手,单片机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
哪位高人有类似的参考程序,谢谢了

在线等啊

在线等啊

你的程序里没有串口中断处理程序吗?再就是串口助手发送的时候选择十六进制发送。

这个程序把串口中断关了哦 还不知道怎么用中断了

你这样不是用串口中断的方法,还是用函数的方法来控制串口。找一本单片机的书看看吧,看看里面是怎么用串口中断的。加油!

非常感谢已经解决了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top