找回密码
 立即注册
查看: 298|回复: 11

STC8H1K08-SOP16的硬件PWM怎么用呢?

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-04-16 09:25:32
已绑定手机

5

主题

10

回帖

44

积分

新手上路

积分
44
发表于 2026-3-26 17:23:54 | 显示全部楼层 |阅读模式
STC8H1K08-SOP16的硬件PWM怎么用呢?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:712
  • 最近打卡:2026-07-03 09:07:06
已绑定手机

50

主题

2691

回帖

9338

积分

论坛元老

积分
9338
发表于 2026-3-26 19:02:02 | 显示全部楼层
可参考8H实验箱例程包里面的PWM例子:
23-高级PWM1-PWM2-PWM3-PWM4,驱动P6口呼吸灯实验程序
24-高级PWM5-PWM6-PWM7-PWM8输出测试程序
  1.     PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
  2.     PWMA_CCER2 = 0x00;
  3.     PWMA_CCMR1 = 0x60; //通道模式配置
  4.     PWMA_CCMR2 = 0x60;
  5.     PWMA_CCMR3 = 0x60;
  6.     PWMA_CCMR4 = 0x60;
  7.     PWMA_CCER1 = 0x55; //配置通道输出使能和极性
  8.     PWMA_CCER2 = 0x55;
  9.     PWMA_CCMR1 |= 0x08; //开启PWMA_CCRx预装载功能(需要CCxE=1才可写)
  10.     PWMA_CCMR2 |= 0x08;
  11.     PWMA_CCMR3 |= 0x08;
  12.     PWMA_CCMR4 |= 0x08;
  13.     PWMA_ARRH = (u8)(PWM_PERIOD >> 8); //设置周期时间
  14.     PWMA_ARRL = (u8)PWM_PERIOD;
  15.     PWMA_ENO = 0x00;
  16.     PWMA_ENO |= ENO1P; //使能输出
  17.     PWMA_ENO |= ENO1N; //使能输出
  18.     PWMA_ENO |= ENO2P; //使能输出
  19.     PWMA_ENO |= ENO2N; //使能输出
  20.     PWMA_ENO |= ENO3P; //使能输出
  21.     PWMA_ENO |= ENO3N; //使能输出
  22.     PWMA_ENO |= ENO4P; //使能输出
  23.     PWMA_ENO |= ENO4N; //使能输出
  24.     PWMA_PS = 0x00;  //高级 PWM 通道输出脚选择位
  25.     PWMA_PS |= PWM1_3; //选择 PWM1_3 通道
  26.     PWMA_PS |= PWM2_3; //选择 PWM2_3 通道
  27.     PWMA_PS |= PWM3_3; //选择 PWM3_3 通道
  28.     PWMA_PS |= PWM4_3; //选择 PWM4_3 通道
  29.     PWMA_BKR = 0x80; //使能主输出
  30.     PWMA_CR1 |= 0x01; //开始计时
复制代码

实验箱例程包下载页面:https://www.stcai.com/syx
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-04-16 09:25:32
已绑定手机

5

主题

10

回帖

44

积分

新手上路

积分
44
发表于 2026-3-27 11:35:32 | 显示全部楼层
乘风*** 发表于 2026-3-26 19:02
可参考8H实验箱例程包里面的PWM例子:
23-高级PWM1-PWM2-PWM3-PWM4,驱动P6口呼吸灯实验程序
24-高级PWM5-P ...

没有单个片内外设的视频教学吗?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:712
  • 最近打卡:2026-07-03 09:07:06
已绑定手机

50

主题

2691

回帖

9338

积分

论坛元老

积分
9338
发表于 2026-3-27 15:30:08 | 显示全部楼层
eiay*** 发表于 2026-3-27 11:35
没有单个片内外设的视频教学吗?

论坛教学视频栏目里面有PWM以及其它外设的教学视频
https://www.stcaimcu.com/x7ree_v-x7ree_v.html?fenlei=4
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-04-16 09:25:32
已绑定手机

5

主题

10

回帖

44

积分

新手上路

积分
44
发表于 2026-3-27 17:17:02 | 显示全部楼层
乘风*** 发表于 2026-3-26 19:02
可参考8H实验箱例程包里面的PWM例子:
23-高级PWM1-PWM2-PWM3-PWM4,驱动P6口呼吸灯实验程序
24-高级PWM5-P ...

帮忙看一下,这个是串口没有初始化好吗?P35接的是LED灯。现在灯不亮。串口数据是接收433解码芯片出来的四个字节,只有第三个字节是不一样的。
#include <STC8G.H>
unsigned char buf[4];
unsigned char cnt = 0;

// 标准唯一正确串口初始化 11.0592 9600
void UART_Init(void)
{
    SCON = 0x50;
    TMOD = 0x20;
    TH1 = 0xFD; TL1 = 0xFD;
    TR1 = 1;
    ES = 1; EA = 1;
}

void UART_ISR() interrupt 4
{
    if(RI){RI=0; if(cnt<4)buf[cnt++]=SBUF;}
}

