zhange 发表于 2024-5-27 09:55:17

我刚学到stc32的pmw你这是stc哪个型号?

vb2002 发表于 2024-5-27 10:13:16

乘风飞扬 发表于 2024-5-27 09:21
这是PCA型PWM模式介绍,而你在1楼帖的代码是15位增强型PWM的设置。
增强型PWM通过PWMxxT1, PWMxxT2两个寄 ...

谢谢哥,我用的8位的pwm,另一个贴,已经有点点懂了
确实是您说的这样

vb2002 发表于 2024-5-27 10:13:54

angmall 发表于 2024-5-27 09:42
你是不是还用这个stc8g1k08a做实验?

stc8g1k08a是没有增强型PWM的。

对的,,我已经用的8位试了,可以
#include "intrins.h"
#include <STC8G.H>

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;
    P6M0 = 0x00; P6M1 = 0x00;
    P7M0 = 0x00; P7M1 = 0x00;

       
       
    // PCA初始化
    CCON=0x00; // 清除PCA控制寄存器
    CMOD=0x08; // PCA计数模式配置(例如,定时器模式)
    CL=0x00;   // PCA计数器低位
    CH=0x00;   // PCA计数器高位

    // 配置PCA通道1为PWM模式,并启用中断(如果需要)
    CCAPM1=0x42; // 设置PCA通道1为PWM模式,并启用中断(如果需要)
    PCA_PWM1=0x40; // 设置PCA通道1的PWM输出为高有效

    // 设置PCA通道1的捕获/比较寄存器,用于定义PWM的占空比
    // 这里需要根据实际情况调整CCAP1L和CCAP1H的值
    CCAP1L=0xFF; // PCA通道1的捕获/比较值低位
    CCAP1H=0x02; // PCA通道1的捕获/比较值高位

    // 启动PCA
    CR=1;

    // ... 如果需要其他功能或配置,可以在这里添加 ...

    while (1)
    {
          if(P32==0)
                  
                  CCAP1H=0x29;
          else
          {
                            CCAP1H=0x02;

          }
          
      // 可以在这里添加PWM占空比或其他设置的动态更改
    }
}

vb2002 发表于 2024-5-27 10:14:47

zhange 发表于 2024-5-27 09:55
我刚学到stc32的pmw你这是stc哪个型号?

我这个不是用的增强型15位pwm,
我用的stc8g1k08a的 8位pwm
配置有点不一样,现在有点点懂了

angmall 发表于 2024-5-27 11:41:22

给你个程序试试。


#include "intrins.h"
#include <STC8G.H>

#define pulse_width_MAX 0xfa        // PWM脉宽最小值,占空比2.3%
#define pulse_width_MIN 0x05        // PWM脉宽最大值,占空比98%
#define STEP 0x02;                    // PWM脉宽变化步长
unsigned charpulse_width;   // PWM脉宽变量,即存入CCAP0H中的值

//STC12、15、8、32都有库函数,一直就差89的延时函数。现在终于集齐了:lol
/*********************************************
                程序名称      :延时函数
*********************************************/

//#define MAIN_Fosc 48000000L      //定义主时钟
//#define MAIN_Fosc 44236800L      //定义主时钟
//#define MAIN_Fosc 40000000L      //定义主时钟
//#define MAIN_Fosc 36864000L      //定义主时钟
//#define MAIN_Fosc 35000000L      //定义主时钟
//#define MAIN_Fosc 33177600L      //定义主时钟
//#define MAIN_Fosc 30000000L      //定义主时钟
//#define MAIN_Fosc 27000000L      //定义主时钟
#define MAIN_Fosc 24000000L      //定义主时钟
//#define MAIN_Fosc 22118400L      //定义主时钟
//#define MAIN_Fosc 20000000L      //定义主时钟
//#define MAIN_Fosc 18432000L      //定义主时钟
//#define MAIN_Fosc 12000000L      //定义主时钟
//#define MAIN_Fosc 11059200L      //定义主时钟
//#define MAIN_Fosc 6000000L      //定义主时钟
//#define MAIN_Fosc 5529600L      //定义主时钟

