找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8160|回复: 18
收起左侧

STC8G1K08单片机串口通讯无反应

  [复制链接]
ID:140644 发表于 2021-1-24 16:58 | 显示全部楼层 |阅读模式
一个STC8G1K08  SOP小板子,用到串口控制HMI触摸屏,
参考STC下载软件自带例程,以及
STC实验板的例程,都无法接收发送数据。
用USB---TTL下载线可以烧写程序,
串口以外的IO可以定时输出脉冲,
就是串口无反应,大家有没有遇到过?
回复

使用道具 举报

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均可。
回复

使用道具 举报

ID:161164 发表于 2023-12-12 09:48 | 显示全部楼层
JJJ2u 发表于 2023-12-12 00:38
试了一下 也是没反应 串口2 接的 CH340C的 和这个有影响?

如果你是用楼主同款芯片
它只有一个串口
2023-12-12_094724.png

回复

使用道具 举报

ID:1103807 发表于 2023-12-12 00:38 | 显示全部楼层
lkc8210 发表于 2021-8-6 00:07
试了官方代码了吗?

试了一下 也是没反应 串口2 接的 CH340C的 和这个有影响?
回复

使用道具 举报

ID:155507 发表于 2021-8-6 08:28 | 显示全部楼层
STC8G1K08-8Pin芯片型号没有定时器2
STC8G1K08-8Pin.jpg


  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. }

复制代码



回复

使用道具 举报

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. }
复制代码



回复

使用道具 举报

ID:725306 发表于 2021-8-5 21:43 来自手机 | 显示全部楼层
51c_yang 发表于 2021-7-4 17:28
楼主,你这个问题解决了嘛,我用的也是这个芯片,串口通信也是调试不出来,请问你是怎么解决的,对了我用的 ...

咋么样?解决了吗兄弟?我也遇到这个问题了。就用isp软件生成了下初始化函数,主函数里判断RI TI使用进不去。有好办法吗?
回复

使用道具 举报

ID:923440 发表于 2021-7-4 17:28 | 显示全部楼层
楼主,你这个问题解决了嘛,我用的也是这个芯片,串口通信也是调试不出来,请问你是怎么解决的,对了我用的是串口2进行通信,定时器1,跟定时器2都试了,都不行,串口1的就行,请问什么原因
回复

使用道具 举报

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

回复

使用道具 举报

ID:140644 发表于 2021-1-25 10:50 | 显示全部楼层
电话联系了,用定时器1做波特率发生器,忘记上次用哪一个定时器了,官方例程都试过。下载软件读芯片型号没说没有定时器2,草率了,谢谢大伙支持。新年快乐

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:752974 发表于 2021-1-25 09:58 | 显示全部楼层
能烧写程序,证明硬件,电路均没有问题,通信不工作就是初始化没有做好,可能是某些细节没有注意到,仔细看看说明能有收获。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:140644 发表于 2021-1-25 09:49 | 显示全部楼层
szb314 发表于 2021-1-25 08:23
说明书仔细研究一下

已经用STC其他系列串口做过不少东西了,以往直接移植就行,就这款STC8G1K08  SOP8串口不工作
回复

使用道具 举报

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 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:65956 发表于 2021-1-25 08:33 | 显示全部楼层
程序帖出来看才能帮你分析啊,最主要是下载时晶振选择要和例程中写的一样
回复

使用道具 举报

ID:807591 发表于 2021-1-25 08:23 | 显示全部楼层
说明书仔细研究一下
回复

使用道具 举报

ID:140644 发表于 2021-1-24 22:57 | 显示全部楼层
测试了好几天死活出不来,我STC其他芯片挺多,STC15W408 STC15W204 15W1K16SQ IAP系列都有,
串口都可以通讯,就是STC8G1K08  SOP串口不工作,但是程序可以下载,觉得应该是芯片问题。
回复

使用道具 举报

ID:390416 发表于 2021-1-24 21:18 | 显示全部楼层
STC单片机串口发送 不需要while死等  http://www.51hei.com/bbs/dpj-200927-1.html
回复

使用道具 举报

ID:390416 发表于 2021-1-24 17:50 | 显示全部楼层
那你参考这个贴子的:http://www.51hei.com/bbs/dpj-200927-1.html
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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