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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC8G1K08單片機串口通訊無反應

  [復制鏈接]
跳轉到指定樓層
樓主
一個STC8G1K08  SOP小板子,用到串口控制HMI觸摸屏,
參考STC下載軟件自帶例程,以及
STC實驗板的例程,都無法接收發送數據。
用USB---TTL下載線可以燒寫程序,
串口以外的IO可以定時輸出脈沖,
就是串口無反應,大家有沒有遇到過?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:390416 發表于 2021-1-24 17:50 | 只看該作者
那你參考這個貼子的:http://www.zg4o1577.cn/bbs/dpj-200927-1.html
回復

使用道具 舉報

板凳
ID:390416 發表于 2021-1-24 21:18 | 只看該作者
STC單片機串口發送 不需要while死等  http://www.zg4o1577.cn/bbs/dpj-200927-1.html
回復

使用道具 舉報

地板
ID:140644 發表于 2021-1-24 22:57 | 只看該作者
測試了好幾天死活出不來,我STC其他芯片挺多,STC15W408 STC15W204 15W1K16SQ IAP系列都有,
串口都可以通訊,就是STC8G1K08  SOP串口不工作,但是程序可以下載,覺得應該是芯片問題。
回復

使用道具 舉報

5#
ID:807591 發表于 2021-1-25 08:23 | 只看該作者
說明書仔細研究一下
回復

使用道具 舉報

6#
ID:65956 發表于 2021-1-25 08:33 | 只看該作者
程序帖出來看才能幫你分析啊,最主要是下載時晶振選擇要和例程中寫的一樣
回復

使用道具 舉報

7#
ID:140644 發表于 2021-1-25 09:03 | 只看該作者
#include     "reg52.h"
              #include     "intrins.h"
              #define      uint unsigned int
              #define      uchar unsigned char
              sbit         INTPUT1=P5^4;         //啟動信號
              sbit         DOWN=P3^2;             //下降
              sbit         UP=P3^3;                 //上升
              sbit         LED=P5^5;             //EEPROM寫指示
              #define      FOSC  11059200UL
              #define      BRT  (65536-FOSC/115200/4)
              sfr          IAP_TPS  =  0xF5;
/************************************/
              void        UartInit()
              {
              SCON = 0x5a;
              T2L = BRT;
              T2H = BRT >> 8;
              AUXR = 0x15;
              }
/************************************/
              void        UartSend(char dat)
              {
              while (!TI);
              TI = 0;
              SBUF = dat;
              }
/************************************/
              void IapIdle()
              {
              IAP_CONTR = 0;  // 關閉 IAP 功能
              IAP_CMD = 0; // 清除命令寄存器
              IAP_TRIG = 0; // 清除觸發寄存器
              IAP_ADDRH = 0x80; // 將地址設置到非 IAP 區域
              IAP_ADDRL = 0;
              }
/************************************/
              char IapRead(int addr)
              {
              char dat;
              IAP_CONTR = 0x80; // 使能 IAP
              IAP_TPS = 12; // 設置擦除等待參數 12MHz
              IAP_CMD = 1; // 設置 IAP 讀命令
              IAP_ADDRL = addr; // 設置 IAP 低地址
              IAP_ADDRH = addr >> 8; // 設置 IAP 高地址
              IAP_TRIG = 0x5a; // 寫觸發命令 (0x5a)
              IAP_TRIG = 0xa5; // 寫觸發命令 (0xa5)
              _nop_();
              dat = IAP_DATA; // 讀 IAP 數據
              IapIdle(); // 關閉 IAP 功能
              return dat;
              }
/************************************/
              void IapProgram(int addr, char dat)
              {
              IAP_CONTR = 0x80; // 使能 IAP
              IAP_TPS = 12; // 設置擦除等待參數 12MHz
              IAP_CMD = 2; // 設置 IAP 寫命令
              IAP_ADDRL = addr; // 設置 IAP 低地址
              IAP_ADDRH = addr >> 8; // 設置 IAP 高地址
              IAP_DATA = dat; // 寫 IAP 數據
              IAP_TRIG = 0x5a; // 寫觸發命令 (0x5a)
              IAP_TRIG = 0xa5; // 寫觸發命令 (0xa5)
              _nop_();
              IapIdle(); // 關閉 IAP 功能
              }
