STC8H高级PWM定时器 PWM1P,PWM2P输出

张开发
2026/4/14 9:56:30 15 分钟阅读

分享文章

STC8H高级PWM定时器 PWM1P,PWM2P输出
高级PWM定时器 PWM1P,PWM2P输出本文介绍了基于STC8H8K64U核心实验板实现高级PWM定时器控制LED呼吸灯效果的方案。程序配置了4组PWM通道PWM1-4每组包含互补输出功能通过P2口连接的8个LED实现呼吸灯效果。PWM周期可设置最高达65535占空比可独立调节。同时演示了两种进入USB下载模式的方法1)通过P3.2按键长按1秒触发复位2)使用STC-ISP软件发送指令触发复位。程序采用24MHz主时钟包含PWM初始化、定时器中断处理、占空比更新等关键功能模块实现了平滑的LED亮度渐变效果。/************* 功能说明 **************本例程基于STC8H8K64U核心实验板开天斧进行编写测试。高级PWM定时器 PWM1P/PWM1N,PWM2P/PWM2N,PWM3P/PWM3N,PWM4P/PWM4N 每个通道都可独立实现PWM输出或者两两互补对称输出.8个通道PWM设置对应P2的8个端口.通过P2口上连接的8个LED灯利用PWM实现呼吸灯效果.PWM周期和占空比可以根据需要自行设置最高可达65535.此外程序演示两种复位进入USB下载模式的方法1. 通过每1毫秒执行一次“KeyResetScan”函数实现长按P3.2口按键触发MCU复位进入USB下载模式。(如果不希望复位进入USB下载模式的话可在复位代码里将 IAP_CONTR 的bit6清0选择复位进用户程序区)2. 通过加载“stc_usb_hid_8h.lib”库函数实现使用STC-ISP软件发送指令触发MCU复位进入USB下载模式并自动下载。下载时, 选择时钟 24MHZ (用户可自行修改频率).******************************************/#include ../comm/STC8h.h //包含此头文件后不需要再包含reg51.h头文件#include ../comm/usb.h //USB调试及复位所需头文件#include intrins.h/****************************** 用户定义宏 ***********************************/#define MAIN_Fosc 24000000L //定义主时钟#define Timer0_Reload (65536UL -(MAIN_Fosc / 1000)) //Timer 0 中断频率, 1000次/秒/*****************************************************************************/#define PWM1_1 0x00 //P:P1.0 N:P1.1#define PWM1_2 0x01 //P:P2.0 N:P2.1#define PWM1_3 0x02 //P:P6.0 N:P6.1#define PWM2_1 0x00 //P:P1.2/P5.4 N:P1.3#define PWM2_2 0x04 //P:P2.2 N:P2.3#define PWM2_3 0x08 //P:P6.2 N:P6.3#define PWM3_1 0x00 //P:P1.4 N:P1.5#define PWM3_2 0x10 //P:P2.4 N:P2.5#define PWM3_3 0x20 //P:P6.4 N:P6.5#define PWM4_1 0x00 //P:P1.6 N:P1.7#define PWM4_2 0x40 //P:P2.6 N:P2.7#define PWM4_3 0x80 //P:P6.6 N:P6.7#define PWM4_4 0xC0 //P:P3.4 N:P3.3#define ENO1P 0x01#define ENO1N 0x02#define ENO2P 0x04#define ENO2N 0x08#define ENO3P 0x10#define ENO3N 0x20#define ENO4P 0x40#define ENO4N 0x80#define PWM_PERIOD 1023 //设置周期值/************* 本地变量声明 **************/bit B_1ms; //1ms标志u16 PWM1_Duty;u16 PWM2_Duty;u16 PWM3_Duty;u16 PWM4_Duty;bit PWM1_Flag;bit PWM2_Flag;bit PWM3_Flag;bit PWM4_Flag;//USB调试及复位所需定义char *USER_DEVICEDESC NULL;char *USER_PRODUCTDESC NULL;char *USER_STCISPCMD STCISP#; //设置自动复位到ISP区的用户接口命令//P3.2口按键复位所需变量bit Key_Flag;u16 Key_cnt;void UpdatePwm(void);void KeyResetScan(void);//// 函数: void delay_ms(u8 ms)// 描述: 延时函数。// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.// 返回: none.// 版本: VER1.0// 日期: 2022-6-3// 备注://void delay_ms(u8 ms){u16 i;do{i MAIN_Fosc / 10000;while(--i); //10T per loop}while(--ms);}/******************** 主函数 **************************/void main(void){P_SW2 | 0x80; //扩展寄存器(XFR)访问使能RSTFLAG | 0x04; //设置硬件复位后需要检测P3.2的状态选择运行区域否则硬件复位后进入USB下载模式P0M1 0x00; P0M0 0x00; //设置为准双向口P1M1 0x00; P1M0 0x00; //设置为准双向口P2M1 0x00; P2M0 0x00; //设置为准双向口P3M1 0x00; P3M0 0x00; //设置为准双向口P4M1 0x00; P4M0 0x00; //设置为准双向口P5M1 0x00; P5M0 0x00; //设置为准双向口P6M1 0x00; P6M0 0x00; //设置为准双向口P7M1 0x00; P7M0 0x00; //设置为准双向口PWM1_Flag 0;PWM2_Flag 0;PWM3_Flag 0;PWM4_Flag 0;PWM1_Duty 0;PWM2_Duty 256;PWM3_Duty 512;PWM4_Duty 1024;//USB调试及复位所需代码-----P3M0 ~0x03;P3M1 | 0x03;IRC48MCR 0x80;while (!(IRC48MCR 0x01));usb_init();//-------------------------// Timer0初始化TMOD 0xf0;//16 bits timer auto-reloadAUXR | 0x80;//Timer0 set as 1TTH0 (u8)(Timer0_Reload / 256);TL0 (u8)(Timer0_Reload % 256);ET0 1; //Timer0 interrupt enableTR0 1; //Tiner0 runPWMA_CCER1 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道PWMA_CCER2 0x00;PWMA_CCMR1 0x68; //通道模式配置PWMA_CCMR2 0x68;PWMA_CCMR3 0x68;PWMA_CCMR4 0x68;PWMA_CCER1 0x55; //配置通道输出使能和极性PWMA_CCER2 0x55;PWMA_ARRH (u8)(PWM_PERIOD 8); //设置周期时间PWMA_ARRL (u8)PWM_PERIOD;PWMA_ENO 0x00;PWMA_ENO | ENO1P; //使能输出PWMA_ENO | ENO1N; //使能输出PWMA_ENO | ENO2P; //使能输出PWMA_ENO | ENO2N; //使能输出PWMA_ENO | ENO3P; //使能输出PWMA_ENO | ENO3N; //使能输出PWMA_ENO | ENO4P; //使能输出PWMA_ENO | ENO4N; //使能输出PWMA_PS 0x00; //高级 PWM 通道输出脚选择位PWMA_PS | PWM1_1; //选择 PWM1_1 通道// PWMA_PS | PWM2_2; //选择 PWM2_2 通道PWMA_PS | PWM3_1; //选择 PWM3_1 通道// PWMA_PS | PWM4_2; //选择 PWM4_2 通道PWMA_BKR 0x80; //使能主输出PWMA_CR1 | 0x81; //ARR预装载开始计时IE2 | 0x80; //IE2相关的中断位操作使能后需要重新设置EUSBEA 1; //打开总中断while (1){P00X00;delay_ms(50);P00XFF;delay_ms(50);P00X00;delay_ms(50);P00XFF;delay_ms(50);if (bUsbOutReady) //USB调试及复位所需代码{// memcpy(UsbInBuffer, UsbOutBuffer, 64); //原路返回, 用于测试HID// usb_IN();usb_OUT_done();}}}/********************** Timer0 1ms中断函数 ************************/void timer0(void) interrupt 1{if(!PWM1_Flag){PWM1_Duty;if(PWM1_Duty PWM_PERIOD) PWM1_Flag 1;}else{PWM1_Duty--;if(PWM1_Duty 0) PWM1_Flag 0;}if(!PWM2_Flag){PWM2_Duty;if(PWM2_Duty PWM_PERIOD) PWM2_Flag 1;}else{PWM2_Duty--;if(PWM2_Duty 0) PWM2_Flag 0;}if(!PWM3_Flag){PWM3_Duty;if(PWM3_Duty PWM_PERIOD) PWM3_Flag 1;}else{PWM3_Duty--;if(PWM3_Duty 0) PWM3_Flag 0;}if(!PWM4_Flag){PWM4_Duty;if(PWM4_Duty PWM_PERIOD) PWM4_Flag 1;}else{PWM4_Duty--;if(PWM4_Duty 0) PWM4_Flag 0;}UpdatePwm();KeyResetScan(); //P3.2口按键触发软件复位进入USB下载模式不需要此功能可删除本行代码}//// 函数: UpdatePwm(void)// 描述: 更新PWM占空比.// 参数: none.// 返回: none.// 版本: V1.0, 2012-11-22//void UpdatePwm(void){PWMA_CCR1H (u8)(PWM1_Duty 8); //设置占空比时间PWMA_CCR1L (u8)(PWM1_Duty);PWMA_CCR2H (u8)(PWM2_Duty 8); //设置占空比时间PWMA_CCR2L (u8)(PWM2_Duty);PWMA_CCR3H (u8)(PWM3_Duty 8); //设置占空比时间PWMA_CCR3L (u8)(PWM3_Duty);PWMA_CCR4H (u8)(PWM4_Duty 8); //设置占空比时间PWMA_CCR4L (u8)(PWM4_Duty);}//// 函数: void KeyResetScan(void)// 描述: P3.2口按键长按1秒触发软件复位进入USB下载模式。// 参数: none.// 返回: none.// 版本: VER1.0// 日期: 2022-6-11// 备注://void KeyResetScan(void){if(!P32){if(!Key_Flag){Key_cnt;if(Key_cnt 1000) //连续1000ms有效按键检测{Key_Flag 1; //设置按键状态防止重复触发USBCON 0x00; //清除USB设置USBCLK 0x00;IRC48MCR 0x00;delay_ms(10);IAP_CONTR 0x60; //触发软件复位从ISP开始执行while (1);}}}else{Key_cnt 0;Key_Flag 0;}}

更多文章