微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 请大侠帮忙看看这个程序错在哪里?没反应 串口的 51

请大侠帮忙看看这个程序错在哪里?没反应 串口的 51

时间:10-02 整理:3721RD 点击:
void uart_init()
{
  TMOD=0X20;    //定时器1
  SCON=0X50;    //串口1
  PCON=0X00;    //不分屏
  TH1 =0XFD;    //253
  TL1 =0XFD;     //253
  TI  =0;         //发送状态清零
  RI  =0;         //接受状态清零
  TR1 =1;       //开定时器1
  EA  =1;       //开总中断
  ES  =1;       //开串口中断1
}
void uartes() interrupt 4
{
  if(RI)
  {
   RI=0;                 //标志清零  
   recevi=SBUF;   
   stat=1;
  }
  if(TI)
  {
   TI=0;
   busy=1;
  }
}   
void main()
{
  uart_init();
  while(1)
  {
  if((busy==1)&&(stat=1))
  {
   SBUF=recevi;
   busy=0;
   stat=0;
  }
  }
}

if((busy==1)&&(stat=1))应该为 if((busy==1)&&(stat==1))

RX TX口换着插一下,是不是接错了。

不是,,,,,晶振11.0592

弄个示波器一看就知道了,最方便了

不用示波器查,就看着程序有没有觉得不对的地方?

认真。谢谢了。

原来是 找茬 游戏。

if((busy==1)&&(stat=1))改为 if((busy==1)&&(stat==1))

没有,你回答前已经自己找到错误了

if(busy&&stat)

你好,试问下
if(RI)
  {
   RI=0;                 //标志清零  
   recevi=SBUF;   
   stat=1;
  }
中的 recevi=SBUF;改为 SBUF=recevi;而
if((busy==1)&&(stat==1))
  {
   SBUF=recevi;
   busy=0;
   stat=0;
  }
中的SBUF=recevi;改为recevi=SBUF会怎样?
为什么我的串口助手智能这样改才会正常显示?

你好,试问下
if(RI)
  {
   RI=0;                 //标志清零  
   recevi=SBUF;   
   stat=1;
  }
中的 recevi=SBUF;改为 SBUF=recevi;而
if((busy==1)&&(stat==1))
  {
   SBUF=recevi;
   busy=0;
   stat=0;
  }
中的SBUF=recevi;改为recevi=SBUF会怎样?
为什么我的串口助手智能这样改才会正常显示?

你好,试问下
if(RI)
  {
   RI=0;                 //标志清零  
   recevi=SBUF;   
   stat=1;
  }
中的 recevi=SBUF;改为 SBUF=recevi;而
if((busy==1)&&(stat==1))
  {
   SBUF=recevi;
   busy=0;
   stat=0;
  }
中的SBUF=recevi;改为recevi=SBUF会怎样?
为什么我的串口助手智能这样改才会正常显示?

SBUF=recevi发送这样写   recevi=SBUF接收这样写,你把全部程序发过来我看看什么问题

你这样试试
void uart_init()
{
  TMOD=0X20;    //定时器1
  SCON=0X50;    //串口1
  PCON=0X00;    //不分屏
  TH1 =0XFD;    //253
  TL1 =0XFD;     //253
  TI  =0;         //发送状态清零
  RI  =0;         //接受状态清零
  TR1 =1;       //开定时器1
  EA  =1;       //开总中断
  ES  =1;       //开串口中断1
}
void uartes() interrupt 4
{
  if(RI)
  {
   RI=0;                 //标志清零  
   recevi=SBUF;   
   stat=1;
  }

}   
void main()
{
  uart_init();
  while(1)
  {
  if(stat==1)
  {  
    stat=0;
   SBUF=recevi;
     while(TI==0);
      TI=0;  
     
  }
  }
}

你好,这个是我的程序。如果把if(RI)里面的SBUF=RECEVI;改为RECEVI=SBUF;就显示不了了,同样把TI的也改了也是显示不了的。
#include "reg52.h"
#include "intrins.h"
#define u8 unsigned char
#define u16 unsigned int
u8 RECEVI;                                 //接收发送变量
u8 STAT=0;                                 //接送完毕
u8 busy=0;                                 //忙检测

void time_init()
{
   TMOD=0X20;                         //定时器1 方式2 自动重装载 8位定时器
   SCON=0X50;                         //串口模式1
   PCON=0X00;                         //不分屏
   TH1 =0XFD;                         //高位初始值253
   TL1 =0XFD;                         //波特率计算:9600=1*11059200/(2*(256-253)*32)
   TR1 =1;                                 //开启定时器
   EA  =1;                                 //开总中断
   ES  =1;                                 //开串口中断
   TI  =0;                                 //清零发送
   RI  =0;                                 //清零接收
}
void busy_init()
{
  if(STAT&&busy)                 //当检测到发送一帧完毕后与接送完毕
         {
           STAT=0;                         //清零标志位
           TI=0;                         //清零接收标志
           RECEVI=SBUF;                 //把数据传给串口助手
         }
}
void main()
{
  time_init();                         //初始化
  while(1)                                 
   {
           busy_init();                 //调用函数
   }
}
void time() interrupt 4         //串口中断函数 串口中断模式4
{
   if(RI)                                 //检测是否接收到数据 被置1表示接收到数据
   {
            RI=0;                                 //清零标志位
         SBUF=RECEVI;                 //数据传送给接收缓冲器
         STAT=1;                         //置1表示接收到数据
   }                                         
   if(TI)                                 //检测是否接收到数据
   {
            TI=0;                                 //清零标志位
         busy=1;                         //忙检测
   }
}

好,明天我去试一下,板不在身边

可以用,只要在接收中断里不加
if(TI)                                 //检测是否接收到数据
   {
            TI=0;                                 //清零标志位
         busy=1;                         //忙检测
   }
就可以使用。
有个疑问?为什么要在接收中断里面判断是否发送了?if(TI)?

if((busy==1)&&(stat=1))中的stat==1 怎么不用代码生成器

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top