找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 683|回复: 3
收起左侧

stc8g1k08a单片机串口返回数据终于无乱码了 波特率9600正常显示

[复制链接]
ID:1167140 发表于 2026-1-31 09:09 | 显示全部楼层 |阅读模式
#include "STC8G.H"

// 串口发送"你好世界"的GB2312编码对照表:
// "你"的GB2312编码:0xC4, 0xE3
// "好"的GB2312编码:0xBA, 0xC3  
// "世"的GB2312编码:0xCA, 0xC0
// "界"的GB2312编码:0xBD, 0xE7

void main()
{
    unsigned int i;
   
    // 配置P3.1引脚模式(串口TXD引脚,推挽输出)
    P3M0 = 0x02;
   
    // 串口初始化配置
    SCON = 0x40;  // 串口工作模式1(8位UART,波特率可变)
    TMOD = 0x20;  // 定时器1工作模式2(8位自动重装)
    TH1 = 0xE8;   // 定时器1重装值,对应1200波特率(11.0592MHz晶振)
    TL1 = 0xE8;
    TR1 = 1;      // 启动定时器1(作为串口波特率发生器)
   
    // 上电延时,确保硬件稳定
    for(i = 0; i < 60000; i++);
   
    while(1)
    {
        // 发送"你"(GB2312双字节编码)
        SBUF = 0xC4; while(!TI); TI = 0;
        SBUF = 0xE3; while(!TI); TI = 0;
        
        // 发送"好"(GB2312双字节编码)
        SBUF = 0xBA; while(!TI); TI = 0;
        SBUF = 0xC3; while(!TI); TI = 0;
        
        // 发送"世"(GB2312双字节编码)
        SBUF = 0xCA; while(!TI); TI = 0;
        SBUF = 0xC0; while(!TI); TI = 0;
        
        // 发送"界"(GB2312双字节编码)
        SBUF = 0xBD; while(!TI); TI = 0;
        SBUF = 0xE7; while(!TI); TI = 0;
        
        // 发送回车+换行符,优化串口显示格式
        SBUF = '\r'; while(!TI); TI = 0;
        SBUF = '\n'; while(!TI); TI = 0;
        
        // 延时约1秒,控制发送频率
        for(i = 0; i < 12000; i++);
    }
}
回复

使用道具 举报

ID:1155837 发表于 2026-2-4 18:48 | 显示全部楼层
学习了,原来这么简单啊,之前看别人写的USBCDC好复杂
回复

使用道具 举报

ID:1133081 发表于 2026-2-4 20:19 | 显示全部楼层
可以直接发汉字
无标题.jpg

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

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

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

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

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

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

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

  48. void main()
  49. {
  50.     P0M0 = 0x00;
  51.     P0M1 = 0x00;
  52.     P1M0 = 0x00;
  53.     P1M1 = 0x00;
  54.     P2M0 = 0x00;
  55.     P2M1 = 0x00;
  56.     P3M0 = 0x00;
  57.     P3M1 = 0x00;
  58.     P4M0 = 0x00;
  59.     P4M1 = 0x00;
  60.     P5M0 = 0x00;
  61.     P5M1 = 0x00;

  62.     UartInit();
  63.     ES = 1;
  64.     EA = 1;
  65.     UartSendStr("欢迎使用 !\r\n");

  66.     while (1)
  67.     {
  68.         if (rptr != wptr)
  69.         {
  70.             UartSend(buffer[rptr++]);
  71.             rptr &= 0x0f;
  72.         }
  73.     }
  74. }

复制代码



回复

使用道具 举报

ID:1161211 发表于 2026-2-4 21:21 | 显示全部楼层
千早爱音爱玩51 发表于 2026-2-4 18:48
学习了,原来这么简单啊,之前看别人写的USBCDC好复杂

这个程序仅是单向发送,没有交互及功能控制相对简单,但对于原理的理解是有帮助的。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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