打印

不停的发送数据

[复制链接]
305|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wyjie|  楼主 | 2018-12-6 19:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

现象:从电脑发送一个数据,单片机就不停的发送数据到电脑上...

#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;
}

相关帖子

沙发
jlyuan| | 2018-12-6 19:29 | 只看该作者
小错误,500大于256了,不能实现。

不知道你想问什么,串口不工作???
不工作怎么能收发???
至于收或发,完全看你程序控制。
这个程序估计不是你写的?要么就是对串口不太了解。
严重错误,程序中有中断接收,同时也有查询等待接收???很混乱的程序。
一般来说,接收时用中断。

使用特权

评论回复
板凳
wyjie|  楼主 | 2018-12-6 19:32 | 只看该作者
现象:从电脑发送一个数据,单片机就不停的发送数据到电脑上...

本来想从电脑接收一个字节,然后再由单片机发送到电脑的

500大于255有什么关系?延时是没问题的

使用特权

评论回复
地板
jiajs| | 2018-12-6 19:35 | 只看该作者
根据你的程序,就是不停的发送
unsigned char  型的变量是0~255,你给这个变量赋值500?能实现吗?
再说,延时根本没必要,你是想?从电脑收一个字节数据,然后再把这个数据发到电脑吗?
可以试试:

#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;
           }
}

使用特权

评论回复
5
shimx| | 2018-12-6 19:40 | 只看该作者
在你的中断里,判断if(RI)改为        if(!RI)。。

使用特权

评论回复
6
zhanghqi| | 2018-12-6 19:43 | 只看该作者
只有在RI=1,才发生中断

使用特权

评论回复
7
wyjie|  楼主 | 2018-12-6 19:48 | 只看该作者
很奇怪,你这个程序下载后,只要从电脑发送一个数据到51单片机,51单片机就不停的发送数据到电脑上...

使用特权

评论回复
8
heweibig| | 2018-12-6 19:53 | 只看该作者
感觉波特率不对,51好久没用了。

使用特权

评论回复
9
wyjie|  楼主 | 2018-12-6 19:55 | 只看该作者

串口波特率和晶振有关...

使用特权

评论回复
10
jiaxw| | 2018-12-6 19:59 | 只看该作者
他查询发送都没关中断

使用特权

评论回复
11
liliang9554| | 2018-12-6 20:02 | 只看该作者

他不是void delay_nms(uint x)么?
unsigned int应该是允许500的。

使用特权

评论回复
12
wyjie|  楼主 | 2018-12-6 20:04 | 只看该作者
会不会是单片机的问题?

使用特权

评论回复
13
jiaxw| | 2018-12-6 20:08 | 只看该作者

单片机肯定不会有问题,就是你程序的问题!那发送和接收的数据都对吗??看看你的晶振和波特率吧

使用特权

评论回复
14
午夜粪车| | 2018-12-6 20:10 | 只看该作者

这是我的程序,好使,先用着,对比对比!
void UART_Init(void)
{
         SCON = 0x50 ;         //SCON: serail mode 1, 8-bit UART, enable ucvr
        TMOD |= 0x20 ;         //TMOD: timer 1, mode 2, 8-bit reload
        PCON |= 0x80 ;         //SMOD=1;
        TH1 = 0xF3 ;         //Baud:9600 fosc=24MHz
        ES=0;
         TR1 = 1 ;                 // timer 1 run
}
//--------------------------------------------------------------------------
//函数名称:      Uart_SendData()
//函数功能:      串口发送一个字节的数据
//其他说明:             此程序供中断调用
//--------------------------------------------------------------------------
void Uart_SendData(uchar dat)
{
         SBUF=dat;                //写SBUF,开始发送
         while(TI==0);        //等待发送
            TI=0;                //清发送标志位                  
}
//--------------------------------------------------------------------------
//函数名称:      Uart_RcvData()
//函数功能:      串口接收函数
//其他说明:             无
//--------------------------------------------------------------------------
uchar Uart_RcvData(void)
{
         uchar Rcv=0;
         while(!RI)Key_ScanStop();        
         Rcv = SBUF;
         RI = 0;        
         return Rcv;        
}

使用特权

评论回复
15
午夜粪车| | 2018-12-6 20:13 | 只看该作者
再发下接收程序,去掉一行while(!RI)Key_ScanStop();
uchar Uart_RcvData(void)
{
         uchar Rcv=0;
         Rcv = SBUF;
         RI = 0;        
         return Rcv;
}

使用特权

评论回复
16
dengdc| | 2018-12-6 20:18 | 只看该作者
楼主这个程序写的不是很好的啊,,不过是可以运行的

使用特权

评论回复
17
heweibig| | 2018-12-6 20:21 | 只看该作者

试试这个接收一个字节,发送一个字节的程序



#include <reg52.h>
unsigned char    sbuf_value;
bit      flag_receive;
bit      flag_send;

void init_uart(void)
{   EA=1;
    TMOD=0X20;
    TH1=252;TL1=252;
    TR1=1;
    SCON=0X50;
    ES=1;
    flag_receive=0;
    flag_send=0;   
}

void main(void)
{   init_uart();
    while(1)
    {
        if ( (flag_receive==1 )  &&  ( flag_send==0) );
        {  SBUF = sbuf_value;
            flag_receive = 0;
            flag_send =1;
        }
    }
}

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

使用特权

评论回复
18
spark周| | 2018-12-6 20:23 | 只看该作者
哪里这么麻烦?

主程序除了初始化只要
while(1);

中断只要
void int_uart(void) interrupt 4
{
   if(RI)
   {
     RI=0;
     SBUF=SBUF;
   }
   if(TI)
   {
     TI=0;
   }
}

使用特权

评论回复
19
lizye| | 2018-12-7 11:00 | 只看该作者
发送接收的数据对吗

使用特权

评论回复
20
wyjie|  楼主 | 2018-12-7 11:03 | 只看该作者
哦,那我就知道怎么回事了,多谢大家,结贴了哈

使用特权

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

本版积分规则

927

主题

12706

帖子

5

粉丝