姓伍的 发表于 2025-7-6 14:22:52

关于S2CON, STC8H1K08T | 【ISP软件,范例程序】中有 串口2的演示程序

大家好!

芯片STC8G1K08T芯片的S2CON始终为0X00,不能修改,是什么原因?

姓伍的 发表于 2025-7-6 14:46:38

SCON能够改变;下面程序不能运行。

#include <stc8h.h>
void Uart2_Init(void)      //2400bps @11.0592MHz
{
               P_SW2 = 0x80;      //b7=1:允许访问RAM区的特寄存器 (8位模式请使用这句,注释上一句);默认值为0   

   
      S2CON = 0x50;       //8位数据,可变波特率;无法改变; B1111_1101  ???
      AUXR &= 0xFB;       //定时器时钟12T模式
      T2L = 0xA0;         //设置定时初始值
      T2H = 0xFF;         //设置定时初始值
      AUXR |= 0x10;       //定时器2开始计时
    //    EA = 1;         //总中断打开
    //    IE2 = 0;          //关闭串口2中断
}

void main(void)
{
      Uart2_Init();

      while(1){
      S2BUF = 0xA5;
      while (!(S2CON &0x02));   //清S2TI
      S2CON &= 0x0FD;               
      }
}

神农鼎 发表于 2025-7-6 14:47:16







神农鼎 发表于 2025-7-6 14:48:02

#include "reg51.h"
#include "intrins.h"

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

sfr   AUXR    =   0x8e;
sfr   T2H   =   0xd6;
sfr   T2L   =   0xd7;
sfr   S2CON   =   0x9a;
sfr   S2BUF   =   0x9b;
sfr   IE2   =   0xaf;

sfr   P0M1    =   0x93;
sfr   P0M0    =   0x94;
sfr   P1M1    =   0x91;
sfr   P1M0    =   0x92;
sfr   P2M1    =   0x95;
sfr   P2M0    =   0x96;
sfr   P3M1    =   0xb1;
sfr   P3M0    =   0xb2;
sfr   P4M1    =   0xb3;
sfr   P4M0    =   0xb4;
sfr   P5M1    =   0xc9;
sfr   P5M0    =   0xca;

bit busy;
char wptr;
char rptr;
char buffer;

void Uart2Isr() interrupt 8
{
    if (S2CON & 0x02)
    {
      S2CON &= ~0x02;
      busy = 0;
    }
    if (S2CON & 0x01)
    {
      S2CON &= ~0x01;
      buffer = S2BUF;
      wptr &= 0x0f;
    }
}

void Uart2Init()
{
    S2CON = 0x10;
    T2L = BRT;
    T2H = BRT >> 8;
    AUXR = 0x14;
    wptr = 0x00;
    rptr = 0x00;
    busy = 0;
}

void Uart2Send(char dat)
{
    while (busy);
    busy = 1;
    S2BUF = dat;
}

void Uart2SendStr(char *p)
{
    while (*p)
    {
      Uart2Send(*p++);
    }
}

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

    Uart2Init();
    IE2 = 0x01;
    EA = 1;
    Uart2SendStr("Uart Test !\r\n");

    while (1)
    {
      if (rptr != wptr)
      {
            Uart2Send(buffer);
            rptr &= 0x0f;
      }
    }
}


神农鼎 发表于 2025-7-6 14:51:41


https://www.stcaimcu.com/data/download/Datasheet/STC8H.pdf





姓伍的 发表于 2025-7-6 18:51:01

谢谢!
你提供的程序存在同样的问题,S2CON寄存器的内容不能配置,始终为0,

神农鼎 发表于 2025-7-6 19:35:23



8H/8G/8C/8A系列4组串口同时通信的程序,Modbus 演示程序;可共享T2做波特率发生器 - 串行口,DMA支持的4组串口,RS232,RS485,Modbus, CRC16 国芯技术交流网站 - AI32位8051交流社区



DebugLab 发表于 2025-7-7 08:37:47

8H上电高阻,你没有设置IO模式
可以看下我的串口程序(以串口1为例)
https://www.stcaimcu.com/thread-16321-1-1.html
以下是串口2程序:
初始化:
P_SW2|=0x80;
P0M0=0x00;
P0M1=0x00;
P1M0=0x00;
P1M1=0x00;
P2M0=0x00;
P2M1=0x00;
P3M0=0x00;
P3M1=0x00;
P4M0=0x00;
P4M1=0x00;
P5M0=0x00;
P5M1=0x00;
P6M0=0x00;
P6M1=0x00;
P7M0=0x00;
P7M1=0x00;
//IO模式根据需要设置
P_SW2|=0x01;                                        //设置UART2端口为UART2_2
      AUXR=0x15;                                                //设置定时器0为12T模式,设置定时器1为12T模式,使能定时器2,设置定时器2为1T模式
      TMOD=0x00;                                                //设置定时器0为16位自动重载模式,设置定时器1为16位自动重载模式
      TL0=0x00;                                                //设置定时器0初值(5ms)
      TH0=0xDC;                                                //设置定时器0初值(5ms)
      ET0=1;                                                      //使能定时器0中断
      
      SCON=0x50;                                                //UART1模式为8位数据,可变波特率
      S2CON=S2REN;                                        //UART2模式为8位数据,可变波特率
      T2L=BRT;                                                //设置波特率
    T2H=BRT>>8;                                                //设置波特率
      ES=1;                                                      //使能UART1中断
      IE2|=ES2;                                                //使能UART2中断
EA=1;                                                      //使能总中断中断:
void Uart2_Isr(void) interrupt 8
{
      if(S2CON&S2RI)
      {
                S2CON&=~S2RI;
                //接收
      }
      if(S2CON&S2TI)
      {
                S2CON&=~S2TI;
                //发送
      }
}

姓伍的 发表于 2025-7-7 13:10:44

STC8G1K08T几年前寄来的,是试制品?昨天新买两片不带T的,STC8H1K08及STC8G1K08能正常读写S2CON了

DebugLab 发表于 2025-7-7 13:32:16

姓伍的 发表于 2025-7-7 13:10
STC8G1K08T几年前寄来的,是试制品?昨天新买两片不带T的,STC8H1K08及STC8G1K08能正常读写S2CON了 ...

T不是触摸按键(Touch Key)???
没听说过这个型号
页: [1] 2
查看完整版本: 关于S2CON, STC8H1K08T | 【ISP软件,范例程序】中有 串口2的演示程序