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外壳等金属时会有触电的感觉)
解决方法最简单的就是加一个光耦元件隔离电平。