/************************************/
              void IapErase(int addr)
              {
              IAP_CONTR = 0x80; // 使能 IAP
              IAP_TPS = 12; // 設置擦除等待參數 12MHz
              IAP_CMD = 3; // 設置 IAP 擦除命令
              IAP_ADDRL = addr; // 設置 IAP 低地址
              IAP_ADDRH = addr >> 8; // 設置 IAP 高地址
              IAP_TRIG = 0x5a; // 寫觸發命令 (0x5a)
              IAP_TRIG = 0xa5; // 寫觸發命令 (0xa5)
              _nop_();  //
              IapIdle(); // 關閉 IAP 功能
              }
/*-----------(1)延時子程序12MHz 加千百十個顯示--------*/
               void Delay100ms(uint x)              //
               {
               uint i,j;
               for(i=0;i<x;i++)
               for(j=0;j<11000;j++);
               }
/*************關所有輸出*******************************/            
               void reset_io()
               {
               P3M0=0X00;
               P3M1=0X00;
               P5M0=0X00;   
               P5M1=0X00;
               DOWN=1;                           //氣缸下降
               UP=1;                             //氣缸上升
               INTPUT1=1;                         //
               }
/************************************/
               void main()
               {
               reset_io();
               UP=0;                             //開上升
               DOWN=0;                             //下降
               Delay100ms(20);                    //延時(10);   
               UP=1;                             //開上升
               DOWN=1;                             //下降
               Delay100ms(20);                    //延時(10);   
               UP=0;                             //開上升
               DOWN=0;                             //下降
               Delay100ms(20);                    //延時(10);
               UP=1;                             //開上升
               DOWN=1;                             //下降
               Delay100ms(20);                    //延時(10);
                UP=0;                             //開上升
               DOWN=0;                             //下降
               Delay100ms(20);                    //延時(10);   
               UP=1;                             //開上升
               DOWN=1;                             //下降
               Delay100ms(20);                    //延時(10);   
               UP=0;                             //開上升
               DOWN=0;                             //下降
               Delay100ms(20);                    //延時(10);
               UP=1;                             //開上升
               DOWN=1;                             //下降
               Delay100ms(20);                    //延時(10);
                UP=0;                             //開上升
               DOWN=0;                             //下降
               Delay100ms(20);                    //延時(10);   
               UP=1;                             //開上升
               DOWN=1;                             //下降
               Delay100ms(20);                    //延時(10);   
               UP=0;                             //開上升
               DOWN=0;                             //下降
               Delay100ms(20);                    //延時(10);
               UP=1;                             //開上升
               DOWN=1;                             //下降
               Delay100ms(20);                    //延時(10);
               UartInit();
               IapErase(0x1200);
               UartSend(IapRead(0x1200));
               IapProgram(0x1200, 0x12);
               UartSend(IapRead(0x1200));
               while (1)
               {
                UP=0;                             //開上升
                Delay100ms(200);                    //延時(10);   
                UP=1;                             //開上升
                Delay100ms(200);                    //延時(10);   
               }
              }



              #include       "reg52.h"
              #include       "intrins.h"
              #define        FOSC  11059200UL
              #define        BRT  (65536 - FOSC / 115200 / 4)
              bit            busy;
              char           wptr;
              char           rptr;
              char           buffer[16];
              void           UartIsr() interrupt 4
              {
               if (TI)
               {
               TI = 0;
               busy = 0;
               }
               if (RI)
               {
               RI = 0;
               buffer[wptr++] = SBUF;
               wptr &= 0x0f;
               }
              }
              void UartInit()
              {
               SCON = 0x50;
               T2L = BRT;
               T2H = BRT >> 8;
               AUXR = 0x15;
               wptr = 0x00;
               rptr = 0x00;
               busy = 0;
               }

              void UartSend(char dat)
              {
               while (busy);
               busy = 1;
               SBUF = dat;
              }

             void UartSendStr(char *p)
             {
              while (*p)
              {
              UartSend(*p++);
              }
             }

              void main()
              {
               P_SW1=0x00;                       //RXD/P3.0, TXD/P3.1
               P3M0=0;
               P3M1=0;
               P5M0=0;   
               P5M1=0;
               UartInit();
               ES = 1;
               EA = 1;
               UartSendStr("Uart Test !\r\n");
               while (1)
               {
               if (rptr != wptr)
                {
                UartSend(buffer[rptr++]);
                rptr &= 0x0f;
                }
               }
              }


                           #include     "STC8.H"
              sbit         LED = P3^2;
/*------------發送串口數據----------------*/
              void uart1_SendData(unsigned char dat)
              {
              SBUF = dat;
              while (TI == 0);
              TI = 0;
              }
/*------------發送字符串------------------*/
              void uart1_SendDataFrame(unsigned char *pDat)
              {
               while ((*pDat)!= '\0')
               {
               uart1_SendData(*pDat++);
               }
              }
