hanwe 发表于 2022-7-4 20:05

不停发送数据到电脑上

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

#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=sbuf_value;//保存一字节数据
in_data_cnt++;//接收数据个数计数
if(in_data_cnt==1)//共接收一个数据
{
in_data_cnt=0;
flag_receive=1;
}

}
ES=1;
}

supernan 发表于 2022-7-4 20:08


小错误,500大于256了,不能实现。

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

hanwe 发表于 2022-7-4 20:12


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

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

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

zhanghqi 发表于 2022-7-4 20:15


根据你的程序,就是不停的发送
unsigned char型的变量是0~255,你给这个变量赋值500?能实现吗?
再说,延时根本没必要,你是想?从电脑收一个字节数据,然后再把这个数据发到电脑吗?
可以试试:

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uintunsigned 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;
                      }                  
          }
}

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

stly 发表于 2022-7-4 20:18

在你的中断里,判断if(RI)改为      if(!RI)。。

huangchui 发表于 2022-7-4 20:20

只有在RI=1,才发生中断

chuxh 发表于 2022-7-4 20:22

很奇怪,你这个程序下载后,只要从电脑发送一个数据到51单片机,51单片机就不停的发送数据到电脑上...

xxmmi 发表于 2022-7-4 20:26

感觉波特率不对,51好久没用了。

pengf 发表于 2022-7-4 20:31

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

xxrs 发表于 2022-7-4 20:33

他查询发送都没关中断

jlyuan 发表于 2022-7-4 20:35


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

llljh 发表于 2022-7-4 20:38

会不会是单片机的问题?

jiahy 发表于 2022-7-4 20:40

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

jiaxw 发表于 2022-7-4 20:42

这是我的程序,好使,先用着,对比对比!
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;      
}

zhanghqi 发表于 2022-7-4 20:44

再发下接收程序,去掉一行while(!RI)Key_ScanStop();
uchar Uart_RcvData(void)
{
          uchar Rcv=0;
          Rcv = SBUF;
          RI = 0;      
          return Rcv;
}

xxmmi 发表于 2022-7-4 20:46


看到你的接收处理函数获取的是SBUF的值,不忍再看下去。。 建议改成调用数据缓冲区的值rece_data_buff
习惯会减少很多错误,虽然这个与你问的问题无关
更多操作

jiajs 发表于 2022-7-4 20:49


void send_byte_to_pc(uchar dat)
{
         ES = 0;先关闭中断
         SBUF=dat;
         while(!TI);
         TI=0;
         ES = 1;
}

pengf 发表于 2022-7-4 20:52

有串口发送一个字节的数据的,不知道如何同时发送多个数据字节呢?

hanwe 发表于 2022-7-4 20:58

多谢大家讨论这么多哈,呵呵

tpgf 发表于 2022-8-1 09:17

发送的数据有规律性吗
页: [1] 2
查看完整版本: 不停发送数据到电脑上