找回密码
 立即注册
楼主: 王昱顺

【AI助手】@AiCube-ISP-V6.96Z中,【自动生成程序】+【查错高手】

 火.. [复制链接]
  • 打卡等级:常住居民I
  • 打卡总天数:71
  • 最近打卡:2026-07-23 07:26:06
已绑定手机

1

主题

10

回帖

255

积分

中级会员

积分
255
发表于 2026-6-22 11:36:33 | 显示全部楼层
SCT8H8K64U 单片机 写一个用PWMB的P2.0管脚控制LED灯亮度的程序,要求P3.0按下时,占空比提高10%,P3.1按下时,占空比减少10%

AI
好的,以下是基于 STC8H8K64U 的完整程序,使用 PWMB 通道5(PWM5) 从 P2.0 输出 PWM 驱动 LED,P3.0 按下占空比增加 10%,P3.1 按下占空比减少 10%。

完整程序代码
/*---------------------------------------------------------------------*/
/* --- STC8H8K64U  PWMB(PWM5) 输出P2.0 控制LED亮度                  */
/* --- P3.0 按下 → 占空比 +10%,P3.1 按下 → 占空比 -10%             */
/* --- 主频: 24MHz (内部IRC)                                         */
/*---------------------------------------------------------------------*/

#include "stc8h.h"
#include "intrins.h"

#define MAIN_Fosc    24000000L    // 主时钟频率 24MHz

#define PWM_PERIOD   1000         // PWM周期 (ARR+1 = 1000)
#define DUTY_STEP    100          // 每步 10% (1000 × 10% = 100)

u16 pwm_duty;                     // 当前占空比比较值

//========================================================================
// 函数: Delay20ms()
// 描述: 按键消抖延时 (约20ms @ 24MHz)
//========================================================================
void Delay20ms(void)
{
    unsigned int i;
    for(i = 0; i < 60000; i++);
}

//========================================================================
// 函数: PWM_Init()
// 描述: PWMB 通道5(PWM5) 初始化,输出到 P2.0
//========================================================================
void PWM_Init(void)
{
    P_SW2 |= 0x80;              // 使能扩展寄存器(XFR)访问

    /*--- 设置 I/O 口模式 ---*/
    // P2.0 配置为推挽输出 (PWM输出)
    P2M1 &= ~0x01;
    P2M0 |=  0x01;

    // P3.0、P3.1 配置为准双向口 (按键输入,内部有弱上拉)
    P3M1 &= ~0x03;
    P3M0 &= ~0x03;

    /*--- PWMB 通道5 (PWM5) 输出到 P2.0 ---*/
    PWMB_PS = 0x00;             // C5PS[1:0]=00 → PWM5 输出到 P2.0

    PWMB_CCER1 = 0x00;          // 先关闭通道,才能配置 CCMR1
    PWMB_CCMR1 = 0x60;          // OC5M[2:0]=110(PWM模式1) 向上计数时
                                // CNT<CCR5 输出高,否则输出低
                                // OC5PE=1(使能预装载)
                                // CC5S[1:0]=00(输出模式)
    PWMB_CCER1 = 0x01;          // CC5E=1(使能通道5输出), CC5P=0(高电平有效)

    // PWM频率 = 主频 / (PSCR+1) / (ARR+1)
    //         = 24MHz / 24 / 1000 = 1KHz
    PWMB_PSCR = 24 - 1;          // 预分频,得到 1MHz 时钟
    PWMB_ARR  = PWM_PERIOD - 1;  // 自动重装载值 (周期 = 1000)

    pwm_duty = 500;              // 初始占空比 50%
    PWMB_CCR5 = pwm_duty;        // 写入比较值

    PWMB_ENO  = 0x01;            // ENO5P=1 → 使能 PWM5 端口输出
    PWMB_BKR  = 0x80;            // MOEB=1  → 使能主输出
    PWMB_CR1  = 0x81;            // ARPE=1(ARR预装载), CENB=1(启动计时)
}