/*
上位機發送0x55,LED亮,上位機發送0xAA,LED滅。
然后下位機收到正確的命令后,作出相對應的相應。
*/
              void UartIsr()interrupt 4
              {
                unsigned char data l_RevDat = 0;
                if (RI)
                {
                RI = 0; //清除RI位
                l_RevDat = SBUF;
                 if (0x55 == l_RevDat)
                 {
                 LED = 0;//LED亮
                 uart1_SendDataFrame("LED已點亮\r\n");
                 }
                 else if (0xAA == l_RevDat)
                 {
                 LED = 1;//LED滅
                 uart1_SendDataFrame("LED已熄滅\r\n");
                 }
                 else
                 {
                 uart1_SendDataFrame("指令錯誤\r\n");
                 }
                }
               }
/************************************/
              void main(void)
              {
               P3M0=0;
               P3M1=0;
               P5M0=0;   
               P5M1=0;
//使用內部時鐘 燒錄軟件會幫我們配置好 如不懂 參考前面第3章系統設置學習。
// 燒錄軟件設置11.0592MHz為系統時鐘。以后我們的學習都是這個時鐘頻率。
               P_SW2 |= (1<<7);
               CKSEL = 0x00; //選擇內部 IRC ( 默認 )
               P_SW2 &= ~(1<<7);
//配置端口 對于控制我們系統板的LED,配置準雙向口和推挽輸出都可以。
//只要是做為輸出,我建議全部設置為推挽輸出。
/*
PnM1.x PnM0.x Pn.x 口工作模式
0 0 準雙向口
0 1 推挽輸出
1 0 高阻輸入
1 1 開漏輸出
*/
              P1M1 &= ~(1<<1); P1M0 |=(1<<1); //設置為推挽輸出
              P_SW2 |= (1<<7);
              P1PU = 0x00;//禁止P1端口內部的 3.7K 上拉電阻
              P1NCS = 0xFF; //禁止P1端口的施密特觸發功能。
              P_SW2 &= ~(1<<7);
/*串口1相關配置*/
              P_SW1 &= ~(1 << 6);P_SW1 &= ~(1 << 7); //串口 1 功能腳選擇位
              SCON = 0x50; //模式1 可變波特率8位數據方式
              PCON &= 0x3F; //串口 1 的各個模式的波特率都不加倍 無幀錯檢測功能
              AUXR |= (1 << 0); //選擇定時器 2 作為波特率發射器
              AUXR &= ~(1 << 4);//定時器 2 停止計數,配置完再打開。
              AUXR &= ~(1 << 3);//清0則用作定時器
              AUXR &= ~(1 << 2);//12T 模式,即 CPU 時鐘 12 分頻( FOSC/12)
              T2L = 0xE8; //12T 模式 9600
              T2H = 0xFF;
              IP |= (1<<4);//優先級控制
              IPH |= (1<<4);
              AUXR |= (1 << 4); //啟動定時器 2
              ES = 1; //使能串口1中斷
              EA = 1;//總中斷打開
              LED = 0;//LED滅
              while (1)
              {
              uart1_SendData(100);
              uart1_SendDataFrame("adfgss");
              }
             }

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

8#
ID:140644 發表于 2021-1-25 09:49 | 只看該作者
szb314 發表于 2021-1-25 08:23
說明書仔細研究一下

已經用STC其他系列串口做過不少東西了,以往直接移植就行,就這款STC8G1K08  SOP8串口不工作
回復

使用道具 舉報

9#
ID:752974 發表于 2021-1-25 09:58 | 只看該作者
能燒寫程序,證明硬件,電路均沒有問題,通信不工作就是初始化沒有做好,可能是某些細節沒有注意到,仔細看看說明能有收獲。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

10#
ID:140644 發表于 2021-1-25 10:50 | 只看該作者
電話聯系了,用定時器1做波特率發生器,忘記上次用哪一個定時器了,官方例程都試過。下載軟件讀芯片型號沒說沒有定時器2,草率了,謝謝大伙支持。新年快樂

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

11#
ID:255919 發表于 2021-1-28 17:42 | 只看該作者
czhaii 發表于 2021-1-25 10:50
電話聯系了,用定時器1做波特率發生器,忘記上次用哪一個定時器了,官方例程都試過。下載軟件讀芯片型號沒 ...

STC8G1K08單片機串口通訊用、
void main(void)
     { TR1 = 0;                        //波特率使用Timer1產生
        AUXR &= ~0x01;                //S1 BRT Use Timer1;
        AUXR |=  (1<<6);        //Timer1 set as 1T mode
        TH1 = (u8)(Timer1_Reload >> 8);
        TL1 = (u8)Timer1_Reload;
        TR1  = 1;

       REN = 1;        //允許接收
        ES  = 1;        //允許中斷

        EA = 1;                //允許全局中斷
        }
