Files
RCU_C12_Dimming/PWM15bit.c
caocong 2dd675869a fix:修复调光时间BUG
解决调光时间一样的情况下,调光亮与调光灭的实际调光时间不一致问题
2025-12-15 20:48:52 +08:00

535 lines
15 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com ---------------------------------------*/
/* --- QQ: 800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
#include "PWM15bit.h"
u16 code PWMxCR[48] = {
0xff14, /* PWM00CR */
0xff1c, /* PWM01CR */
0xff24, /* PWM02CR */
0xff2c, /* PWM03CR */
0xff34, /* PWM04CR */
0xff3c, /* PWM05CR */
0xff44, /* PWM06CR */
0xff4c, /* PWM07CR */
0xff64, /* PWM10CR */
0xff6c, /* PWM11CR */
0xff74, /* PWM12CR */
0xff7c, /* PWM13CR */
0xff84, /* PWM14CR */
0xff8c, /* PWM15CR */
0xff94, /* PWM16CR */
0xff9c, /* PWM17CR */
0xffb4, /* PWM20CR */
0xffbc, /* PWM21CR */
0xffc4, /* PWM22CR */
0xffcc, /* PWM23CR */
0xffd4, /* PWM24CR */
0xffdc, /* PWM25CR */
0xffe4, /* PWM26CR */
0xffec, /* PWM27CR */
0xfc14, /* PWM30CR */
0xfc1c, /* PWM31CR */
0xfc24, /* PWM32CR */
0xfc2c, /* PWM33CR */
0xfc34, /* PWM34CR */
0xfc3c, /* PWM35CR */
0xfc44, /* PWM36CR */
0xfc4c, /* PWM37CR */
0xfc64, /* PWM40CR */
0xfc6c, /* PWM41CR */
0xfc74, /* PWM42CR */
0xfc7c, /* PWM43CR */
0xfc84, /* PWM44CR */
0xfc8c, /* PWM45CR */
0xfc94, /* PWM46CR */
0xfc9c, /* PWM47CR */
0xfcb4, /* PWM50CR */
0xfcbc, /* PWM51CR */
0xfcc4, /* PWM52CR */
0xfccc, /* PWM53CR */
0xfcd4, /* PWM54CR */
0xfcdc, /* PWM55CR */
0xfce4, /* PWM56CR */
0xfcec, /* PWM57CR */
};
u16 code PWMxT1[48] = {
0xff10, /* PWM00T1 */
0xff18, /* PWM01T1 */
0xff20, /* PWM02T1 */
0xff28, /* PWM03T1 */
0xff30, /* PWM04T1 */
0xff38, /* PWM05T1 */
0xff40, /* PWM06T1 */
0xff48, /* PWM07T1 */
0xff60, /* PWM10T1 */
0xff68, /* PWM11T1 */
0xff70, /* PWM12T1 */
0xff78, /* PWM13T1 */
0xff80, /* PWM14T1 */
0xff88, /* PWM15T1 */
0xff90, /* PWM16T1 */
0xff98, /* PWM17T1 */
0xffb0, /* PWM20T1 */
0xffb8, /* PWM21T1 */
0xffc0, /* PWM22T1 */
0xffc8, /* PWM23T1 */
0xffd0, /* PWM24T1 */
0xffd8, /* PWM25T1 */
0xffe0, /* PWM26T1 */
0xffe8, /* PWM27T1 */
0xfc10, /* PWM30T1 */
0xfc18, /* PWM31T1 */
0xfc20, /* PWM32T1 */
0xfc28, /* PWM33T1 */
0xfc30, /* PWM34T1 */
0xfc38, /* PWM35T1 */
0xfc40, /* PWM36T1 */
0xfc48, /* PWM37T1 */
0xfc60, /* PWM40T1 */
0xfc68, /* PWM41T1 */
0xfc70, /* PWM42T1 */
0xfc78, /* PWM43T1 */
0xfc80, /* PWM44T1 */
0xfc88, /* PWM45T1 */
0xfc90, /* PWM46T1 */
0xfc98, /* PWM47T1 */
0xfcb0, /* PWM50T1 */
0xfcb8, /* PWM51T1 */
0xfcc0, /* PWM52T1 */
0xfcc8, /* PWM53T1 */
0xfcd0, /* PWM54T1 */
0xfcd8, /* PWM55T1 */
0xfce0, /* PWM56T1 */
0xfce8, /* PWM57T1 */
};
u16 code PWMxT2[48] = {
0xff12, /* PWM00T2 */
0xff1a, /* PWM01T2 */
0xff22, /* PWM02T2 */
0xff2a, /* PWM03T2 */
0xff32, /* PWM04T2 */
0xff3a, /* PWM05T2 */
0xff42, /* PWM06T2 */
0xff4a, /* PWM07T2 */
0xff62, /* PWM10T2 */
0xff6a, /* PWM11T2 */
0xff72, /* PWM12T2 */
0xff7a, /* PWM13T2 */
0xff82, /* PWM14T2 */
0xff8a, /* PWM15T2 */
0xff92, /* PWM16T2 */
0xff9a, /* PWM17T2 */
0xffb2, /* PWM20T2 */
0xffba, /* PWM21T2 */
0xffc2, /* PWM22T2 */
0xffca, /* PWM23T2 */
0xffd2, /* PWM24T2 */
0xffda, /* PWM25T2 */
0xffe2, /* PWM26T2 */
0xffea, /* PWM27T2 */
0xfc12, /* PWM30T2 */
0xfc1a, /* PWM31T2 */
0xfc22, /* PWM32T2 */
0xfc2a, /* PWM33T2 */
0xfc32, /* PWM34T2 */
0xfc3a, /* PWM35T2 */
0xfc42, /* PWM36T2 */
0xfc4a, /* PWM37T2 */
0xfc62, /* PWM40T2 */
0xfc6a, /* PWM41T2 */
0xfc72, /* PWM42T2 */
0xfc7a, /* PWM43T2 */
0xfc82, /* PWM44T2 */
0xfc8a, /* PWM45T2 */
0xfc92, /* PWM46T2 */
0xfc9a, /* PWM47T2 */
0xfcb2, /* PWM50T2 */
0xfcba, /* PWM51T2 */
0xfcc2, /* PWM52T2 */
0xfcca, /* PWM53T2 */
0xfcd2, /* PWM54T2 */
0xfcda, /* PWM55T2 */
0xfce2, /* PWM56T2 */
0xfcea, /* PWM57T2 */
};
u16 code PWMxHLD[48] = {
0xff15, /* PWM00HLD */
0xff1d, /* PWM01HLD */
0xff25, /* PWM02HLD */
0xff2d, /* PWM03HLD */
0xff35, /* PWM04HLD */
0xff3d, /* PWM05HLD */
0xff45, /* PWM06HLD */
0xff4d, /* PWM07HLD */
0xff65, /* PWM10HLD */
0xff6d, /* PWM11HLD */
0xff75, /* PWM12HLD */
0xff7d, /* PWM13HLD */
0xff85, /* PWM14HLD */
0xff8d, /* PWM15HLD */
0xff95, /* PWM16HLD */
0xff9d, /* PWM17HLD */
0xffb5, /* PWM20HLD */
0xffbd, /* PWM21HLD */
0xffc5, /* PWM22HLD */
0xffcd, /* PWM23HLD */
0xffd5, /* PWM24HLD */
0xffdd, /* PWM25HLD */
0xffe5, /* PWM26HLD */
0xffed, /* PWM27HLD */
0xfc15, /* PWM30HLD */
0xfc1d, /* PWM31HLD */
0xfc25, /* PWM32HLD */
0xfc2d, /* PWM33HLD */
0xfc35, /* PWM34HLD */
0xfc3d, /* PWM35HLD */
0xfc45, /* PWM36HLD */
0xfc4d, /* PWM37HLD */
0xfc65, /* PWM40HLD */
0xfc6d, /* PWM41HLD */
0xfc75, /* PWM42HLD */
0xfc7d, /* PWM43HLD */
0xfc85, /* PWM44HLD */
0xfc8d, /* PWM45HLD */
0xfc95, /* PWM46HLD */
0xfc9d, /* PWM47HLD */
0xfcb5, /* PWM50HLD */
0xfcbd, /* PWM51HLD */
0xfcc5, /* PWM52HLD */
0xfccd, /* PWM53HLD */
0xfcd5, /* PWM54HLD */
0xfcdd, /* PWM55HLD */
0xfce5, /* PWM56HLD */
0xfced, /* PWM57HLD */
};
//========================================================================
// 函数: u8 PWMChannelCtrl(u8 PWM_id, u8 pwm_eno, u8 pwm_ini, u8 pwm_eni, u8 pwm_ent2i, u8 pwm_ent1i)
// 描述: PWM通道控制寄存器设置.
// 参数: PWM_id: PWM通道序号. 取值 0~57
// pwm_eno: pwm输出使能, 0设为GPIO, 1设为PWM输出.
// pwm_ini: pwm输出端的初始电平, 0为低电平, 1为高电平.
// pwm_eni: pwm通道中断使能控制, 0为关闭PWM中断, 1为使能PWM中断.
// pwm_ent2i: pwm通道第二个触发点中断使能控制, 0为关闭PWM第二个触发点中断, 1为使能PWM第二个触发点中断.
// pwm_ent1i: pwm通道第一个触发点中断使能控制, 0为关闭PWM第一个触发点中断, 1为使能PWM第一个触发点中断.
// 返回: 0:正确, 2:错误.
// 版本: V1.0, 2020-09-22
//========================================================================
u8 PWMChannelCtrl(u8 PWM_id, u8 pwm_eno, u8 pwm_ini, u8 pwm_eni, u8 pwm_ent2i, u8 pwm_ent1i)
{
u8 xdata *pPWMxCR;
if(PWM_id > PWM57) return 2; //id错误
if(pwm_eno > 1) return 2; //输出使能错误
if(pwm_ini > 1) return 2; //输出端的初始电平错误
if(pwm_eni > 1) return 2; //中断使能控制错误
if(pwm_ent2i > 1) return 2; //第二个触发点中断使能控制错误
if(pwm_ent1i > 1) return 2; //第一个触发点中断使能控制错误
EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
pPWMxCR = (u8 *)PWMxCR[PWM_id];
*pPWMxCR = (pwm_eno << 7) | (pwm_ini << 6) | (pwm_eni << 2)| (pwm_ent2i << 1)| pwm_ent1i;
EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
return 0;
}
//========================================================================
// 函数: u8 PWMPeriodDuty(u8 PWM_id, u16 Period, u16 dutyL, u16 dutyH)
// 描述: PWM周期, 占空比设置.
// 参数: PWM_id: PWM通道序号. 取值 0~57
// dutyL: pwm输出低电平位置, 取值 0~0x7fff.
// dutyH: pwm输出高电平位置, 取值 0~0x7fff.
// 返回: 0:正确, 2:错误.
// 版本: V1.0, 2020-09-22
//========================================================================
u8 PWM15Duty(u8 PWM_id,u16 dutyL)
{
u16 xdata *pPWMxT1;
u16 xdata *pPWMxT2;
if(PWM_id > PWM57) return 2; //id错误
if(dutyL > 0x7fff) return 2; //低电平时间设置错误
//if(dutyH > 0x7fff) return 2; //高电平时间设置错误
EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
pPWMxT1 = (u16 *)PWMxT1[PWM_id];
*pPWMxT1 = dutyL & 0x7fff;
pPWMxT2 = (u16 *)PWMxT2[PWM_id];
*pPWMxT2 = 0x0000 & 0x7fff;
EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
return 0;
}
u8 qPWM15Duty(u8 PWM_id,u16 dutyL, u16 dutyH)
{
u16 xdata *pPWMxT1;
u16 xdata *pPWMxT2;
if(PWM_id > PWM57) return 2; //id错误
if(dutyL > 0x7fff) return 2; //低电平时间设置错误
if(dutyH > 0x7fff) return 2; //高电平时间设置错误
EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
pPWMxT1 = (u16 *)PWMxT1[PWM_id];
*pPWMxT1 = dutyL & 0x7fff;
pPWMxT2 = (u16 *)PWMxT2[PWM_id];
*pPWMxT2 = dutyH & 0x7fff;
EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
return 0;
}
//========================================================================
// 函数: u8 PWMOutputSet(u8 PWM_id, u8 pwm_hldl, u8 pwm_hldh)
// 描述: PWM通道控制寄存器设置.
// 参数: PWM_id: PWM通道序号. 取值 0~57
// pwm_hldl: pwm强制输出低电平控制位, 0正常输出, 1强制输出低电平.
// pwm_hldh: pwm强制输出高电平控制位, 0正常输出, 1强制输出高电平.
// 返回: 0:正确, 2:错误.
// 版本: V1.0, 2020-09-22
//========================================================================
u8 PWMLevelSet(u8 PWM_id, u8 pwm_hldl, u8 pwm_hldh)
{
u8 xdata *pPWMxHLD;
if(PWM_id > PWM57) return 2; //id错误
if(pwm_hldh > 1) return 2; //输出使能错误
if(pwm_hldl > 1) return 2; //输出端的初始电平错误
EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
pPWMxHLD = (u8 *)PWMxHLD[PWM_id];
*pPWMxHLD = (pwm_hldh << 1) | pwm_hldl;
EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
return 0;
}
//========================================================================
// 函数: void PWM15_Init(u8 PWM_id, PWM15_InitTypeDef *PWMx)
// 描述: 15位增强型PWM初始化程序.
// 参数: PWM_id: PWM组号. 取值 PWM0,PWM1,PWM2,PWM3,PWM4,PWM5
// PWMx: 结构参数,请参考头文件里的定义.
// 返回: none.
// 版本: V1.0, 2020-09-22
//========================================================================
void PWM15_Init(u8 PWM_id, PWM15_InitTypeDef *PWMx)
{
if(PWM_id > PWM5) return; //id错误
EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
if(PWM_id == PWM0)
{
if(PWMx->PWM_Enable == ENABLE) PWM15_PWM0_Enable(); //使能PWM0
else PWM15_PWM0_Disable(); //关闭PWM0
PWM0_PS_Set(PWMx->PWM_Clock_PS); //系统时钟分频参数, 0~15
PWM0C = PWMx->PWM_Period & 0x7fff;
if(PWMx->PWM_Counter == ENABLE) PWM15_Counter0_Enable(); //使能计数器
else PWM15_Counter0_Disable(); //关闭计数器
}
if(PWM_id == PWM1)
{
if(PWMx->PWM_Enable == ENABLE) PWM15_PWM1_Enable(); //使能PWM1
else PWM15_PWM1_Disable(); //关闭PWM1
PWM1_PS_Set(PWMx->PWM_Clock_PS); //系统时钟分频参数, 0~15
PWM1C = PWMx->PWM_Period & 0x7fff;
if(PWMx->PWM_Counter == ENABLE) PWM15_Counter1_Enable(); //使能计数器
else PWM15_Counter1_Disable(); //关闭计数器
}
if(PWM_id == PWM2)
{
if(PWMx->PWM_Enable == ENABLE) PWM15_PWM2_Enable(); //使能PWM2
else PWM15_PWM2_Disable(); //关闭PWM2
PWM2_PS_Set(PWMx->PWM_Clock_PS); //系统时钟分频参数, 0~15
PWM2C = PWMx->PWM_Period & 0x7fff;
if(PWMx->PWM_Counter == ENABLE) PWM15_Counter2_Enable(); //使能计数器
else PWM15_Counter2_Disable(); //关闭计数器
}
if(PWM_id == PWM3)
{
if(PWMx->PWM_Enable == ENABLE) PWM15_PWM3_Enable(); //使能PWM3
else PWM15_PWM3_Disable(); //关闭PWM3
PWM3_PS_Set(PWMx->PWM_Clock_PS); //系统时钟分频参数, 0~15
PWM3C = PWMx->PWM_Period & 0x7fff;
if(PWMx->PWM_Counter == ENABLE) PWM15_Counter3_Enable(); //使能计数器
else PWM15_Counter3_Disable(); //关闭计数器
}
if(PWM_id == PWM4)
{
if(PWMx->PWM_Enable == ENABLE) PWM15_PWM4_Enable(); //使能PWM4
else PWM15_PWM4_Disable(); //关闭PWM4
PWM4_PS_Set(PWMx->PWM_Clock_PS); //系统时钟分频参数, 0~15
PWM4C = PWMx->PWM_Period & 0x7fff;
if(PWMx->PWM_Counter == ENABLE) PWM15_Counter4_Enable(); //使能计数器
else PWM15_Counter4_Disable(); //关闭计数器
}
if(PWM_id == PWM5)
{
if(PWMx->PWM_Enable == ENABLE) PWM15_PWM5_Enable(); //使能PWM5
else PWM15_PWM5_Disable(); //关闭PWM5
PWM5_PS_Set(PWMx->PWM_Clock_PS); //系统时钟分频参数, 0~15
PWM5C = PWMx->PWM_Period & 0x7fff;
if(PWMx->PWM_Counter == ENABLE) PWM15_Counter5_Enable(); //使能计数器
else PWM15_Counter5_Disable(); //关闭计数器
}
EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
}
//========================================================================
// 函数: void PWM0_Handler (void) interrupt PWM0_VECTOR
// 描述: PWM0中断处理程序.
// 参数: None
// 返回: none.
// 版本: V1.0, 2020-10-13
//========================================================================
void PWM0_Handler (void) interrupt PWM0_VECTOR
{
char store;
store = P_SW2;
P_SW2 |= 0x80;
if(PWMCFG01 & 0x08) //PWM0中断
{
PWMCFG01 &= ~0x08; //清PWM0中断标志
// TODO: 在此处添加用户代码
}
if(PWM0IF)
{
PWM0IF = 0;
P27 = ~P27;
}
P_SW2 = store;
}
//========================================================================
// 函数: void PWM1_Handler (void) interrupt PWM1_VECTOR
// 描述: PWM1中断处理程序.
// 参数: None
// 返回: none.
// 版本: V1.0, 2020-10-13
//========================================================================
void PWM1_Handler (void) interrupt PWM1_VECTOR
{
char store;
store = P_SW2;
P_SW2 |= 0x80;
if(PWMCFG01 & 0x80) //PWM1中断
{
PWMCFG01 &= ~0x80; //清PWM1中断标志
// TODO: 在此处添加用户代码
}
if(PWM1IF)
{
PWM1IF = 0;
P26 = ~P26;
}
P_SW2 = store;
}
//========================================================================
// 函数: void PWM2_Handler (void) interrupt PWM2_VECTOR
// 描述: PWM2中断处理程序.
// 参数: None
// 返回: none.
// 版本: V1.0, 2020-10-13
//========================================================================
void PWM2_Handler (void) interrupt PWM2_VECTOR
{
char store;
store = P_SW2;
P_SW2 |= 0x80;
if(PWMCFG23 & 0x08) //PWM2中断
{
PWMCFG23 &= ~0x08; //清PWM2中断标志
// TODO: 在此处添加用户代码
}
if(PWM2IF)
{
PWM2IF = 0;
P25 = ~P25;
}
P_SW2 = store;
}
//========================================================================
// 函数: void PWM3_Handler (void) interrupt PWM3_VECTOR
// 描述: PWM3中断处理程序.
// 参数: None
// 返回: none.
// 版本: V1.0, 2020-10-13
//========================================================================
void PWM3_Handler (void) interrupt PWM3_VECTOR
{
char store;
store = P_SW2;
P_SW2 |= 0x80;
if(PWMCFG23 & 0x80) //PWM3中断
{
PWMCFG23 &= ~0x80; //清PWM3中断标志
// TODO: 在此处添加用户代码
}
if(PWM3IF)
{
PWM3IF = 0;
P24 = ~P24;
}
P_SW2 = store;
}
//========================================================================
// 函数: void PWM4_Handler (void) interrupt PWM4_VECTOR
// 描述: PWM4中断处理程序.
// 参数: None
// 返回: none.
// 版本: V1.0, 2020-10-13
//========================================================================
void PWM4_Handler (void) interrupt PWM4_VECTOR
{
char store;
store = P_SW2;
P_SW2 |= 0x80;
if(PWMCFG45 & 0x08) //PWM4中断
{
PWMCFG45 &= ~0x08; //清PWM4中断标志
// TODO: 在此处添加用户代码
}
if(PWM4IF)
{
PWM4IF = 0;
P23 = ~P23;
}
P_SW2 = store;
}
//========================================================================
// 函数: void PWM5_Handler (void) interrupt PWM5_VECTOR
// 描述: PWM5中断处理程序.
// 参数: None
// 返回: none.
// 版本: V1.0, 2020-10-13
//========================================================================
//void PWM5_Handler (void) interrupt PWM5_VECTOR //中断向量号超过31可借助其它中断号跳转方法详见规格书介绍
//{
// if(PWMCFG45 & 0x80) //PWM5中断
// {
// PWMCFG45 &= ~0x80; //清PWM5中断标志
// // TODO: 在此处添加用户代码
// }
//}