当前位置:   article > 正文

单片机实验7_单片机驱动喇叭

单片机驱动喇叭


一、实验目的 
1、掌握串行口工作方式0的使用和用C51的编程方法; 
2、掌握移位寄存器74HC164的工作原理; 
3、掌握单片机驱动喇叭发声原理; 
4、掌握定时计数器产生方波的编程方法; 
二、实验设备与环境 
硬件:DOFLY单片机实验仪; 
软件:Keil uVision3开发环境。 
三、实验内容 
1、实验内容一 
1.1、问题一: 
使用74HC164的并行输出引脚接8支发光二极管,利用它的串入并出功能,把发光二极管从左向右轮流点亮,并反复循环。RXD(P3.0)接J11 A、B,TXD(P3.1)接J11 CLK,输出J12用8根杜邦线接发光二极管J9电路。原理图见图1: 
图1 实验一的原理图

图1 实验一的原理图


1.2、问题一的代码:

 

  1. #include <reg51.h>
  2. #include <intrins.h>
  3. sbit P1_0 = P1^0;
  4. void delay();
  5. void main()
  6. {
  7. unsigned char i;
  8. SCON = 0x00;
  9. ES = 0;
  10. for (;;)
  11. {
  12. for (i = 0; i < 8;i++)
  13. {
  14. P1_0 = 0;
  15. SBUF = _cror_(0x80,i);
  16. while(!TI)
  17. {}
  18. P1_0 = 1;
  19. TI = 0;
  20. delay();
  21. }
  22. }
  23. }
  24. void delay()
  25. {
  26. int y;
  27. for(y=300;y>0;y--);
  28. }

2、实验内容二 
2.1、问题二: 
用定时器T1方式1来产生歌谱中各音符对应频率的方波,由P1.1输出驱动喇叭。实现有外部中断0时演奏乐曲“小星星”一次,有外部中断1时演奏乐曲“新年好”一次。控制节拍可通过调用延时子程序次数来实现(考虑外部中断和定时计数器中断的优先级),ULN2003为电流放大芯片,驱动喇叭。 
把乐谱中的音符和相应的节拍变换为定时常数和延时常数,作为数据表格数组tab存放在存储器中。每演奏一个音符调用定时常数和延时常数,分别用以控制定时器产生方波的频率和该频率方波的持续时间。当延时时间到,再调用下一个音符的定时常数和延时常数。依次下去,就可自动演奏出乐曲。 
实验原理图见图2,流程图见图3: 
图2 实验二原理图 

图2 实验二原理图
图3 实现单首音乐播放的流程图 
图3 实现单首音乐播放的流程图


2.2、问题二的代码:

 

  1. #include <reg51.h>
  2. #include <intrins.h>
  3. void delay(int);
  4. code tab1[] = {0xFC,0x44,0x04,0xFC,0x44,0x04,0xFD,0x83,0x04,0xFD,0x83,0x04,0xFD,
  5. 0xC8,0x04,0xFD,0xC8,0x04,0xFD,0x83,0x04,0x00,0x00,0x04,0xFD,0x34,0x04,0xFD,
  6. 0x34,0x04,0xFD,0x09,0x04,0xFD,0x09,0x04,0xFC,0xAD,0x04,0xFC,0xAD,0x04,0xFC,
  7. 0x44,0x04,0x00,0x00,0x04,0xFF,0xFF};
  8. code tab2[] = {0xFC,0x4A,0x04,0xFC,0x4A,0x04,0xFC,0x4A,0x08,0xFB,0x00,0x08,0xFD,
  9. 0x08,0x04,0xFD,0x08,0x04,0xFD,0x08,0x08,0xFC,0x4A,0x08,0xFC,0x4A,0x04,0xFD,0x08,
  10. 0x04,0xFD,0x80,0x08,0xFD,0x80,0x08,0xFD,0x30,0x04,0xFD,0x08,0x04,0xFC,0xAE,0x08,
  11. 0x00,0x00,0x08,0xFF,0xFF};
  12. sbit P1_1 = P1^1;
  13. int H,L;
  14. void main()
  15. {
  16. EA = 1;
  17. ET1 = 1;
  18. EX0 = 1;
  19. EX1 = 1;
  20. PT1 = 1;
  21. TCON = 0x05;
  22. TMOD = 0x10;
  23. P1_1 = 1;
  24. while(1) ;
  25. }
  26. void star() interrupt 0
  27. {
  28. int t;
  29. int i;
  30. for (i = 0; i < 17;i++)
  31. {
  32. H = tab1[i*3];
  33. L = tab1[i*3 + 1];
  34. if (H == 0x00 && L == 0x00)
  35. TR1 = 0;
  36. else if (H == 0xFF && L == 0xFF)
  37. break ;
  38. else
  39. {
  40. TR1 = 1;
  41. TH1 = H;
  42. TL1 = L;
  43. }
  44. t = tab1[i * 3 + 2];
  45. delay(t);
  46. }
  47. }
  48. void new() interrupt 2
  49. {
  50. int t;
  51. int i;
  52. for (i = 0; i < 17;i++)
  53. {
  54. H = tab2[i*3];
  55. L = tab2[i*3 + 1];
  56. if (H == 0x00 && L == 0x00)
  57. TR1 = 0;
  58. else if (H == 0xFF && L == 0xFF)
  59. break ;
  60. else
  61. {
  62. TR1 = 1;
  63. TH1 = H;
  64. TL1 = L;
  65. }
  66. t = tab2[i * 3 + 2];
  67. delay(t);
  68. }
  69. }
  70. void rec() interrupt 3
  71. {
  72. P1_1 = !P1_1;
  73. TH1 = H;
  74. TL1 = L;
  75. }
  76. void delay(int n)
  77. {
  78. while (n--)
  79. {
  80. int i,j;
  81. for (i = 10; i > 0;i--)
  82. for(j = 625 ; j > 0;j--);
  83. }
  84. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/1007044
推荐阅读
相关标签
  

闽ICP备14008679号