/********************* UART1中斷函數************************/
void UART1_int (void) interrupt UART1_VECTOR
{
        if(RI)
        {
                RI = 0;
               
        }

        if(TI)
        {
                TI = 0;
               
        }
}

回復

使用道具 舉報

12#
ID:923440 發表于 2021-7-4 17:28 | 只看該作者
樓主,你這個問題解決了嘛,我用的也是這個芯片,串口通信也是調試不出來,請問你是怎么解決的,對了我用的是串口2進行通信,定時器1,跟定時器2都試了,都不行,串口1的就行,請問什么原因
回復

使用道具 舉報

13#
ID:725306 發表于 2021-8-5 21:43 來自觸屏版 | 只看該作者
51c_yang 發表于 2021-7-4 17:28
樓主,你這個問題解決了嘛,我用的也是這個芯片,串口通信也是調試不出來,請問你是怎么解決的,對了我用的 ...

咋么樣?解決了嗎兄弟?我也遇到這個問題了。就用isp軟件生成了下初始化函數,主函數里判斷RI TI使用進不去。有好辦法嗎?
回復

使用道具 舉報

14#
ID:161164 發表于 2021-8-6 00:07 | 只看該作者
4147313 發表于 2021-8-5 21:43
咋么樣?解決了嗎兄弟?我也遇到這個問題了。就用isp軟件生成了下初始化函數,主函數里判斷RI TI使用進不 ...

試了官方代碼了嗎?
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #define FOSC 11059200UL
  4. #define BRT (65536 - FOSC / 115200 / 4)
  5. sfr AUXR = 0x8e;
  6. sfr T2H = 0xd6;
  7. sfr T2L = 0xd7;
  8. sfr S2CON = 0x9a;
  9. sfr S2BUF = 0x9b;
  10. sfr IE2 = 0xaf;
  11. sfr P0M1 = 0x93;
  12. sfr P0M0 = 0x94;
  13. sfr P1M1 = 0x91;
  14. sfr P1M0 = 0x92;
  15. sfr P2M1 = 0x95;
  16. sfr P2M0 = 0x96;
  17. sfr P3M1 = 0xb1;
  18. sfr P3M0 = 0xb2;
  19. sfr P4M1 = 0xb3;
  20. sfr P4M0 = 0xb4;
  21. sfr P5M1 = 0xc9;
  22. sfr P5M0 = 0xca;
  23. bit busy;
  24. char wptr;
  25. char rptr;
  26. char buffer[16];
  27. void Uart2Isr() interrupt 8
  28. {
  29.     if (S2CON & 0x02)
  30.     {
  31.         S2CON &= ~0x02;
  32.         busy = 0;
  33.     }
  34.     if (S2CON & 0x01)
  35.     {
  36.         S2CON &= ~0x01;
  37.         buffer[wptr++] = S2BUF;
  38.         wptr &= 0x0f;
  39.     }
  40. }
  41. void Uart2Init()
  42. {
  43.     S2CON = 0x10;
  44.     T2L = BRT;
  45.     T2H = BRT >> 8;
  46.     AUXR = 0x14;
  47.     wptr = 0x00;
  48.     rptr = 0x00;
  49.     busy = 0;
  50. }
  51. void Uart2Send(char dat)
  52. {
  53.     while (busy);
  54.     busy = 1;
  55.     S2BUF = dat;
  56. }
  57. void Uart2SendStr(char *p)
  58. {
  59.     while (*p)
  60.     {
  61.         Uart2Send(*p++);
  62.     }
  63. }
  64. void main()
  65. {
  66.     P0M0 = 0x00;
  67.     P0M1 = 0x00;
  68.     P1M0 = 0x00;
  69.     P1M1 = 0x00;
  70.     P2M0 = 0x00;
  71.     P2M1 = 0x00;
  72.     P3M0 = 0x00;
  73.     P3M1 = 0x00;
  74.     P4M0 = 0x00;
  75.     P4M1 = 0x00;
  76.     P5M0 = 0x00;
  77.     P5M1 = 0x00;
  78.     Uart2Init();
  79.     IE2 = 0x01;
  80.     EA = 1;
  81.     Uart2SendStr("Uart Test !\r\n");
  82.     while (1)
  83.     {
  84.         if (rptr != wptr)
  85.         {
  86.             Uart2Send(buffer[rptr++]);
  87.             rptr &= 0x0f;
  88.         }
  89.     }
  90. }
