Files
RCU_C12_Dimming/Listings/pwm_control.lst
caocong 6ef7f0c503 docs:发布文件
发布生产文件:BLV_C12_Dimm_V19.hex
2025-12-16 16:59:36 +08:00

422 lines
20 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
C51 COMPILER V9.01 PWM_CONTROL 12/16/2025 16:53:47 PAGE 1
C51 COMPILER V9.01, COMPILATION OF MODULE PWM_CONTROL
OBJECT MODULE PLACED IN .\Objects\pwm_control.obj
COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE pwm_control.c OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(.\Listin
-gs\pwm_control.lst) OBJECT(.\Objects\pwm_control.obj)
line level source
1 #include "pwm_control.h"
2 #include "GPIO.h"
3 #include "STC8xxxx.h"
4 #include "PWM15bit.h"
5 #include "timer.h"
6 #include "UART_Set.h"
7 #include "string.h"
8 S_PWM s_pwm;
9 /*
10 *1.串口5.0/5.1的初始化
11 *2.初始化PWM引脚
12 *3.LED_DRV_12V_EN让单片机运行
13 */
14 /******************* IO配置函数 *******************/
15 void GPIO_config(void)
16 {
17 1 GPIO_InitTypeDef GPIO_InitStructure; //结构定义
18 1 /***********************************1*******************************************/
19 1 GPIO_InitStructure.Pin = GPIO_Pin_0 | GPIO_Pin_1; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
20 1 GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_O
-UT_PP
21 1 GPIO_Inilize(GPIO_P5,&GPIO_InitStructure); //初始化
22 1
23 1 /***********************************2*******************************************/
24 1 GPIO_InitStructure.Pin = GPIO_Pin_All; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
25 1 GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_O
-UT_PP
26 1 GPIO_Inilize(GPIO_P0,&GPIO_InitStructure); //初始化
27 1
28 1 GPIO_InitStructure.Pin = GPIO_Pin_Left; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
29 1 GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_O
-UT_PP
30 1 GPIO_Inilize(GPIO_P2,&GPIO_InitStructure); //初始化
31 1
32 1 /***********************************3*******************************************/
33 1 GPIO_InitStructure.Pin = GPIO_Pin_0; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
34 1 GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_O
-UT_PP
35 1 GPIO_Inilize(GPIO_P1,&GPIO_InitStructure); //初始化
36 1 }
37
38 void pwm_config(void)
39 {
40 1 u8 i;
41 1 PWM15_InitTypeDef PWM15_InitStructure;
42 1
43 1 PWM15_InitStructure.PWM_Enable = ENABLE; //PWM使能, ENABLE, DISABLE
44 1 PWM15_InitStructure.PWM_Period = 0x04E2; //PWM周期, 1250,频率为16khz
45 1 PWM15_InitStructure.PWM_Clock_Sel = PWMn_CLK_SYS; //时钟源选择, PWMn_CLK_SYS, PWMn_CLK_TM2
46 1 PWM15_InitStructure.PWM_Clock_PS = 0; //系统时钟分频参数(PS+1分频), 0~15
47 1 PWM15_InitStructure.PWM_Counter = ENABLE; //计数器使能, ENABLE, DISABLE
48 1
49 1 PWM15_Init(PWM0,&PWM15_InitStructure); //初始化PWM0
50 1 PWM15_Init(PWM2,&PWM15_InitStructure); //初始化PWM2
C51 COMPILER V9.01 PWM_CONTROL 12/16/2025 16:53:47 PAGE 2
51 1
52 1 PWM15Duty(PWM00,initial_Val); //PWM_ID, 输出低电平位置, 输出高电平位置
53 1 PWM15Duty(PWM01,initial_Val); //PWM_ID, 输出低电平位置, 输出高电平位置
54 1 PWM15Duty(PWM02,initial_Val); //PWM_ID, 输出低电平位置, 输出高电平位置
55 1 PWM15Duty(PWM03,initial_Val); //PWM_ID, 输出低电平位置, 输出高电平位置
56 1 PWM15Duty(PWM04,initial_Val);
57 1 PWM15Duty(PWM05,initial_Val);
58 1 PWM15Duty(PWM06,initial_Val);
59 1 PWM15Duty(PWM07,initial_Val);
60 1
61 1 PWM15Duty(PWM20,initial_Val);
62 1 PWM15Duty(PWM21,initial_Val);
63 1 PWM15Duty(PWM22,initial_Val);
64 1 PWM15Duty(PWM23,initial_Val);
65 1
66 1 memset(&s_pwm,0,sizeof(s_pwm));
67 1 for(i=0;i<12;i++)
68 1 {
69 2 s_pwm.currpwm[i]=initial_Val;
70 2 }
71 1 PWMChannelCtrl(PWM00,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发
-点中断, 第一触发点中断
72 1 PWMChannelCtrl(PWM01,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发
-点中断, 第一触发点中断
73 1 PWMChannelCtrl(PWM02,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发
-点中断, 第一触发点中断
74 1 PWMChannelCtrl(PWM03,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触<E4B8AA>
-⒌阒卸<E99892>, 第一触发点中断
75 1 PWMChannelCtrl(PWM04,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发
-点中断, 第一触发点中断
76 1 PWMChannelCtrl(PWM05,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发
-点中断, 第一触发点中断
77 1 PWMChannelCtrl(PWM06,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发
-点中断, 第一触发点中断
78 1 PWMChannelCtrl(PWM07,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触<E4B8AA>
-⒌阒卸<E99892>, 第一触发点中断
79 1
80 1 PWMChannelCtrl(PWM20,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发
-点中断, 第一触发点中断
81 1 PWMChannelCtrl(PWM21,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发
-点中断, 第一触发点中断
82 1 PWMChannelCtrl(PWM22,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发
-点中断, 第一触发点中断
83 1 PWMChannelCtrl(PWM23,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触<E4B8AA>
-⒌阒卸<E99892>, 第一触发点中断
84 1
85 1 }
86
87
88 //10ms渐变一级
89 void deal_command1(void)
90 {
91 1 int i=0;
92 1 static u32 systick_command1 = 0;
93 1
94 1 if (systick_1ms - systick_command1 >= 10)
95 1 {
96 2 systick_command1 = systick_1ms;
97 2 for (i = 0; i < 12; i++)
98 2 {
99 3 if (s_recv.flag1[i])
100 3 {
C51 COMPILER V9.01 PWM_CONTROL 12/16/2025 16:53:47 PAGE 3
101 4 if (s_pwm.wanttopwm[i] > s_pwm.currpwm[i])
102 4 {
103 5 //s_pwm.doublecurrpwm[i] = s_pwm.currpwm[i];
104 5 s_pwm.doublecurrpwm[i] += s_pwm.every_change_10ms[i];
105 5 s_pwm.currpwm[i] = (u16)s_pwm.doublecurrpwm[i];
106 5
107 5 if(s_recv.global_brightness==0)
108 5 {
109 6 s_pwm.currvalue[i]=0;
110 6 }
111 5 else
112 5 {
113 6 s_pwm.currvalue[i] = (PWM_MAX_VALUE - s_pwm.currpwm[i]) * 100 * 100 / PWM_MAX_VALU
-E / s_recv.global_brightness;
114 6 }
115 5
116 5 if ( s_pwm.wanttopwm[i] < s_pwm.currpwm[i])
117 5 {
118 6 s_pwm.currpwm[i] = s_pwm.wanttopwm[i];
119 6 }
120 5 }
121 4
122 4
123 4 //当想要的亮度大于当前值时
124 4 if (s_pwm.wanttopwm[i] < s_pwm.currpwm[i])
125 4 {
126 5 //s_pwm.doublecurrpwm[i] = s_pwm.currpwm[i];
127 5 s_pwm.doublecurrpwm[i] -= s_pwm.every_change_10ms[i];
128 5 s_pwm.currpwm[i] = (u16)s_pwm.doublecurrpwm[i];
129 5
130 5 if(s_recv.global_brightness==0)
131 5 {
132 6 s_pwm.currvalue[i]=0;
133 6 }
134 5 else
135 5 {
136 6 s_pwm.currvalue[i] = (PWM_MAX_VALUE - s_pwm.currpwm[i]) * 100 * 100 / PWM_MAX_VALUE / s_recv.global_
-brightness;
137 6 }
138 5
139 5 if (s_pwm.currpwm[i] < s_pwm.wanttopwm[i] + s_pwm.every_change_10ms[i])
140 5 {
141 6 s_pwm.currpwm[i] = 0;
142 6 s_pwm.currpwm[i] = s_pwm.wanttopwm[i];
143 6 }
144 5 }
145 4
146 4
147 4 if (s_pwm.wanttopwm[i] == s_pwm.currpwm[i])
148 4 {
149 5 s_pwm.currvalue[i] = s_recv.B_Ch[i];
150 5 s_recv.flag1[i] = 0;
151 5 }
152 4 }
153 3 }
154 2 }
155 1 }
156
157 void deal_command2(void)
158 {
159 1 int i=0;
160 1 static u32 systick_command2 = 0;
C51 COMPILER V9.01 PWM_CONTROL 12/16/2025 16:53:47 PAGE 4
161 1 if (systick_1ms - systick_command2 >= 10)
162 1 {
163 2 systick_command2 = systick_1ms;
164 2 for (i = 0; i < 12; i++)
165 2 {
166 3 if (s_recv.flag2[i])
167 3 {
168 4 switch (s_recv.mode[i])
169 4 {
170 5 //顶端停止模式
171 5 case 0x00:
172 5 //亮度降低
173 5 if (s_recv.forward[i] == 0x00)
174 5 {
175 6 s_pwm.wanttopwm[i] = PWM_MAX_VALUE - s_recv.B_min * PWM_MAX_VALUE * s_recv.global_brightness
- / 100 / 100 * s_recv.key_status[i];
176 6 s_pwm.currpwm[i] += s_recv.pwm_step[i];
177 6 if(s_recv.global_brightness==0)
178 6 {
179 7 s_pwm.currvalue[i]=0;
180 7 }
181 6 else
182 6 {
183 7 s_pwm.currvalue[i] = (PWM_MAX_VALUE - s_pwm.currpwm[i]) * 100 * 100 / PWM_MAX_VALUE / s_re
-cv.global_brightness;
184 7 }
185 6 if (s_pwm.currpwm[i] >= s_pwm.wanttopwm[i])
186 6 {
187 7 s_recv.flag2[i] = 0;
188 7 s_pwm.currpwm[i] = s_pwm.wanttopwm[i];
189 7 s_pwm.currvalue[i] = s_recv.B_min; //用于回复数据
190 7 }
191 6 }
192 5 //亮度增加
193 5 if (s_recv.forward[i] == 0x01)
194 5 {
195 6 s_pwm.wanttopwm[i] = PWM_MAX_VALUE - s_recv.B_max * PWM_MAX_VALUE * s_recv.global_brightness
- / 100 / 100 * s_recv.key_status[i];
196 6 if (s_pwm.currpwm[i] <= s_pwm.wanttopwm[i] + s_recv.pwm_step[i])
197 6 {
198 7 s_recv.flag2[i] = 0;
199 7 s_pwm.currpwm[i] = s_pwm.wanttopwm[i];
200 7 s_pwm.currvalue[i] = s_recv.B_max;
201 7 }
202 6 else
203 6 {
204 7 s_pwm.currpwm[i] -= s_recv.pwm_step[i];
205 7 if(s_recv.global_brightness==0)
206 7 {
207 8 s_pwm.currvalue[i]=0;
208 8 }
209 7 else
210 7 {
211 8 s_pwm.currvalue[i] = (PWM_MAX_VALUE - s_pwm.currpwm[i]) * 100 * 100 / PWM_MAX_VALUE / s_recv.global_b
-rightness;
212 8 }
213 7 }
214 6 }
215 5 break;
216 5
217 5 //双向循环模式
218 5 case 0x01:
C51 COMPILER V9.01 PWM_CONTROL 12/16/2025 16:53:47 PAGE 5
219 5 //递减
220 5 if (s_recv.forward[i] == 0x00)
221 5 {
222 6 s_pwm.wanttopwm[i] = PWM_MAX_VALUE - s_recv.B_min * PWM_MAX_VALUE * s_recv.global_brightness
- / 100 / 100 * s_recv.key_status[i];
223 6 s_pwm.currpwm[i] += s_recv.pwm_step[i];
224 6 if(s_recv.global_brightness==0)
225 6 {
226 7 s_pwm.currvalue[i]=0;
227 7 }
228 6 else
229 6 {
230 7 s_pwm.currvalue[i] = (PWM_MAX_VALUE - s_pwm.currpwm[i]) * 100 * 100 / PWM_MAX_VALUE / s_re
-cv.global_brightness;
231 7 }
232 6 if (s_pwm.currpwm[i] >= s_pwm.wanttopwm[i])
233 6 {
234 7 s_recv.forward[i] = 0x01;
235 7 s_pwm.currpwm[i] = s_pwm.wanttopwm[i];
236 7 s_pwm.currvalue[i] = s_recv.B_min; //用于回复数据
237 7 }
238 6 }
239 5 //递增
240 5 if (s_recv.forward[i] == 0x01)
241 5 {
242 6 s_pwm.wanttopwm[i] = PWM_MAX_VALUE - s_recv.B_max * PWM_MAX_VALUE * s_recv.global_brightness
- / 100 / 100 * s_recv.key_status[i];
243 6 if (s_pwm.currpwm[i] <= s_pwm.wanttopwm[i] + s_recv.pwm_step[i])
244 6 {
245 7 s_recv.forward[i] = 0x00;
246 7 s_pwm.currpwm[i] = s_pwm.wanttopwm[i];
247 7 s_pwm.currvalue[i] = s_recv.B_max;
248 7 }
249 6 else
250 6 {
251 7 s_pwm.currpwm[i] -= s_recv.pwm_step[i];
252 7 if(s_recv.global_brightness==0)
253 7 {
254 8 s_pwm.currvalue[i]=0;
255 8 }
256 7 else
257 7 {
258 8 s_pwm.currvalue[i] = (PWM_MAX_VALUE - s_pwm.currpwm[i]) * 100 * 100 / PWM_MAX_VALUE / s_recv.global_b
-rightness;
259 8 }
260 7 }
261 6 }
262 5 break;
263 5 case 0x02:
264 5 //停止调节
265 5 s_recv.flag2[i] = 0;
266 5 break;
267 5 }
268 4 }
269 3 }
270 2 }
271 1 }
272
273
274 //直接关掉灯,并记录状态
275 void Close_Light(u8 i)
276 {
C51 COMPILER V9.01 PWM_CONTROL 12/16/2025 16:53:47 PAGE 6
277 1 s_pwm.currpwm[i]=20001ul; //持续输出高电平,非常特殊,勿改
278 1 }
279
280 //打开灯时,会回复到原来的亮度
281 void Open_Light(u8 pin)
282 {
283 1 s_pwm.currpwm[pin] = PWM_MAX_VALUE - s_pwm.currvalue[pin] * PWM_MAX_VALUE * s_recv.global_brightness / 10
-0 / 100;
284 1 }
285
286 void PWM_write(u8 i, u16 Val)
287 {
288 1 switch (i)
289 1 {
290 2 case 0:
291 2 PWM15Duty(PWM07,Val);
292 2 break;
293 2 case 1:
294 2 PWM15Duty(PWM06,Val);
295 2 break;
296 2 case 2:
297 2 PWM15Duty(PWM05,Val);
298 2 break;
299 2 case 3:
300 2 PWM15Duty(PWM04,Val);
301 2 break;
302 2 case 4:
303 2 PWM15Duty(PWM03,Val);
304 2 break;
305 2 case 5:
306 2 PWM15Duty(PWM02,Val);
307 2 break;
308 2 case 6:
309 2 PWM15Duty(PWM01,Val);
310 2 break;
311 2 case 7:
312 2 PWM15Duty(PWM00,Val);
313 2 break;
314 2 case 8:
315 2 PWM15Duty(PWM23,Val);
316 2 break;
317 2 case 9:
318 2 PWM15Duty(PWM22,Val);
319 2 break;
320 2 case 10:
321 2 PWM15Duty(PWM21,Val);
322 2 break;
323 2 case 11:
324 2 PWM15Duty(PWM20,Val);
325 2 break;
326 2 }
327 1 }
328 void show_light(void)
329 {
330 1 int i;
331 1 for (i = 0; i < 12; i++)
332 1 {
333 2 if(s_pwm.currpwm[i]==20000ul)
334 2 {
335 3 Close_Light(i);
336 3 }
337 2 else
C51 COMPILER V9.01 PWM_CONTROL 12/16/2025 16:53:47 PAGE 7
338 2 {
339 3 PWM_write(i, s_pwm.currpwm[i]);
340 3 }
341 2 }
342 1 }
343
344 //void checkpwm(void)
345 //{
346 // int i;
347 // for (i = 0; i < 12; i++)
348 // {
349 // if ((s_recv.flag1[i] == 0) && (s_recv.flag2[i] == 0) && (s_recv.changeflag == 1))
350 // {
351 // if (s_pwm.wanttopwmflash[i] != s_pwm.currpwm[i])
352 // {
353 // s_pwm.currpwm[i] = s_pwm.wanttopwmflash[i];
354 // }
355 // }
356 // }
357 // s_recv.changeflag = 0;
358 //}
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 3842 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 241 ----
PDATA SIZE = ---- ----
DATA SIZE = 8 18
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)