久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5760|回復: 13
打印 上一主題 下一主題
收起左側

單片機串口程序只發送不接收的問題

[復制鏈接]
跳轉到指定樓層
樓主
如果我只是要往上位機發送一串字符,而不需要從上位機往單片機發送內容,為什么我這個程序就不能運行。

單片機源碼:
  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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:94031 發表于 2019-1-12 11:09 | 只看該作者
你根據什么說不行
回復

使用道具 舉報

板凳
ID:466908 發表于 2019-1-12 12:49 | 只看該作者
打開串口中斷ES=1;
回復

使用道具 舉報

地板
ID:466908 發表于 2019-1-12 12:51 | 只看該作者
51寄存器表(重要).doc (91.5 KB, 下載次數: 12)
回復

使用道具 舉報

5#
ID:432823 發表于 2019-1-12 13:09 | 只看該作者
28.void Send_byte(uchar dat)

29.{

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


32.         TI = 0;
33.}
回復

使用道具 舉報

6#
ID:213173 發表于 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#
ID:367937 發表于 2019-1-16 13:21 | 只看該作者
yaoji123 發表于 2019-1-12 13:09
28.void Send_byte(uchar dat)

29.{

我感覺這么改和之前的邏輯上沒什么區別啊,為什么這么一改就能發送了
回復

使用道具 舉報

8#
ID:367937 發表于 2019-1-16 13:23 | 只看該作者

額,我并沒有需要單片機接收,所以我也不需要打開這個中斷。我不需要中斷程序
回復

使用道具 舉報

9#
ID:367937 發表于 2019-1-16 13:26 | 只看該作者
wulin 發表于 2019-1-12 14:31
#include

#define uchar unsigned char

謝謝指點,但我還有一個問題,就是我send_byte這個函數,你和樓上都是將 SBUF = dat 這一句往前寫了,我有點不明白的是,這跟我寫的邏輯上感覺并沒有什么區別啊。一個是發送完軟件清0,而我是在發送前確保TI為0.
回復

使用道具 舉報

10#
ID:213173 發表于 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#
ID:404797 發表于 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++);
   }
}

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




回復

使用道具 舉報

12#
ID:975054 發表于 2021-12-16 11:06 | 只看該作者
有所體會;我的stc8g1k08,掉電喚醒后,只需獲取I2C傳感器數據并發送到上位機電腦監控一次就好(不需要接收上位機什么命令 或數據)。如果上位機不小心發送了什么數據,我的MCU好多數據會混亂(有空看看怎么優化一下),所以串口暫時得只發不收才穩定。
回復

使用道具 舉報

13#
ID:975054 發表于 2021-12-16 11:43 | 只看該作者
ax6808 發表于 2021-12-16 11:06
有所體會;我的stc8g1k08,掉電喚醒后,只需獲取I2C傳感器數據并發送到上位機電腦監控一次就好(不需要接收上 ...

臨時處理辦法,電腦監控時,斷開串口TXD線,只留RXD、GND兩根線。
另外:我MCU3.3V供電的,發現USB ISP下載器的TXD線電壓為5V,連上MCU后為3.76V,感覺不太好,有空再研究,倒不會燒壞什么東西。
回復

使用道具 舉報

14#
ID:975054 發表于 2021-12-23 01:21 | 只看該作者
ax6808 發表于 2021-12-16 11:43
臨時處理辦法,電腦監控時,斷開串口TXD線,只留RXD、GND兩根線。
另外:我MCU3.3V供電的,發現USB ISP下 ...

最終解決好辦法:掉電前ES=0,喚醒后ES=1;完美解決.
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91视视频在线观看入口直接观看 | 精品欧美 | 日日夜夜精品免费视频 | 91欧美激情一区二区三区成人 | 色天天综合 | 成人精品在线视频 | 久久精品久久久久久 | 日本黄色免费片 | 国产丝袜一区二区三区免费视频 | 美女视频三区 | 亚洲夜夜爽 | 麻豆av在线免费观看 | 国产麻豆乱码精品一区二区三区 | 欧美mv日韩mv国产网站91进入 | 日韩久久精品电影 | 在线观看中文字幕亚洲 | 草在线| 狠狠狠干 | 午夜精品福利视频 | av免费网站在线观看 | 国产一区二区在线视频 | 激情欧美一区二区三区 | 成人午夜在线 | 99精彩视频| 久久精品国产亚洲夜色av网站 | 免费黄色大片 | 欧美色综合网 | 精品国产青草久久久久96 | www.国产 | 久久久久久久久淑女av国产精品 | 美女福利视频 | 成人在线不卡 | 91麻豆精品国产91久久久久久 | 91国产精品在线 | 99爱视频| 久久99深爱久久99精品 | 欧美久久视频 | 一级在线免费观看 | 午夜欧美日韩 | 欧美一级艳情片免费观看 | 国产美女高潮 |