422 lines
20 KiB
Plaintext
422 lines
20 KiB
Plaintext
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)
|