復制代碼



回復

使用道具 舉報

15#
ID:155507 發表于 2021-8-6 08:28 | 只看該作者
STC8G1K08-8Pin芯片型號沒有定時器2



  1. #include "reg51.h"
  2. #include "intrins.h"

  3. #define FOSC            11059200UL
  4. #define BRT             (65536 - FOSC / 115200 / 4)

  5. sfr     AUXR        =   0x8e;

  6. bit busy;
  7. char wptr;
  8. char rptr;
  9. char buffer[16];

  10. void UartIsr() interrupt 4
  11. {
  12.     if (TI)
  13.     {
  14.         TI = 0;
  15.         busy = 0;
  16.     }
  17.     if (RI)
  18.     {
  19.         RI = 0;
  20.         buffer[wptr++] = SBUF;
  21.         wptr &= 0x0f;
  22.     }
  23. }

  24. void UartInit()
  25. {
  26.     SCON = 0x50;
  27.     TMOD = 0x00;
  28.     TL1 = BRT;
  29.     TH1 = BRT >> 8;
  30.     TR1 = 1;
  31.     AUXR = 0x40;
  32.     wptr = 0x00;
  33.     rptr = 0x00;
  34.     busy = 0;
  35. }

  36. void UartSend(char dat)
  37. {
  38.     while (busy);
  39.     busy = 1;
  40.     SBUF = dat;
  41. }

  42. void UartSendStr(char *p)
  43. {
  44.     while (*p)
  45.     {
  46.         UartSend(*p++);
  47.     }
  48. }

  49. void main()
  50. {
  51.     UartInit();
  52.     ES = 1;
  53.     EA = 1;
  54.     UartSendStr("Uart Test !\r\n");

  55.     while (1)
  56.     {
  57.         if (rptr != wptr)
  58.         {
  59.             UartSend(buffer[rptr++]);
  60.             rptr &= 0x0f;
  61.         }
  62.     }
  63. }

復制代碼



回復

使用道具 舉報

16#
ID:1103807 發表于 2023-12-12 00:38 | 只看該作者
lkc8210 發表于 2021-8-6 00:07
試了官方代碼了嗎?

試了一下 也是沒反應 串口2 接的 CH340C的 和這個有影響?
回復

使用道具 舉報

17#
ID:161164 發表于 2023-12-12 09:48 | 只看該作者
JJJ2u 發表于 2023-12-12 00:38
試了一下 也是沒反應 串口2 接的 CH340C的 和這個有影響?

如果你是用樓主同款芯片
它只有一個串口


回復

使用道具 舉報

18#
ID:1034262 發表于 2023-12-12 11:28 | 只看該作者
czhaii 發表于 2021-1-24 22:57
測試了好幾天死活出不來,我STC其他芯片挺多,STC15W408 STC15W204 15W1K16SQ IAP系列都有,
串口都可以通 ...

“程序可以下載,覺得應該是芯片問題”?

想多了,STC是串口下載的,如果串口有問題,怎么能串口下載程序呢?這不矛盾嗎?
MCU多少腳的?如果是8腳的,串口要用定時器1做波特率發生器。16腳以上的則可以用定時器1或2均可。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av中文字幕在线播放 | 男女啪啪高潮无遮挡免费动态 | 日韩电影一区 | 一本大道久久a久久精二百 国产成人免费在线 | 波多野结衣一区二区 | 97精品国产一区二区三区 | 天天插天天操 | 久久久久久久久99 | 欧美一区二区在线观看 | 欧美日韩电影一区二区 | 亚洲性人人天天夜夜摸 | 亚洲精品视频网站在线观看 | 日本一区二区三区免费观看 | 一区二区三区免费 | 在线国产精品一区 | 天天综合国产 | 国产精品久久久久久网站 | 成人国产精品入口免费视频 | 欧美一级小视频 | 国产精品资源在线观看 | 亚洲美女一区 | 亚洲草草视频 | 爱爱免费视频 | a级毛片毛片免费观看久潮喷 | 国产免费一区二区三区 | 91精品国产综合久久婷婷香蕉 | 日本韩国欧美在线观看 | 在线播放中文字幕 | 久久r久久 | 久草在线 | 免费观看一级视频 | 91资源在线观看 | 国产99视频精品免费播放照片 | 久久精品成人热国产成 | 国产精品大片在线观看 | 亚洲人人 | 亚洲精品色 | 视频一区二区在线观看 | 国产精品视频一区二区三区四区国 | 亚洲一区二区三区久久 | 精品一区电影 |