串口调试助手发送给51单片机的数据无显示?

调试助手界面上接收端没有显示在发送端发送的数据。不知道到底是什么原因??有大神知道话求帮忙啊!!

#include <reg52.h> //单片机52头文件,存放着单片机的寄存器
#include <stdio.h>
#define uint unsigned int //宏定义
#define uchar unsigned char

uchar uart_flag,a,i;
uchar code table[]={"$>0053.5p,-.80507,0,00.00u,2,00.00u,2,000.0u,2,000.0u,2,12210005332210<$"};

void UART_Init(void); //声明串口初始化函数
void UART_Send_Byte(uchar byte); //声明串口发送单字节函数
void SendAll(uchar *value); //声明串口发送一组数据函数
void Delay(uint delay_time); //声明延时函数

void main(void) //主函数
{

UART_Init(); // 串口初始化
while(1) //死循环
{
// SendAll(table);
// Delay(1000);
if(uart_flag==1) //接收到串口数据
{
ES=0; //关串口中断
UART_Send_Byte(a); //发送接收到的字符
ES=1; //允许串口中断
uart_flag=0; //中断标志位置0
}
}
}

//定义UART_Init函数
void UART_Init(void)
{
SCON = 0x50; // 设定串行口工作方式,8位数据位,允许接收
T2CON = 0x34; //设置定时器2,作为波特率发生器
RCAP2L = 0XD9; //9600波特率的低8位
RCAP2H = 0XFF; //9600波特率的高8位

ES = 1; //允许串口中断
EA = 1; //允许总中断
REN=1; //串口是否接收数据的开关
TR1=1; //启动定时器
}

//定义UART_Send_Byte函数
void UART_Send_Byte(uchar byte)
{
SBUF=byte; //缓冲区装载要发送的字节数据
while(TI==0){}; //等待发送完毕,TI标志位会置1
TI=0; //清零发送完成标志位
}

//定义SendAll函数
void SendAll(uchar *value)
{
while((*value) != '\0') //如果没有发送完毕就继续发
{
UART_Send_Byte(*value); //发送1字节数据
value++; //指向下1个字节
}
}

//定义Delay延时函数
void Delay(uint delay_time)
{
uint j,k;
for(j=0;j<delay_time;j++);
for(k=0;k<50000;k++)
{}
}

//串口接收中断服务程序
void UART(void) interrupt 4
{
if(RI) //检测接收完成标志位置1
{
RI = 0; //清零接收完成标志位
a=SBUF; //读取接收到的数据
uart_flag = 1; //中断标志位置1
}
}

第1个回答  2014-02-28

楼主做的是Proteus仿真吧?有没有用虚拟串口呢?如果没有的话请参考我的附图。

追问

嗯,有用到虚拟串口的呢,不过问题解决了,谢谢哈~~

第2个回答  2014-09-04
楼主!我用的是protues 和虚拟串口加串口调试助手仿真的,你的这个问题是怎么解决的,我现在是串口调试助手发送数据给单片机,单片机没反应。帮忙看看那儿的问题。这是我的程序,
#include <reg51.h>
#include <string.h>
#define INBUF_LEN 4 //数据长度
unsigned char inbuf1[INBUF_LEN];
unsigned char checksum,count3;
int flag= 0 ;
char a;

void InitUART (void)
{ TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
EA = 1; //打开总中断
PS=1; //设计串行口中断优先级
ES = 1; //打开串口中断
}
void main()
{
int Temp;
InitUART();
while(1)
{
if(RI)
{
Temp=SBUF;
P1=Temp^0xFF;//求反,LED灯亮的为1不亮为0
RI=0;
}
}}
第3个回答  2014-02-25
使用串口收发数据时的晶振不能是12M的,必须换成11.0592的那个,都则数据发送全部失真。你可以试试。追问

proteus仿真中C52单片机默认的晶振是12M,要改为11.0592M?

追答

你是做实物还是在仿真啊,仿真有很多情况与实际是有出入的,实际使用时这个是必须要换的,否则数据时错误的,乱码,软件仿真中也许都行,不是那么严谨,但是实际中查那么一点是不行的

追问

问题解决了,谢谢大家哈~~

第4个回答  2014-02-24
把串口调试助手那个自动清空的复选框勾掉!!!
看看好用不?有问题继续问!追问

自动清空选择框勾选是满屏后清空,够不勾选对存在问题无关紧要。帮我看看是程序问题么?

追答

RCAP2L = 0XD9; //9600波特率的低8位
RCAP2H = 0XFF; //9600波特率的高8位
51单片机里面有这个寄存器吗?

ES = 1; //允许串口中断
EA = 1; //允许总中断
最好先开总中断再开串口中断

追问

问题解决了,谢谢大家哈~~

本回答被提问者和网友采纳
相似回答