📄 pwm2.lst
字号:
216 1 PCA0CN = 0X40; //允许PCA计数定时器工作。
217 1 // PCA0MD |= 0X04;
218 1 // PCA0MD &= ~0X0A; //频率由TIMER0决定。
219 1 PCA0MD = 0x04;
220 1 PCA0CPM1 = 0X42; //允许PCA比较功能,8位PWM允许。
221 1 PCA0CPL1 = 0X80; //
222 1 PCA0CPH1 = 0X80; //占空比为50%。
223 1 }
224
225 //**********************************************************************
226 //函数名:void Timer0_Init (void)
227 //功能描述:初始化定时器0,PCA时钟是以定时器0溢出率为时钟的。
228 //**********************************************************************
229 void Timer0_Init (void)
230 {
231 1 CKCON = 0x01; // 使用系统时钟4分频
232 1 TMOD &= ~0x0F;
233 1 TMOD |= 0x02; // 8位,方式2
234 1 ET0 = 0; //不用进入中断
235 1 TR0 = 0; // 停止
236 1 }
237
238
239 //**********************************************************************
240 //函数名:void Timer1_Init (void)
241 //功能描述:初始化定时器1
C51 COMPILER V7.08 PWM2 06/22/2006 10:27:59 PAGE 5
242 //**********************************************************************
243 void Timer1_Init (void)
244 {
245 1 CKCON = 0x01; // 使用系统时钟不分频
246 1 TMOD &= 0X0F;
247 1 TMOD |= 0x10; // 16位定时器。
248 1 TL1 = TL1S;
249 1 TH1 = TH1S; //
250 1 ET1 = 1; // 使能Timer0中断。
251 1 TR1 = 0; // 停止
252 1 }
253
254 /***********************************************************************************
255 //函数名:void Play(unsigned char m)
256 //功能描述:发出该音符的声音。
257 /*********************************************************************************/
258 void Play(unsigned char m)
259 {
260 1 switch(m)
261 1 {
262 2 case 0:
263 2 TR0 = 0;
264 2 break;
265 2 case 1:
266 2 TR0 = 0;
267 2 TH0 = 195;
268 2 TL0 = 195;
269 2 TR0 = 1;
270 2 break;
271 2 case 2:
272 2 TR0 = 0;
273 2 TH0 = 202;
274 2 TL0 = 202;
275 2 TR0 = 1;
276 2 break;
277 2 case 3:
278 2 TR0 = 0;
279 2 TH0 = 208;
280 2 TL0 = 208;
281 2 TR0 = 1;
282 2 break;
283 2 case 4:
284 2 TR0 = 0;
285 2 TH0 = 211;
286 2 TL0 = 211;
287 2 TR0 = 1;
288 2 break;
289 2 case 5:
290 2 TR0 = 0;
291 2 TH0 = 215;
292 2 TL0 = 215;
293 2 TR0 = 1;
294 2 break;
295 2 case 6:
296 2 TR0 = 0;
297 2 TH0 = 220;
298 2 TL0 = 220;
299 2 TR0 = 1;
300 2 break;
301 2 case 7:
302 2 TR0 = 0;
303 2 TH0 = 222;
C51 COMPILER V7.08 PWM2 06/22/2006 10:27:59 PAGE 6
304 2 TL0 = 222;
305 2 TR0 = 1;
306 2 break;
307 2 case 8:
308 2 TR0 = 0;
309 2 TH0 = 225;
310 2 TL0 = 225;
311 2 TR0 = 1;
312 2 break;
313 2 case 9:
314 2 TR0 = 0;
315 2 TH0 = 229;
316 2 TL0 = 229;
317 2 TR0 = 1;
318 2 break;
319 2 case 10:
320 2 TR0 = 0;
321 2 TH0 = 232;
322 2 TL0 = 232;
323 2 TR0 = 1;
324 2 break;
325 2 case 11:
326 2 TR0 = 0;
327 2 TH0 = 233;
328 2 TL0 = 233;
329 2 TR0 = 1;
330 2 break;
331 2 case 12:
332 2 TR0 = 0;
333 2 TH0 = 236;
334 2 TL0 = 236;
335 2 TR0 = 1;
336 2 break;
337 2 case 13:
338 2 TR0 = 0;
339 2 TH0 = 238;
340 2 TL0 = 238;
341 2 TR0 = 1;
342 2 break;
343 2 case 14:
344 2 TR0 = 0;
345 2 TH0 = 239;
346 2 TL0 = 239;
347 2 TR0 = 1;
348 2 break;
349 2 case 15:
350 2 TR0 = 0;
351 2 TH0 = 241;
352 2 TL0 = 241;
353 2 TR0 = 1;
354 2 break;
355 2 }
356 1 }
357
358 //**********************************************************************
359 //函数名:void Timer0_ISR (void) interrupt 1
360 //功能描述:定时器0中断函数。
361 //**********************************************************************
362 void Timer1_ISR (void) interrupt 3 //18ms
363 {
364 1 static unsigned char count;
365 1 unsigned char temp;
C51 COMPILER V7.08 PWM2 06/22/2006 10:27:59 PAGE 7
366 1 TF1 = 0;
367 1 TL1 = TL1S;
368 1 TH1 = TH1S;
369 1 if(++count >= 2)
370 1 {
371 2 count = 0;
372 2 if(pm == 0)
373 2 {
374 3 if(td == 1) //停顿
375 3 {
376 4 td = 0;
377 4 temp = tab[gq][music];
378 4 music++;
379 4 if(temp != 0)
380 4 {
381 5
382 5 pm = temp&0x0f; //取拍码
383 5 pm *= 10; //中断为1/4拍的1/10
384 5 temp >>= 4;
385 5 yf = temp&0x0f; //取音符
386 5 Play(yf); //该音符的声音
387 5 }
388 4 else
389 4 {
390 5 TR0 = 0;
391 5 TR1 = 0; //一首歌曲播完后停止
392 5
393 5 }
394 4 }
395 3 else
396 3 {
397 4 td++;
398 4 Play(0); //停顿1/4拍
399 4 }
400 3 }
401 2 else
402 2 {
403 3 pm--;
404 3 Play(yf);
405 3
406 3 }
407 2 }
408 1 }
409 main()
410 {
411 1 PCA0MD &= ~0x40; //关闭看门狗。
412 1 PORT_Init(); //端口初始化。
413 1 Internal_Crystal(); //内部晶体。
414 1 Timer0_Init();
415 1 Timer1_Init();
416 1 PWMInit(); //串口初始化。
417 1 // CR = 1; //开启定时器。
418 1 EA = 1;
419 1 gq = 0;
420 1 TR1 = 1;
421 1 while(1);
422 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 469 ----
CONSTANT SIZE = 1250 ----
C51 COMPILER V7.08 PWM2 06/22/2006 10:27:59 PAGE 8
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -