调试助手界面上接收端没有显示在发送端发送的数据。不知道到底是什么原因??有大神知道话求帮忙啊!!
#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
}
}
proteus仿真中C52单片机默认的晶振是12M,要改为11.0592M?
追答你是做实物还是在仿真啊,仿真有很多情况与实际是有出入的,实际使用时这个是必须要换的,否则数据时错误的,乱码,软件仿真中也许都行,不是那么严谨,但是实际中查那么一点是不行的
追问问题解决了,谢谢大家哈~~
自动清空选择框勾选是满屏后清空,够不勾选对存在问题无关紧要。帮我看看是程序问题么?
追答RCAP2L = 0XD9; //9600波特率的低8位
RCAP2H = 0XFF; //9600波特率的高8位
51单片机里面有这个寄存器吗?
ES = 1; //允许串口中断
EA = 1; //允许总中断
最好先开总中断再开串口中断
问题解决了,谢谢大家哈~~
本回答被提问者和网友采纳