//========================================================================
// 函数: main()
// 描述: 主函数,循环检测按键并调整占空比
//========================================================================
void main(void)
{
    PWM_Init();

    while(1)
    {
        //---- 检测 P3.0 按下 (低电平有效) ----
        if((P3 & 0x01) == 0)
        {
            Delay20ms();                      // 去抖动
            if((P3 & 0x01) == 0)              // 确认按下
            {
                // 占空比增加 10%
                if(pwm_duty + DUTY_STEP <= PWM_PERIOD)
                    pwm_duty += DUTY_STEP;
                else
                    pwm_duty = PWM_PERIOD;    // 上限 100%

                PWMB_CCR5 = pwm_duty;         // 更新比较值 → 立即改变占空比

                // 等待按键释放
                while((P3 & 0x01) == 0);
                Delay20ms();
            }
        }

        //---- 检测 P3.1 按下 (低电平有效) ----
        if((P3 & 0x02) == 0)
        {
            Delay20ms();                      // 去抖动
            if((P3 & 0x02) == 0)              // 确认按下
            {
                // 占空比减少 10%
                if(pwm_duty >= DUTY_STEP)
                    pwm_duty -= DUTY_STEP;
                else
                    pwm_duty = 0;             // 下限 0%

                PWMB_CCR5 = pwm_duty;         // 更新比较值 → 立即改变占空比

                // 等待按键释放
                while((P3 & 0x02) == 0);
                Delay20ms();
            }
        }
    }
}
📋
程序说明
1. PWM 硬件配置
项目        配置        说明
PWMB 通道        通道5 (PWM5)        PWMB 共有 4 个输出通道 (PWM5~PWM8)
输出引脚        P2.0        通过 PWMB_PS 的 C5PS[1:0]=00 选择
PWM 模式        PWM 模式1 (OC5M=110)        向上计数时,CNT<CCR5 输出高,否则输出低
PWM 频率        1KHz        24MHz / (23+1) / (999+1) = 1KHz,适合 LED 调光
极性        高电平有效 (CC5P=0)        PWM 高电平时间 = 占空比
2. 按键检测逻辑
P3.0 按下(接地) → pwm_duty += 100 → 占空比提高 10%
P3.1 按下(接地) → pwm_duty -= 100 → 占空比减少 10%
每次按键后等待释放再加 20ms 消抖,防止一次按下多次触发
占空比范围自动限制在 0 ~ 1000(对应 0% ~ 100%)
3. 初始状态
初始占空比设为 50%(pwm_duty = 500)
每次按键步进 10%(DUTY_STEP = 100)
4. 硬件接线
STC8H8K64U              LED 电路
┌──────────┐
│ P2.0     ├─────┬───── LED ── 220Ω ── VCC (或 GND,取决于LED接法)
│          │     │
│          │    [LED]
│          │
│ P3.0     ├───── 按键 ──── GND         (按下=低电平,占空比+10%)
│          │
│ P3.1     ├───── 按键 ──── GND         (按下=低电平,占空比-10%)
└──────────┘
📋
说明:由于程序配置为高电平有效(CC5P=0),LED 正极接 P2.0,负极串电阻到 GND 时,占空比越大 LED 越亮。若 LED 接法相反,可将 CC5P 改为 1(低电平有效)或硬件上改变 LED 方向。

关键寄存器参考(来自 STC8H 数据手册)
寄存器        地址        本程序设置值        作用
PWMB_PS        FEB6H        0x00        C5PS=00,PWM5输出到P2.0([25.9.1节])
PWMB_CCMR1        FEE8H        0x60        OC5M=110(PWM模式1),OC5PE=1(预装载)([25.9.12节])
PWMB_CCER1        FEECH        0x01        CC5E=1(使能输出),CC5P=0(高有效)([25.9.16节])
PWMB_ENO        FEB5H        0x01        ENO5P=1(使能PWM5引脚输出)([25.9.2节])
PWMB_BKR        FEFDH        0x80        MOEB=1(主输出使能)([25.9.33节])
PWMB_CR1        FEE0H        0x81        ARPE=1(ARR预装载),CENB=1(启动)([25.9.4节])
编译下载提示:在 Keil 中使用 STC8H8K64U 头文件,下载时选择 24MHz 内部IRC时钟,硬件连接好 P3.0/P3.1 按键和 P2.0 LED 即可运行。

编译时提示错误 main.c(13): error C129: missing ';' before 'pwm_duty'
手动将 u16 pwm_duty;   u16 pwm_duty;  修改为 unsigned int pwm_duty; 编译通过。下载程序后,程序正常运行。
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:80
  • 最近打卡:2026-07-23 09:43:10

30

主题

100

回帖

1064

积分

版主