void Delay(unsigned int ms)                //注:ms_max=65536
{
    unsigned int i;
    do
    {
//            i=MAIN_Fosc/96000L;                //STC89/90_12T
//            i=MAIN_Fosc/48000L;                //STC89/90_6T
//            i=MAIN_Fosc/14000;                //STC12
//            i=MAIN_Fosc/13000;                //STC15
            i=MAIN_Fosc/10000;                //STC8
//            i=MAIN_Fosc/6030;               //STC32
            while(--i)      ;
            }
    while(--ms);
}

void PWM_OUT()
{
        // 占空比从最大到最小
        pulse_width=pulse_width_MIN;
        while(1)
        {
                if (pulse_width>pulse_width_MAX)        break;
                CCAP0H=        pulse_width;
                CCAP1H=        pulse_width;
                CCAP2H=        pulse_width;
                pulse_width+=STEP;
                Delay(20);
        }
        // 占空比从最小到最大
        pulse_width=pulse_width_MAX;
        while(1)
        {
                if(pulse_width<pulse_width_MIN) break;
                CCAP0H=        pulse_width;
                CCAP1H=        pulse_width;
                CCAP2H=        pulse_width;
                pulse_width-=STEP;
                Delay(20);       
        }
}

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;
    P6M0 = 0x00; P6M1 = 0x00;
    P7M0 = 0x00; P7M1 = 0x00;

      
      
    // PCA初始化
    CCON=0x00; // 清除PCA控制寄存器
    CMOD=0x08; // PCA计数模式配置(例如,定时器模式)
    CL=0x00;   // PCA计数器低位
    CH=0x00;   // PCA计数器高位
       
        //--6位PWM--
    CCAPM0 = 0x42;                              //PCA模块0为PWM工作模式
    PCA_PWM0 = 0x00;                            //PCA模块0输出6位PWM
    CCAP0L = 0x00;                              //PWM占空比为50%[(40H-20H)/40H]
    CCAP0H = 0x20;

    // 配置PCA通道1为PWM模式,并启用中断(如果需要)
    CCAPM1=0x42; // 设置PCA通道1为PWM模式,并启用中断(如果需要)
    PCA_PWM1=0x00; // 设置PCA通道1的PWM输出为高有效

    // 设置PCA通道1的捕获/比较寄存器,用于定义PWM的占空比
    // 这里需要根据实际情况调整CCAP1L和CCAP1H的值
    CCAP1L=0xFF; // PCA通道1的捕获/比较值低位
    CCAP1H=0x02; // PCA通道1的捕获/比较值高位

    CCAPM2 = 0x42;                              //PCA模块2为PWM工作模式
    PCA_PWM2 = 0xc0;                            //PCA模块2输出10位PWM
    CCAP2L = 0x00;                              //PWM占空比为96.875%[(400H-20H)/400H]
    CCAP2H = 0x20;

    // 启动PCA
    CR=1;

    // ... 如果需要其他功能或配置,可以在这里添加 ...

    while (1)
    {
//            if(P32==0)
//                  
//                  CCAP1H=0x29;
//            else
//            {
//                              CCAP1H=0x02;

//            }
                PWM_OUT();            // 脉宽输出
                                               
            
      // 可以在这里添加PWM占空比或其他设置的动态更改
    }
}

vb2002 发表于 2024-5-27 21:24:32

angmall 发表于 2024-5-27 11:41
给你个程序试试。

哈哈,可以呼吸了。
正好我的是P33亮。
还有代码吗?
比如手电开关那种?

悠悠139 发表于 2024-6-24 22:32:37

vb2002 发表于 2024-5-27 21:24
哈哈,可以呼吸了。
正好我的是P33亮。
还有代码吗?


有没有程序,我也想做一个手电筒,按键长按调整占空比

vb2002 发表于 2024-6-24 23:24:14

悠悠139 发表于 2024-6-24 22:32
有没有程序,我也想做一个手电筒,按键长按调整占空比

没有哦,我也在研究,小白一个.最近也没什么空,小孩眼睛近视了
页: 1 [2]
查看完整版本: 看了stc isp的软件上面的范例程序,怎么使用|已解决