打印
[应用相关]

发送数据

[复制链接]
610|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bbapple|  楼主 | 2018-12-16 18:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现象:从电脑发送一个数据,单片机就不停的发送数据到电脑上...

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
/*
延时X 毫秒函数
*/
void delay_nms(uint x)
{
uchar i;
uint j;
for(j=0;j<x;j++)
{
   for(i=200;i>0;i--);
}
}

void send_byte_to_pc(uchar dat)
{
//ES=0;
SBUF=dat;
while(!TI);
TI=0;
//ES=1;

}
void init_uart(void)
{
// EA=1;
TMOD=0X20;
TH1=252;TL1=252;//9600//波特率和晶振有关
TR1=1;
ET1=0;
SCON=0X50;
//ES=1;
}
/*******************************************************************/
uchar rece_data_chuli(void)//接收数据处理
{
uchar i=0;
while(!RI);
RI=0;
i=SBUF;
TI=0;
SBUF=i;
while(!TI);
TI=0;
delay_nms(1);
return 0;
}
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
void main(void)
{
init_uart();         //UART 初始化
delay_nms(500);
while(1)
{
   
   rece_data_chuli();
  delay_nus(2);
}
}
/*******************************************************************/
void  int_uart(void) interrupt 4
{
uchar sbuf_value;
ES=0;
if(RI)
   {
   RI=0;
     sbuf_value=SBUF;
   rece_data_buff[in_data_cnt]=sbuf_value;//保存一字节数据
     in_data_cnt++;//接收数据个数计数
   if(in_data_cnt==1)//共接收一个数据
    {
     in_data_cnt=0;
     flag_receive=1;
    }

  }
ES=1;
}
沙发
handleMessage| | 2018-12-16 18:03 | 只看该作者
500大于256了,不能实现。

使用特权

评论回复
板凳
wanglaojii| | 2018-12-16 18:07 | 只看该作者
严重错误,程序中有中断接收,同时也有查询等待接收???很混乱的程序。

使用特权

评论回复
地板
laozhongyi| | 2018-12-16 18:10 | 只看该作者
500大于255有什么关系?延时是没问题的

使用特权

评论回复
5
Edisons| | 2018-12-16 18:12 | 只看该作者
根据你的程序,就是不停的发送
unsigned char  型的变量是0~255,你给这个变量赋值500?能实现吗?

使用特权

评论回复
6
_gege| | 2018-12-16 18:51 | 只看该作者
可以试试:

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
uchar     sbuf_value;
bit          flag_receive;

void send_byte_to_pc(uchar dat)
{
          SBUF=dat;
          while(!TI);
          TI=0;
}
void init_uart(void)
{
           EA=1;
            TMOD=0X20;
            TH1=252;TL1=252;//9600//波特率和晶振有关
        TR1=1;
            SCON=0X50;
            ES=1;
}

void main(void)
{
            init_uart();         //UART 初始化
           while(1)
           {
                      if(flag_receive ==1)
                     {
                                 send_byte_to_pc(sbuf_value);
                                 flag_receive=0;
                     }                  
          }
}

void  int_uart(void) interrupt 4
{
          if(RI)
          {
                    sbuf_value=SBUF;
                    flag_receive=1;
                    RI=0;
           }
}

使用特权

评论回复
7
Mozarts| | 2018-12-16 18:54 | 只看该作者
在你的中断里,判断if(RI)改为        if(!RI)。

使用特权

评论回复
8
Listate| | 2018-12-16 18:58 | 只看该作者
感觉波特率不对,51好久没用了。

使用特权

评论回复
9
磨砂| | 2019-1-1 10:50 | 只看该作者
像是没有清除标志位的样子

使用特权

评论回复
10
heimaojingzhang| | 2019-1-1 16:23 | 只看该作者
乱套了  这个程序

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

293

主题

1811

帖子

1

粉丝