当前位置:首页>科技>正文

51单片机串口通信过程 51单片机串口通信

2023-05-06 08:53:13 互联网 未知 科技

 51单片机串口通信过程 51单片机串口通信

51单片机串口通信过程

单片机的串口本身就已是一个功能完备的外设部件了。你程序里只需向SBUF写入一个字节,一位一位发送的事情串口自己会执行,不需要干预。等发送完成,串口会将TI置位向你的程序报告,请求进一步的处理,TI就是起一个报告的作用,而不是别的。
51单片机的结构决定了你不可能发送数据时只发送一位,你必须一次向SBUF写一个字节(8bit,即使你只使用其中1个bit)的数据。
建议你先多了解一些硬件的知识,这对学习单片机很有帮助。从你的问题来看,个人感觉稍显外行。

51单片机串口通信

51单片机是通过SBUF这个串口专用寄存器和串口模块来收发数据的。发送时,只要将数据送入到SBUF,等等TI状态到1就发送完毕。同样接收时,RI为1,那么说明SBUF接收完毕一帧数据,可以直接从SBUF读取数据了。

利用串口,51单片机与电脑间的通信怎么做?

用UART异步串行通信方式
51串行口有4种工作方式,在串行口的4种工作方式中,方式0主要用于扩展并行I/O口,方式1、2、3则主要用于串行通信。
PC机的串行接口为RS232形式的接口,其高低电平的规定与单片机所规定的TTL电平不同,所以单片机上也必须有232接口,可直接选用232接口芯片例如MAX232,还要准备"串口调试助手"这一软件。
MAX232是一个电平转换芯片。单片机的TXD端接MAX232的11脚,RXD端接MAX232的12脚。电脑上RS232的2脚接MAX232的14脚,3脚接MAX232的13脚,RS232的5脚接地。

51单片机和计算机之间实现串口通信的电路图

串口通讯参考程序如下:

来源:深入浅出AVR单片机

#include

unsigned char UART_RX //定义串口接收数据变量

unsigned char RX_flag //定义穿行接收标记

/*********************************************************************************************

函数名:UART串口初始化函数

调  用:UART_init()

参  数:无

返回值:无

结  果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)

备  注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]

/**********************************************************************************************/

void UART_init (void){

 EA = 1 //允许总中断(如不使用中断,可用//屏蔽)

 ES = 1 //允许UART串口的中断

 TMOD = 0x20 //定时器T/C1工作方式2

 SCON = 0x50 //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)

 TH1 = 0xF3 //定时器初值高8位设置

 TL1 = 0xF3 //定时器初值低8位设置

 PCON = 0x80 //波特率倍频(屏蔽本句波特率为2400)

 TR1 = 1 //定时器启动    

}

/**********************************************************************************************/

/*********************************************************************************************

函数名:UART串口接收中断处理函数

调  用:[SBUF收到数据后中断处理]

参  数:无

返回值:无

结  果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)

备  注:过长的处理程序会影响后面数据的接收

/**********************************************************************************************/

void UART_R (void) interrupt 4  using 1{ //切换寄存器组到1

 RI = 0   //令接收中断标志位为0(软件清零)

 UART_RX = SBUF //将接收到的数据送入变量 UART_data

 RX_flag=1  //标记接收

 //用户函数内容(用户可使用UART_data做数据处理)

 //SBUF = UART_data //将接收的数据发送回去(删除//即生效)

 //while(TI == 0) //检查发送中断标志位

 //TI = 0  //令发送中断标志位为0(软件清零)

/**********************************************************************************************/

/*********************************************************************************************

函数名:UART串口发送函数

调  用:UART_T (?)

参  数:需要UART串口发送的数据(8位/1字节)

返回值:无 

结  果:将参数中的数据发送给UART串口,确认发送完成后退出,采用非中断方式

备  注:

/**********************************************************************************************/

void UART_T (unsigned char UART_data){ //定义串口发送数据变量

 ES=0    //禁止穿行中断

 SBUF = UART_data //将接收的数据发送回去

 while(TI == 0)  //检查发送中断标志位

 TI = 0   //令发送中断标志位为0(软件清零)

 ES=1   //打开穿行中断

}

/*********************************************************************************************

函数名:UART串口发送字符串函数

调  用:UART_S (?)

参  数:需要UART串口发送的数据(8位/1字节)

返回值:无 

结  果:将参数中的数据发送给UART串口,确认发送完成后退出,采用非中断方式

备  注:

/**********************************************************************************************/

void UART_S(unsigned char *str)

{

 while(1)

 {

  if(*str==) break

  UART_T(*str )

 }

}

/*********************************************************************************************

函数名:主函数

调  用:main()

参  数:

返回值:无 

结  果:

备  注:

/**********************************************************************************************/

void main()

{

 unsigned char Buf_data[]={"      welcome to MCU world.      "}

 UART_init()

 UART_S(Buf_data)

 while(1){

  if(RX_flag==1)

  {

   UART_T(UART_RX)

   RX_flag=0

  }

 }

祝愿楼主马到功成

串口通信导致51单片机复位?

如果是RS232接口的串口,检查一下MAX232转换芯片是否损坏。
因为RS232串口电平最大范围是-15V到 15V,单片机是5V的绝对受不了的。
如果由于某些原因导致MAX232击穿或者损坏就会导致±15V直接加到单片机IO上。
这样就会造成单片机重启。

如果并不是RS232接口而是TTL串口的话。在没有共地的情况下也会由于静电的原因导致单片机重启(例如:有些笔记本电脑并没有连接到3孔插座当手触碰到USB外壳等金属时会有触电的感觉)

解决方法最简单的就是加一个光耦元件隔离电平。