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