vb2002 发表于 2024-6-28 13:52:26

#include <STC8H.H>


sbit LED1=P3^3;
sbit KEY1=P3^2;

#define MAIN_Fosc 11059200UL                //定义主频12MHz,请根据实际使用频率修改(用于delay函数自适应主频)
#define        ON        0
#define        OFF        1

#define PWM_ARR 999
#define PWM_CCR 500


typedef unsigned char u8;                                //unsigned char                               类型,用u8表示
typedef unsigned int u16;                                //unsigned int                                 类型,用u16表示
typedef unsigned long int u32;        //unsigned long int         类型,用u32表示

void sysini(void);                                                // STC32初始化设置
void Timer0_Init(void);                                // 定时器0初始化       
void delayms(u16 ms);                                        // ms*1毫秒延时函数
void PWMA_Init(void);

//-----------------------

void main(void)
{
        P_SW2    = 0x80;
        sysini();                                                                                // STC8h初始化设置
        Timer0_Init();                                                        // 定时器0初始化
        PWMA_Init();
        EA = 1;                                                                                        // 使能EA总中断

       

       
       
       
//        PWMA_PS= 0xc0;
//    PWMA_CCER2 = 0x00;                        //写CCMRx前必须先清零CCERx关闭通道
//    PWMA_CCMR1 = 0x68;                        //设置CC1为PWMA输出模式
//    PWMA_CCER2 = 0x40;                        //使能CC1通道
////    PWMA_CCR1= 20;                            //设置占空比时间
//    PWMA_CCR2= 495;                            //设置占空比时间

//    PWMA_ARR   = 500;                           //设置周期时间
//    PWMA_ENO   = 0x80;                            //使能PWM1P端口输出
//    PWMA_BKR   = 0x80;                            //使能主输出
//    PWMA_CR1   = 0x01;                            //开始计时

    while (1);
}

void sysini()
{

        P0M1 = 0xFF;P0M0 = 0x00;P1M1 = 0x00;P1M0 = 0x00;P2M1 = 0x00;P2M0 = 0x00;        P4M1 = 0x00;P4M0 = 0x00;P5M1 = 0x00;P5M0 = 0x00;P6M1 = 0x00;P6M0 = 0x00; P7M1 = 0x00;P7M0 = 0x00;               
        P3M1 = 0x00;P3M0 = 0x00;                       
}



//void Timer0_Isr(void) interrupt 1
//{
//       
//}
void Timer0_Init(void)                                //1毫秒@12.000MHz
{
        AUXR |= 0x80;                                                                //定时器时钟1T模式
        TMOD &= 0xF0;                                                                //设置定时器模式
        TL0 = 0x20;                                                                        //设置定时初始值
        TH0 = 0xD1;                                                                        //设置定时初始值
        TF0 = 0;                                                                                //清除TF0标志
        TR0 = 1;                                                                                //定时器0开始计时
        ET0 = 1;                                                                                //使能定时器0中断
}
//========================================================================
void delayms(u16 ms)                        //延时函数的自定义代码
{
        u16 i;
        do{
                i = MAIN_Fosc /10000;
                while(--i);
        }while(--ms);
}

void PWMA_Init(void)
{
                //1,时钟源选择
                //2,时基单元选择
        PWMA_PSCRH = 0;                //1分频0+11分频
        PWMA_PSCRH = 0;       

        PWMA_ARRH = (u8)(PWM_ARR>>8);
        PWMA_ARRL = (u8)(PWM_ARR);
       
        PWMA_CCR1H = (u8)(PWM_CCR>>8);
        PWMA_CCR1L = (u8)(PWM_CCR);       
                //3,输入输出的引脚配置
PWMA_ENO = 0x00;                //使能PWM4N通道输出
PWMA_ENO |= 0x80;
       
PWMA_PS= 0x00;                //选择PWM4NP33引脚输出
//PWMA_PS|= 0xc0;
PWMA_PS|= 0xc0;
       
                //4,输入输出模式设置
PWMA_CCER2 =0x00;
PWMA_CCMR1 =0x68;                //pwm模式1 配置置位输出
PWMA_CCER2 =0x40;                //开启输出比较通道
PWMA_BKR   =0x80;                //使能主输出

PWMA_CR1 |= 0x01;                //启动计数器
}


