当前位置: 代码迷 >> 单片机 >> 使用Proteus仿真AT89C51的串口时,发送数据正常,可是如何也接收不到数据吗,咋回事
  详细解决方案

使用Proteus仿真AT89C51的串口时,发送数据正常,可是如何也接收不到数据吗,咋回事

热度:126   发布时间:2016-04-28 16:30:11.0
使用Proteus仿真AT89C51的串口时,发送数据正常,可是怎么也接收不到数据吗,怎么回事!
我使用串口虚拟软件虚拟了一对物理上连通的串口COM3, COM4,在Proteus里面的COMPIM里面使用的是COM3,在串口调试助手里面使用的是COM4.当单片机给PC的COM4发送数据时,串口调试助手上面正常接收并显示到接收文本框里。
但是,当使用串口调试助手向Proteus里面的虚拟部分发送数据时,Proteus里面没有任何反应,我在Proteus里面使用示波器测量了一下,当PC的串口调试助手向下发送数据时,示波器里面有波形的变化,单片机就是不做任何反应,这个是为什么呢!代码是Copy的网上的!
C/C++ code
#include <reg51.h>#include "type_wb.h"#include "hd44780.h"#define   BUFFERLEGTH 10//-----------------------------void UART_init();                //串口初始化函数void COM_send(void);             //串口发送函数char str[20]="hello\r\n";//-------------------------------void main(void){    unsigned char i;    UART_init();        //初始化串口    Init_HD44780();    LCD_puts( 0, 0, "ALL Init 1", 10 );    for(i = 0;i < 10 ;i++)    {           COM_send();        //首先发送一次数据作为测试用    }    while(1);}//-------------------------//--------------------------------------------------------------// 函数名称: UART_init()串口初始化函数// 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s//             串口接收中断允许,发送中断禁止//--------------------------------------------------------------void UART_init(){                      //初始化串行口和波特率发生器    SCON =0x50;           //选择串口工作方式1,打开接收允许    TMOD =0x20;           //定时器1工作在方式2,定时器0工作在方式1    TH1 =0xfA;            //实现波特率9600(系统时钟11.0592MHZ)    PCON = 0x80;    TR1 =1;               //启动定时器T1    ET1 =0;    ES=1;                 //允许串行口中断    PS=1;                 //设计串行口中断优先级    EA =1;                //单片机中断允许}//------------------------void COM_send(void){    unsigned char point = 0;    for(point=0;point< 20;point++)       //连续发送二十位数据                                      //把缓存区的数据都发送到串口       {        SBUF=str[point];        while(!TI);        TI=0;    }}//--------------------------//--------------------------------------------------------------// 函数名称: com_interrup()串口接收中断处理函数// 函数功能: 接收包括起始位'S'在内的十位数据到数据缓冲区//--------------------------------------------------------------void com_interrupt(void) interrupt 4 using 3{   unsigned char RECEIVR_buffer;   if(RI)                                 //处理接收中断   {      RI=0;                                 //清除中断标志位      RECEIVR_buffer=SBUF;             //接收串口数据      LCD_puts( 1, 0, "data arrive", 11 );      if (RECEIVR_buffer == 's')      {         SCON =0x40;     //接收不允许         COM_send();     //发送数据         SCON =0x50;     //接收允许      }    }}


------解决方案--------------------
可能是COM口的问题吧