积分
1064
发表于 2026-6-22 11:43:55 | 显示全部楼层
有问必答,
www.STCAIMCU.com【AI助手】:

AI8051U替代12C5A16S2注意事项
截图202606221142455712.jpg
截图202606221142585733.jpg

截图202606221143136851.jpg
截图202606221143209890.jpg
截图202606221143494816.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2026-06-24 10:53:06
已绑定手机

2

主题

18

回帖

89

积分

注册会员

积分
89
发表于 2026-6-22 11:47:52 | 显示全部楼层
有问必答,
www.STCAIMCU.com【AI助手】:
STC15W408AS的系统时钟分频如何配置,怎样实现精准延时?

截图202606221146548741.jpg
截图202606221147029961.jpg
截图202606221147137319.jpg
截图202606221147212005.jpg




回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:86
  • 最近打卡:2026-07-23 14:41:35

25

主题

213

回帖

2149

积分

版主

积分
2149
发表于 2026-6-22 11:48:41 | 显示全部楼层
有问必答,
www.STCAIMCU.com【AI助手】:
如何测量72MHz以下的外部信号,STC32的144MHz的高速PWM

截图202606221145466532.jpg
截图202606221147204036.jpg

截图202606221147431649.jpg

截图202606221148104581.jpg
截图202606221148244332.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:86
  • 最近打卡:2026-07-23 14:43:43

29

主题

186

回帖

1985

积分

版主

积分
1985
发表于 2026-6-22 11:51:20 | 显示全部楼层
www.STCAIMCU.com【AI助手】:


--推荐一款可以用于汽车呼吸灯项目的单片机型号
--AI助手回答内容可以采纳。
截图202606221150298834.jpg
截图202606221150542981.jpg
截图202606221151163525.jpg

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:106
  • 最近打卡:2026-07-23 10:53:13

50

主题

357

回帖

2860

积分

超级版主

积分
2860
发表于 2026-6-22 13:25:38 | 显示全部楼层
www.STCAIMCU.com【AI助手】:



STC32G144K246的CAN-FD的使用注意事项

截图202606221323137412.jpg

截图202606221323398871.jpg

截图202606221324038337.jpg

截图202606221324232302.jpg

截图202606221324481864.jpg

截图202606221325023006.jpg

截图202606221325267406.jpg

QQ:3398500488
微信号:18106296592(小刘)
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:107
  • 最近打卡:2026-07-23 11:20:05

38

主题

500

回帖

3353

积分

版主

积分
3353
QQ
发表于 2026-6-22 13:39:06 | 显示全部楼层

有问必答,
www.STCAIMCU.com【AI助手】:
STC8H8K驱动8050三极管,IO口用什么模式
截图202606221337425969.jpg
截图202606221338105317.jpg
截图202606221338396502.jpg
截图202606221338586773.jpg

QQ:1463035472,微信:19952583954
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:99
  • 最近打卡:2026-07-23 10:17:51
已绑定手机

35

主题

139

回帖

1183

积分

版主

积分
1183
发表于 2026-6-22 13:48:45 | 显示全部楼层
有问必答,
www.STCAIMCU.com【AI助手】:

使用型号STC8G1K08,帮我写一个P5.4输出时钟的例程
截图202606221347325197.jpg
截图202606221347494026.jpg
截图202606221348066234.jpg
截图202606221348212232.jpg
截图202606221348362570.jpg


回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:166
  • 最近打卡:2026-07-23 08:53:54

32

主题

191

回帖

1720

积分

版主

积分
1720
发表于 2026-6-22 13:53:55 | 显示全部楼层
有问必答,
www.STCAIMCU.com【AI助手】:

STC8G1K08-SOP16取代8F1K08S2-SOP16的注意事项
截图202606221352062381.jpg
截图202606221352472839.jpg
截图202606221353041942.jpg
截图202606221353342671.jpg
截图202606221353518402.jpg


回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:247
  • 最近打卡:2026-07-23 11:47:39

38

主题

232

回帖

2497

积分

版主

积分
2497
发表于 2026-6-22 14:36:36 | 显示全部楼层
有问必答,
www.STCAIMCU.com【AI助手】:
STC8H系列MCU的uart,即P30P31可以直接接3.3V吗?

截图202606221436569124.jpg
截图202606221437088667.jpg
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-7-23 20:14 , Processed in 0.078612 second(s), 92 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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