void main(void)
{
  P3M0 = 0x20; P3M1 = 0x00;  
        P35 = 0;   // 上电强制熄灭,彻底解决常亮
    UART_Init();

    while(1)
    {
        if(cnt == 4)
        {
            if(buf[0]==0x24 && buf[1]==0x94 && buf[3]==0x02)
            {
                switch(buf[2])
                {
                    case 0x01: P35=0; break;
                    case 0x03: P35=1; break;
                    case 0x07: P35=0; break;
                    case 0x0A: P35=1; break;
                    case 0x0D: P35=0; break;
                }
            }
            cnt = 0;
        }
    }
}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:712
  • 最近打卡:2026-07-03 09:07:06
已绑定手机

50

主题

2691

回帖

9338

积分

论坛元老

积分
9338
发表于 2026-3-27 17:28:41 | 显示全部楼层
串口初始化代码可使用ISP软件的工具生成
截图202603271728261565.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-04-16 09:25:32
已绑定手机

5

主题

10

回帖

44

积分

新手上路

积分
44
发表于 2026-3-27 18:03:30 | 显示全部楼层
乘风*** 发表于 2026-3-27 17:28
串口初始化代码可使用ISP软件的工具生成

P35是控制LED灯的。按这个来初始化了。P35一样没有输出,串口接收不到数据。
即使直接把P35置1置0,都没有亮。哪里出问题了?
#include <STC8G.H>
typedef unsigned char u8;

// 你的固定指令
#define CMD_ON     0x01   //全亮100%
#define CMD_OFF    0x03   //灭0%
#define CMD_MODE1  0x07   //20%微亮
#define CMD_MODE2  0x0A   //灭
#define CMD_MODE3  0x0D   //全亮100%

u8 buf[4];
u8 idx = 0;

//===== 极简软件PWM全局变量 =====
u8 duty = 0;    //占空比 0~100
u8 cnt  = 0;

void Delay1000ms(void)        //@11.0592MHz
{
        unsigned char data i, j, k;

        _nop_();
        _nop_();
        i = 43;
        j = 6;
        k = 203;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

//===== T0中断做PWM 1kHz 不卡串口 =====
void Timer0_Init(void)
{
    TMOD |= 0x01;
    TH0 = 0xF8; TL0 = 0xF8;
    ET0 = 1; TR0 = 1;
}
void T0_ISR(void) interrupt 1
{
    TH0 = 0xF8; TL0 = 0xF8;
    cnt++;
    if(cnt >= 100) cnt = 0;
    P35 = (cnt < duty) ? 0 : 1; //低电平点亮LED
}

//===== 串口最简稳配置 9600 11.0592 =====
void Uart1_Init(void)        //9600bps@11.0592MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器时钟1T模式
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //设置定时器模式
        TL1 = 0xE0;                        //设置定时初始值
        TH1 = 0xFE;                        //设置定时初始值
        ET1 = 0;                        //禁止定时器中断
        TR1 = 1;                        //定时器1开始计时
}
void UartISR(void) interrupt 4
{
    if(RI)
    {
        RI = 0;
        if(idx < 4) buf[idx++] = SBUF;
    }
}

void main(void)
{
    P3M0 = 0x20; P3M1 = 0x00;
                P35 = 0;
    Timer0_Init();
    Uart1_Init();

    while(1)
    {
        if(idx == 4)
        {
            //校验帧头尾:24 94 xx 02
            if(buf[0]==0x24 && buf[1]==0x94 && buf[3]==0x01)
            {
                switch(buf[2])
                {
                    case CMD_OFF:   P35=0;//duty = 0;  break;   //关灯
                    case CMD_ON:    P35=1;//duty = 100;break;   //全亮
                    case CMD_MODE1: duty = 20; break;   //20%微亮
                    case CMD_MODE2: duty = 0;  break;
                    case CMD_MODE3: duty = 100;break;
                }
            }
            idx = 0;
        }
//                                Delay1000ms();  //以下用于测试
//                                P35=1;
//                                Delay1000ms();
//                                P35=0;                               
    }
}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:712
  • 最近打卡:2026-07-03 09:07:06
已绑定手机

50

主题

2691

回帖

9338

积分

论坛元老

积分
9338
发表于 2026-3-27 18:41:55 | 显示全部楼层
写个接收串口命令开关灯的例子,供参考

串口1接收命令开关灯.zip

8.94 KB, 下载次数: 11

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-04-16 09:25:32
已绑定手机

5

主题

10

回帖

44

积分

新手上路

积分
44
发表于 2026-4-3 15:17:18 | 显示全部楼层
定时器2怎么关闭?
截图202604031516551498.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2026-07-03 08:57:36

830

主题

1万

回帖

2万

积分

管理员

积分
23929
发表于 2026-4-3 15:28:06 | 显示全部楼层
截图202604031528023065.jpg
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-5 09:57 , Processed in 0.079602 second(s), 82 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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