单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 491|回复: 10
打印 上一主题 下一主题
收起左侧

单片机串口程序只发送不接收的问题

[复制链接]
跳转到指定楼层
楼主
如果我只是要往上位机发送一串字符,而不需要从上位机往单片机发送内容,为什么我这个程序就不能运行。

单片机源码:
  1. #include<reg52.h>

  2. #define uchar        unsigned char
  3. #define uint        unsigned int

  4. void Init_uart();
  5. void Send_byte(uchar dat);
  6. void Send_string(uchar *p);

  7. void main(void)
  8. {
  9.         Init_uart();
  10.         while(1)
  11.         {
  12.                 Send_string("uart_test");
  13.         }
  14. }

  15. void Init_uart()
  16. {
  17.         SCON = 0x50;
  18.         TMOD = 0x20;
  19.         TH1 = 0xfd;
  20.         TL1 = 0xfd;
  21.         TR1 = 1;
  22. }

  23. void Send_byte(uchar dat)
  24. {
  25.         while(!TI);
  26.         TI = 0;
  27.         SBUF = dat;
  28. }

  29. void Send_string(uchar *p)
  30. {
  31.         while(*p)
  32.         {
  33.                 Send_byte(*p++);
  34.         }
  35. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
xuyaqi 发表于 2019-1-12 11:09 | 只看该作者
你根据什么说不行
回复

使用道具 举报

板凳
菜鸡一只314159 发表于 2019-1-12 12:49 | 只看该作者
打开串口中断ES=1;
回复

使用道具 举报

地板
菜鸡一只314159 发表于 2019-1-12 12:51 | 只看该作者
51寄存器表(重要).doc (91.5 KB, 下载次数: 1)
回复

使用道具 举报

5#
yaoji123 发表于 2019-1-12 13:09 | 只看该作者
28.void Send_byte(uchar dat)

29.{

30.    SBUF = dat;
  
  
31.       while(!TI);


32.         TI = 0;
33.}
回复

使用道具 举报

6#
wulin 发表于 2019-1-12 14:31 | 只看该作者


#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

void Init_uart();
void Send_byte(uchar dat);
void Send_string(uchar *p);

void main(void)
{
        uint i;
        Init_uart();
        while(1)
        {
                Send_string("uart_test\n");//加换行符是为了在串口助手可以看清楚
                i=0xffff;
                while(i--);//延时,串口助手可以看清楚一帧一帧的接收
        }
}

void Init_uart()
{
        SCON = 0x50;
        TMOD = 0x20;
        TH1 = 0xfd;
        TL1 = 0xfd;
        TR1 = 1;
}

void Send_byte(uchar dat)
{
        SBUF = dat;
        while(!TI);
        TI = 0;
}

void Send_string(uchar *p)
{
        while(*p)
        {
                Send_byte(*p++);
        }
}


回复

使用道具 举报

7#
 楼主| code_404 发表于 2019-1-16 13:21 | 只看该作者
yaoji123 发表于 2019-1-12 13:09
28.void Send_byte(uchar dat)

29.{

我感觉这么改和之前的逻辑上没什么区别啊,为什么这么一改就能发送了
回复

使用道具 举报

8#
 楼主| code_404 发表于 2019-1-16 13:23 | 只看该作者

额,我并没有需要单片机接收,所以我也不需要打开这个中断。我不需要中断程序
回复

使用道具 举报

9#
 楼主| code_404 发表于 2019-1-16 13:26 | 只看该作者
wulin 发表于 2019-1-12 14:31
#include

#define uchar unsigned char

谢谢指点,但我还有一个问题,就是我send_byte这个函数,你和楼上都是将 SBUF = dat 这一句往前写了,我有点不明白的是,这跟我写的逻辑上感觉并没有什么区别啊。一个是发送完软件清0,而我是在发送前确保TI为0.
回复

使用道具 举报

10#
wulin 发表于 2019-1-16 20:57 | 只看该作者
code_404 发表于 2019-1-16 13:26
谢谢指点,但我还有一个问题,就是我send_byte这个函数,你和楼上都是将 SBUF = dat 这一句往前写了,我 ...

void Send_byte(uchar dat)
{
        SBUF = dat;//发送数据
        while(!TI);//等待发送中断请求标志位为1(已发送完成)
        TI = 0;//必须软件清0,为下次发送数据做准备
}
回复

使用道具 举报

11#
zxwdown 发表于 2019-1-17 18:35 | 只看该作者
    你这程序我简单仿真试了一下,发现确实不行,主要问题有二:
      一是发送程序有错:应改为:
void Send_byte(uchar dat)
{SBUF = dat;
while(!TI);
TI = 0;
//SBUF = dat;
}

    二是主程序不合理,不是错,也可以发送,但用于测试发送成功与否的程序,不要一直发字符串,把终端都堵死啦,改成如下比较好:
void main(void)
{ Init_uart();
  Send_string("uart_test");
  while(1);
}

    另外,你的单片机晶振一定要是11.0592M的,否则也不行。


下面是我把你的程序改后的清单:
#include<reg52.h>
#define uchar  unsigned char
#define uint  unsigned int
void Init_uart();
void Send_byte(uchar dat);
void Send_string(uchar *p);
void main(void)
{ Init_uart();
  Send_string("uart_test");
  while(1);
}

void Init_uart()
{SCON = 0x50;
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
}
void Send_byte(uchar dat)
{SBUF = dat;
while(!TI);
TI = 0;
//SBUF = dat;
}
void Send_string(uchar *p)
{while(*p)
   {Send_byte(*p++);
   }
}

下面是程序改后仿真截图:




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

快速回复 返回顶部 返回列表