//void PWMA_Init(void)
//{
//                //1,时钟源选择
//                //2,时基单元选择
//        PWMA_PSCRH = 0;                //1分频0+11分频
//        PWMA_PSCRH = 0;       

//        PWMA_ARRH = (u8)(PWM_ARR>>8);
//        PWMA_ARRL = (u8)(PWM_ARR);
//       
//        PWMA_CCR1H = (u8)(PWM_CCR>>8);
//        PWMA_CCR1L = (u8)(PWM_CCR);       
//                //3,输入输出的引脚配置
//PWMA_ENO = 0x00;                //使能PWM4N通道输出
//PWMA_ENO |= 0x01;
//       
//PWMA_PS= 0x00;                //选择PWM4NP33引脚输出
////PWMA_PS|= 0xc0;
//PWMA_PS|= (2<<0);
//       
//                //4,输入输出模式设置
// PWMA_CCER1 =0x00;
// PWMA_CCMR1 =0x68;                //pwm模式1 配置置位输出
// PWMA_CCER1 =0x01;                //开启输出比较通道
// PWMA_BKR   =0x80;                //使能主输出

//
//PWMA_CR1 |= 0x01;                //启动计数器
//}

终于把P33口点亮了.
翻手册,找寄存器.一步一步
接下来就可以去调整任意占空比.

vb2002 发表于 2024-6-28 13:54:29

梁工 发表于 2024-6-28 13:46
但我在各论坛很少看到有人抱怨ARM的PWM难学、难用,他们会花几个月时间来啃明白。 ...

原来要花几个月啊{:4_187:}
那估计我要花1年多了{:4_167:}

梁工 发表于 2024-6-28 13:56:48

vb2002 发表于 2024-6-28 13:54
原来要花几个月啊
那估计我要花1年多了
STC的你可以一天就整明白{:lol:}

vb2002 发表于 2024-6-28 13:58:01

手册里面 P33是pwm4n_2   

管脚说明是 pwm4n_4

vb2002 发表于 2024-6-28 14:01:13

PWM4N和PWM4N_2(PWM4N_4) 怎么选择哦.
没找到怎么弄

vb2002 发表于 2024-6-28 14:04:28

神农鼎 发表于 2024-6-28 13:51
30个小时,全学懂的 都是高手




前段时间没空学习.小孩眼睛远视了.来来回回跑医院
然后又忙着拍抖音
现在稍微闲了点了.又一头扎进学习的海洋{:4_196:}

网老四 发表于 2024-6-28 14:19:46

梁工 发表于 2024-6-28 13:46
但我在各论坛很少看到有人抱怨ARM的PWM难学、难用,他们会花几个月时间来啃明白。 ...

因为多数报怨会被无视

梁工 发表于 2024-6-28 14:34:28

本帖最后由 梁工 于 2024-6-28 14:43 编辑

vb2002 发表于 2024-6-28 14:01
PWM4N和PWM4N_2(PWM4N_4) 怎么选择哦.
没找到怎么弄








但是对于STC8H1K08-SOP6或TSSOP20,PWM选择的IO不同,比如SPWM4N_2在P3.3,其余的型号在P2.7。

vb2002 发表于 2024-6-28 14:51:54

梁工 发表于 2024-6-28 14:34
但是对于STC8H1K08-SOP6或TSSOP20,PWM选择的IO不同,比如SPWM4N_2在P3.3,其余的型号在P2.7。 ...

1N,2N,3N,4N
1P 2P 3P 4P 这个搞懂了.
就是 4N 里面又有4N_4这个没搞懂意思

vb2002 发表于 2024-6-28 14:53:37

梁工 发表于 2024-6-28 14:34
但是对于STC8H1K08-SOP6或TSSOP20,PWM选择的IO不同,比如SPWM4N_2在P3.3,其余的型号在P2.7。 ...



看管脚图,4N是 P1.7
4N_2又是P3.3
页: 1 [2] 3 4
查看完整版本: 高级16位pwm慢慢学,有点感觉了