C51 COMPILER V9.60.0.0 PWM 04/11/2023 08:44:51 PAGE 1 C51 COMPILER V9.60.0.0, COMPILATION OF MODULE PWM OBJECT MODULE PLACED IN .\Objects\PWM.obj COMPILER INVOKED BY: d:\Keil_v5\C51\BIN\C51.EXE mycode\PWM.C OPTIMIZE(8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXTEND - PRINT(.\Listings\PWM.lst) TABS(2) OBJECT(.\Objects\PWM.obj) line level source 1 /*---------------------------------------------------------------------*/ 2 /* --- STC MCU Limited ------------------------------------------------*/ 3 /* --- STC 1T Series MCU Demo Programme -------------------------------*/ 4 /* --- Mobile: (86)13922805190 ----------------------------------------*/ 5 /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/ 6 /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/ 7 /* --- Web: www.STCMCU.com --------------------------------------------*/ 8 /* --- Web: www.STCMCUDATA.com ---------------------------------------*/ 9 /* --- QQ: 800003751 -------------------------------------------------*/ 10 /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */ 11 /*---------------------------------------------------------------------*/ 12 13 #include "PWM.h" 14 PWMx_Duty PWMB_Duty; 15 u8 PWM_Configuration(u8 PWM, PWMx_InitDefine *PWMx) 16 { 17 1 if (PWM == PWMA) 18 1 { 19 2 EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */ 20 2 21 2 if (PWMx->PWM1_SetPriority <= Priority_3) 22 2 PWM1_Priority(PWMx->PWM1_SetPriority); // 指定中断优先级(低到高) Priority_0,Priority_1,Priorit -y_2,Priority_3 23 2 if (PWMx->PWM2_SetPriority <= Priority_3) 24 2 PWM2_Priority(PWMx->PWM2_SetPriority); // 指定中断优先级(低到高) Priority_0,Priority_1,Priorit -y_2,Priority_3 25 2 if (PWMx->PWM3_SetPriority <= Priority_3) 26 2 PWM3_Priority(PWMx->PWM3_SetPriority); // 指定中断优先级(低到高) Priority_0,Priority_1,Priorit -y_2,Priority_3 27 2 if (PWMx->PWM4_SetPriority <= Priority_3) 28 2 PWM4_Priority(PWMx->PWM4_SetPriority); // 指定中断优先级(低到高) Priority_0,Priority_1,Priorit -y_2,Priority_3 29 2 30 2 PWMA_CCER1_Disable(); // 关闭所有输入捕获/比较输出 31 2 PWMA_CCER2_Disable(); // 关闭所有输入捕获/比较输出 32 2 PWMA_OC1ModeSet(PWMx->PWM1_Mode); // 设置输出比较模式 33 2 PWMA_OC2ModeSet(PWMx->PWM2_Mode); // 设置输出比较模式 34 2 PWMA_OC3ModeSet(PWMx->PWM3_Mode); // 设置输出比较模式 35 2 PWMA_OC4ModeSet(PWMx->PWM4_Mode); // 设置输出比较模式 36 2 if (PWMx->PWM_Reload == ENABLE) 37 2 PWMA_OC1_ReloadEnable(); // 输出比较的预装载使能 38 2 else 39 2 PWMA_OC1_RelosdDisable(); // 禁止输出比较的预装载 40 2 if (PWMx->PWM_Fast == ENABLE) 41 2 PWMA_OC1_FastEnable(); // 输出比较快速功能使能 42 2 else 43 2 PWMA_OC1_FastDisable(); // 禁止输出比较快速功能 44 2 45 2 if (PWMx->PWM_CC1Enable == ENABLE) 46 2 PWMA_CC1E_Enable(); // 开启输入捕获/比较输出 47 2 else 48 2 PWMA_CC1E_Disable(); // 关闭输入捕获/比较输出 49 2 if (PWMx->PWM_CC1NEnable == ENABLE) 50 2 PWMA_CC1NE_Enable(); // 开启输入捕获/比较输出 C51 COMPILER V9.60.0.0 PWM 04/11/2023 08:44:51 PAGE 2 51 2 else 52 2 PWMA_CC1NE_Disable(); // 关闭输入捕获/比较输出 53 2 if (PWMx->PWM_CC2Enable == ENABLE) 54 2 PWMA_CC2E_Enable(); // 开启输入捕获/比较输出 55 2 else 56 2 PWMA_CC2E_Disable(); // 关闭输入捕获/比较输出 57 2 if (PWMx->PWM_CC2NEnable == ENABLE) 58 2 PWMA_CC2NE_Enable(); // 开启输入捕获/比较输出 59 2 else 60 2 PWMA_CC2NE_Disable(); // 关闭输入捕获/比较输出 61 2 if (PWMx->PWM_CC3Enable == ENABLE) 62 2 PWMA_CC3E_Enable(); // 开启输入捕获/比较输出 63 2 else 64 2 PWMA_CC3E_Disable(); // 关闭输入捕获/比较输出 65 2 if (PWMx->PWM_CC3NEnable == ENABLE) 66 2 PWMA_CC3NE_Enable(); // 开启输入捕获/比较输出 67 2 else 68 2 PWMA_CC3NE_Disable(); // 关闭输入捕获/比较输出 69 2 if (PWMx->PWM_CC4Enable == ENABLE) 70 2 PWMA_CC4E_Enable(); // 开启输入捕获/比较输出 71 2 else 72 2 PWMA_CC4E_Disable(); // 关闭输入捕获/比较输出 73 2 if (PWMx->PWM_CC4NEnable == ENABLE) 74 2 PWMA_CC4NE_Enable(); // 开启输入捕获/比较输出 75 2 else 76 2 PWMA_CC4NE_Disable(); // 关闭输入捕获/比较输出 77 2 78 2 PWMA_AutoReload(PWMx->PWM_Period); 79 2 PWMA_Duty1(PWMx->PWM1_Duty); 80 2 PWMA_Duty2(PWMx->PWM2_Duty); 81 2 PWMA_Duty3(PWMx->PWM3_Duty); 82 2 PWMA_Duty4(PWMx->PWM4_Duty); 83 2 84 2 PWMA_CCPCAPreloaded(PWMx->PWM_PreLoad); // 捕获/比较预装载控制位(该位只对具有互补输出的通道起作用) 85 2 PWMA_PS = PWMx->PWM_PS_SW; // 切换IO 86 2 PWMA_ENO = PWMx->PWM_EnoSelect; // 输出通道选择 87 2 PWMA_DeadTime(PWMx->PWM_DeadTime); // 死区发生器设置 88 2 89 2 if (PWMx->PWM_BrakeEnable == ENABLE) 90 2 PWMA_BrakeEnable(); // 开启刹车输入 91 2 else 92 2 PWMA_BrakeDisable(); // 禁止刹车输入 93 2 if (PWMx->PWM_MainOutEnable == ENABLE) 94 2 PWMA_BrakeOutputEnable(); // 主输出使能 95 2 else 96 2 PWMA_BrakeOutputDisable(); // 主输出禁止 97 2 if (PWMx->PWM_CEN_Enable == ENABLE) 98 2 PWMA_CEN_Enable(); // 使能计数器 99 2 else 100 2 PWMA_CEN_Disable(); // 禁止计数器 101 2 102 2 EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */ 103 2 return 0; 104 2 } 105 1 106 1 if (PWM == PWMB) 107 1 { 108 2 EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */ 109 2 110 2 if (PWMx->PWM5_SetPriority <= Priority_3) 111 2 PWM5_Priority(PWMx->PWM5_SetPriority); // 指定中断优先级(低到高) Priority_0,Priority_1,Priorit -y_2,Priority_3 C51 COMPILER V9.60.0.0 PWM 04/11/2023 08:44:51 PAGE 3 112 2 113 2 PWMB_CCER1_Disable(); // 关闭所有输入捕获/比较输出 114 2 PWMB_CCER2_Disable(); // 关闭所有输入捕获/比较输出 115 2 PWMB_OC5ModeSet(PWMx->PWM5_Mode); // 设置输出比较模式 116 2 PWMB_OC6ModeSet(PWMx->PWM6_Mode); // 设置输出比较模式 117 2 PWMB_OC7ModeSet(PWMx->PWM7_Mode); // 设置输出比较模式 118 2 PWMB_OC8ModeSet(PWMx->PWM8_Mode); // 设置输出比较模式 119 2 if (PWMx->PWM_Reload == ENABLE) 120 2 PWMB_OC5_ReloadEnable(); // 输出比较的预装载使能 121 2 else 122 2 PWMB_OC5_RelosdDisable(); // 禁止输出比较的预装载 123 2 if (PWMx->PWM_Fast == ENABLE) 124 2 PWMB_OC5_FastEnable(); // 输出比较快速功能使能 125 2 else 126 2 PWMB_OC5_FastDisable(); // 禁止输出比较快速功能 127 2 128 2 if (PWMx->PWM_CC5Enable == ENABLE) 129 2 PWMB_CC5E_Enable(); // 开启输入捕获/比较输出 130 2 else 131 2 PWMB_CC5E_Disable(); // 关闭输入捕获/比较输出 132 2 if (PWMx->PWM_CC6Enable == ENABLE) 133 2 PWMB_CC6E_Enable(); // 开启输入捕获/比较输出 134 2 else 135 2 PWMB_CC6E_Disable(); // 关闭输入捕获/比较输出 136 2 if (PWMx->PWM_CC7Enable == ENABLE) 137 2 PWMB_CC7E_Enable(); // 开启输入捕获/比较输出 138 2 else 139 2 PWMB_CC7E_Disable(); // 关闭输入捕获/比较输出 140 2 if (PWMx->PWM_CC8Enable == ENABLE) 141 2 PWMB_CC8E_Enable(); // 开启输入捕获/比较输出 142 2 else 143 2 PWMB_CC8E_Disable(); // 关闭输入捕获/比较输出 144 2 145 2 PWMB_AutoReload(PWMx->PWM_Period); 146 2 PWMB_Duty5(PWMx->PWM5_Duty); 147 2 PWMB_Duty6(PWMx->PWM6_Duty); 148 2 PWMB_Duty7(PWMx->PWM7_Duty); 149 2 PWMB_Duty8(PWMx->PWM8_Duty); 150 2 151 2 PWMB_CCPCBPreloaded(PWMx->PWM_PreLoad); // 捕获/比较预装载控制位(该位只对具有互补输出的通道起作用) 152 2 PWMB_PS = PWMx->PWM_PS_SW; // 切换IO 153 2 PWMB_ENO = PWMx->PWM_EnoSelect; // 输出通道选择 154 2 PWMB_DeadTime(PWMx->PWM_DeadTime); // 死区发生器设置 155 2 156 2 if (PWMx->PWM_BrakeEnable == ENABLE) 157 2 PWMB_BrakeEnable(); // 开启刹车输入 158 2 else 159 2 PWMB_BrakeDisable(); // 禁止刹车输入 160 2 if (PWMx->PWM_MainOutEnable == ENABLE) 161 2 PWMB_BrakeOutputEnable(); // 主输出使能 162 2 else 163 2 PWMB_BrakeOutputDisable(); // 主输出禁止 164 2 if (PWMx->PWM_CEN_Enable == ENABLE) 165 2 PWMB_CEN_Enable(); // 使能计数器 166 2 else 167 2 PWMB_CEN_Disable(); // 禁止计数器 168 2 169 2 EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */ 170 2 return 0; 171 2 } 172 1 173 1 return 2; // 错误 C51 COMPILER V9.60.0.0 PWM 04/11/2023 08:44:51 PAGE 4 174 1 } 175 176 /*********************************************************/ 177 178 /******************* PWM 占空比设置函数 *******************/ 179 void UpdatePwm(u8 PWM, PWMx_Duty *PWMx) 180 { 181 1 EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */ 182 1 183 1 if (PWM == PWMA) 184 1 { 185 2 PWMA_Duty1(PWMx->PWM1_Duty); 186 2 PWMA_Duty2(PWMx->PWM2_Duty); 187 2 PWMA_Duty3(PWMx->PWM3_Duty); 188 2 PWMA_Duty4(PWMx->PWM4_Duty); 189 2 } 190 1 else 191 1 { 192 2 PWMB_Duty5(PWMx->PWM5_Duty); 193 2 PWMB_Duty6(PWMx->PWM6_Duty); 194 2 PWMB_Duty7(PWMx->PWM7_Duty); 195 2 PWMB_Duty8(PWMx->PWM8_Duty); 196 2 } 197 1 198 1 EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */ 199 1 } 200 201 /*********************************************************/ 202 void PWM_config(void) 203 { 204 1 PWMx_InitDefine PWMx_InitStructure; 205 1 PWMx_InitStructure.PWM5_Mode = CCMRn_PWM_MODE1; 206 1 PWMx_InitStructure.PWM5_SetPriority = Priority_0; 207 1 PWMx_InitStructure.PWM_Period = 1500; 208 1 PWMx_InitStructure.PWM5_Duty = PWMB_Duty.PWM5_Duty; 209 1 PWMx_InitStructure.PWM_DeadTime = 0; 210 1 PWMx_InitStructure.PWM_EnoSelect = ENO5P; 211 1 PWMx_InitStructure.PWM_PS_SW = PWM5_SW_P17; 212 1 PWMx_InitStructure.PWM_CC5Enable = ENABLE; 213 1 PWMx_InitStructure.PWM_MainOutEnable = ENABLE; // ?÷????????, ENABLE,DISABLE 214 1 PWMx_InitStructure.PWM_CEN_Enable = ENABLE; // ?????????÷, ENABLE,DISABLE 215 1 PWM_Configuration(PWMB, &PWMx_InitStructure); // ??????PWM, PWMA,PWMB 216 1 PWMB_Duty.PWM5_Duty = 1500; 217 1 } MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 1448 ---- CONSTANT SIZE = ---- ---- XDATA SIZE = ---- ---- PDATA SIZE = ---- ---- DATA SIZE = 16 52 IDATA SIZE = ---- ---- BIT SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)