当前位置:   article > 正文

单片机C语言实例:14、音频输出_单片机音频输出

单片机音频输出

一、喇叭发声原理

程序实例1:

  1. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  2. sbit SPK = P1^2; //定义喇叭端口
  3. /*------------------------------------------------
  4. 函数声明
  5. ------------------------------------------------*/
  6. void DelayUs2x(unsigned char t);//函数声明
  7. void DelayMs(unsigned char t);
  8. /*------------------------------------------------
  9. 主函数
  10. ------------------------------------------------*/
  11. main()
  12. {
  13. while(1)
  14. {
  15. DelayMs(1); //发出大约500Hz的方波 频率越大声音越尖
  16. SPK=!SPK;
  17. }
  18. }
  19. /*------------------------------------------------
  20. uS延时函数,含有输入参数 unsigned char t,无返回值
  21. unsigned char 是定义无符号字符变量,其值的范围是
  22. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  23. 长度如下 T=tx2+5 uS
  24. ------------------------------------------------*/
  25. void DelayUs2x(unsigned char t)
  26. {
  27. while(--t);
  28. }
  29. /*------------------------------------------------
  30. mS延时函数,含有输入参数 unsigned char t,无返回值
  31. unsigned char 是定义无符号字符变量,其值的范围是
  32. 0~255 这里使用晶振12M,精确延时请使用汇编
  33. ------------------------------------------------*/
  34. void DelayMs(unsigned char t)
  35. {
  36. while(t--)
  37. {
  38. //大致延时1mS
  39. DelayUs2x(245);
  40. DelayUs2x(245);
  41. }
  42. }

二、警车声音

程序实例2:

  1. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  2. sbit SPK = P1^2; //定义喇叭端口
  3. unsigned char frq;
  4. void DelayUs2x(unsigned char t);//函数声明
  5. void DelayMs(unsigned char t);
  6. /*------------------------------------------------
  7. 定时器初始化子程序
  8. ------------------------------------------------*/
  9. void Init_Timer0(void)
  10. {
  11. TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
  12. //TH0=0x00; //给定初值
  13. //TL0=0x00;
  14. EA=1; //总中断打开
  15. ET0=1; //定时器中断打开
  16. TR0=1; //定时器开关打开
  17. }
  18. /*------------------------------------------------
  19. 主函数
  20. ------------------------------------------------*/
  21. main()
  22. {
  23. Init_Timer0(); //初始化定时器
  24. while(1)
  25. {
  26. DelayMs(1); //延时1ms,累加频率值
  27. frq++;
  28. }
  29. }
  30. /*------------------------------------------------
  31. uS延时函数,含有输入参数 unsigned char t,无返回值
  32. unsigned char 是定义无符号字符变量,其值的范围是
  33. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  34. 长度如下 T=tx2+5 uS
  35. ------------------------------------------------*/
  36. void DelayUs2x(unsigned char t)
  37. {
  38. while(--t);
  39. }
  40. /*------------------------------------------------
  41. mS延时函数,含有输入参数 unsigned char t,无返回值
  42. unsigned char 是定义无符号字符变量,其值的范围是
  43. 0~255 这里使用晶振12M,精确延时请使用汇编
  44. ------------------------------------------------*/
  45. void DelayMs(unsigned char t)
  46. {
  47. while(t--)
  48. {
  49. //大致延时1mS
  50. DelayUs2x(245);
  51. DelayUs2x(245);
  52. }
  53. }
  54. /*------------------------------------------------
  55. 定时器中断子程序
  56. ------------------------------------------------*/
  57. void Timer0_isr(void) interrupt 1
  58. {
  59. TH0=0xfe; //重新赋值
  60. TL0=frq; //低8位值在主程序中不断累加
  61. SPK=!SPK; //端口电平取反
  62. }

三、救护车声音

程序实例3:

  1. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  2. sbit SPK = P1^2; //定义喇叭端口
  3. unsigned char frq;
  4. void DelayUs2x(unsigned char t);//函数声明
  5. void DelayMs(unsigned char t);
  6. /*------------------------------------------------
  7. 定时器初始化子程序
  8. ------------------------------------------------*/
  9. void Init_Timer0(void)
  10. {
  11. TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
  12. //TH0=0x00; //给定初值
  13. //TL0=0x00;
  14. EA=1; //总中断打开
  15. ET0=1; //定时器中断打开
  16. TR0=1; //定时器开关打开
  17. }
  18. /*------------------------------------------------
  19. 主函数
  20. ------------------------------------------------*/
  21. main()
  22. {
  23. unsigned char i;
  24. Init_Timer0(); //初始化定时器
  25. while(1)
  26. {
  27. frq=0;
  28. for(i=0;i<60;i++)//播放1s左右一种频率
  29. {
  30. DelayMs(10);
  31. }
  32. frq=100;
  33. for(i=0;i<60;i++)//播放1s左右另外一种频率
  34. {
  35. DelayMs(10);
  36. }
  37. }
  38. }
  39. /*------------------------------------------------
  40. uS延时函数,含有输入参数 unsigned char t,无返回值
  41. unsigned char 是定义无符号字符变量,其值的范围是
  42. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  43. 长度如下 T=tx2+5 uS
  44. ------------------------------------------------*/
  45. void DelayUs2x(unsigned char t)
  46. {
  47. while(--t);
  48. }
  49. /*------------------------------------------------
  50. mS延时函数,含有输入参数 unsigned char t,无返回值
  51. unsigned char 是定义无符号字符变量,其值的范围是
  52. 0~255 这里使用晶振12M,精确延时请使用汇编
  53. ------------------------------------------------*/
  54. void DelayMs(unsigned char t)
  55. {
  56. while(t--)
  57. {
  58. //大致延时1mS
  59. DelayUs2x(245);
  60. DelayUs2x(245);
  61. }
  62. }
  63. /*------------------------------------------------
  64. 定时器中断子程序
  65. ------------------------------------------------*/
  66. void Timer0_isr(void) interrupt 1
  67. {
  68. TH0=0xfe; //重新赋值
  69. TL0=frq; //低8位值在主程序中不断累加
  70. SPK=!SPK; //端口电平取反
  71. }

四、喇叭滴答声

程序实例4:

  1. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  2. sbit SPK = P1^2; //定义喇叭端口
  3. unsigned char frq;
  4. void DelayUs2x(unsigned char t);//函数声明
  5. void DelayMs(unsigned char t);
  6. /*------------------------------------------------
  7. 主函数
  8. ------------------------------------------------*/
  9. main()
  10. {
  11. unsigned int i;
  12. while(1)
  13. {
  14. for(i=0;i<500;i++)
  15. {
  16. DelayUs2x(200);
  17. DelayUs2x(200);
  18. SPK=!SPK;
  19. }
  20. for(i=0;i<500;i++)
  21. {
  22. DelayMs(1);
  23. SPK=!SPK;
  24. }
  25. }
  26. }
  27. /*------------------------------------------------
  28. uS延时函数,含有输入参数 unsigned char t,无返回值
  29. unsigned char 是定义无符号字符变量,其值的范围是
  30. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  31. 长度如下 T=tx2+5 uS
  32. ------------------------------------------------*/
  33. void DelayUs2x(unsigned char t)
  34. {
  35. while(--t);
  36. }
  37. /*------------------------------------------------
  38. mS延时函数,含有输入参数 unsigned char t,无返回值
  39. unsigned char 是定义无符号字符变量,其值的范围是
  40. 0~255 这里使用晶振12M,精确延时请使用汇编
  41. ------------------------------------------------*/
  42. void DelayMs(unsigned char t)
  43. {
  44. while(t--)
  45. {
  46. //大致延时1mS
  47. DelayUs2x(245);
  48. DelayUs2x(245);
  49. }
  50. }

五、报警声音

程序实例5:

  1. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  2. sbit SPK = P1^2; //定义喇叭端口
  3. unsigned char frq;
  4. void DelayUs2x(unsigned char t);//函数声明
  5. void DelayMs(unsigned char t);
  6. /*------------------------------------------------
  7. 主函数
  8. ------------------------------------------------*/
  9. main()
  10. {
  11. unsigned int i;
  12. while(1)
  13. {
  14. for(i=0;i<200;i++)
  15. {
  16. DelayUs2x(200);
  17. SPK=!SPK;
  18. }
  19. SPK=0;//防止一直给喇叭通电造成损坏
  20. for(i=0;i<200;i++)
  21. {
  22. DelayMs(1);
  23. }
  24. }
  25. }
  26. /*------------------------------------------------
  27. uS延时函数,含有输入参数 unsigned char t,无返回值
  28. unsigned char 是定义无符号字符变量,其值的范围是
  29. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  30. 长度如下 T=tx2+5 uS
  31. ------------------------------------------------*/
  32. void DelayUs2x(unsigned char t)
  33. {
  34. while(--t);
  35. }
  36. /*------------------------------------------------
  37. mS延时函数,含有输入参数 unsigned char t,无返回值
  38. unsigned char 是定义无符号字符变量,其值的范围是
  39. 0~255 这里使用晶振12M,精确延时请使用汇编
  40. ------------------------------------------------*/
  41. void DelayMs(unsigned char t)
  42. {
  43. while(t--)
  44. {
  45. //大致延时1mS
  46. DelayUs2x(245);
  47. DelayUs2x(245);
  48. }
  49. }

六、消防车警报

程序实例6:

  1. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  2. sbit SPK = P1^2; //定义喇叭端口
  3. unsigned char frq;
  4. void DelayUs2x(unsigned char t);//函数声明
  5. void DelayMs(unsigned char t);
  6. /*------------------------------------------------
  7. 定时器初始化子程序
  8. ------------------------------------------------*/
  9. void Init_Timer0(void)
  10. {
  11. TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
  12. //TH0=0x00; //给定初值
  13. //TL0=0x00;
  14. EA=1; //总中断打开
  15. ET0=1; //定时器中断打开
  16. TR0=1; //定时器开关打开
  17. }
  18. /*------------------------------------------------
  19. 主函数
  20. ------------------------------------------------*/
  21. main()
  22. {
  23. unsigned char i;
  24. Init_Timer0(); //初始化定时器
  25. while(1)
  26. {
  27. for(i=0;i<200;i++)
  28. {
  29. DelayMs(10); //延时10ms,累加频率值
  30. frq=i;
  31. }
  32. for(i=200;i>0;i--)
  33. {
  34. DelayMs(10); //延时10ms,累减频率值
  35. frq=i;
  36. }
  37. }
  38. }
  39. /*------------------------------------------------
  40. uS延时函数,含有输入参数 unsigned char t,无返回值
  41. unsigned char 是定义无符号字符变量,其值的范围是
  42. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  43. 长度如下 T=tx2+5 uS
  44. ------------------------------------------------*/
  45. void DelayUs2x(unsigned char t)
  46. {
  47. while(--t);
  48. }
  49. /*------------------------------------------------
  50. mS延时函数,含有输入参数 unsigned char t,无返回值
  51. unsigned char 是定义无符号字符变量,其值的范围是
  52. 0~255 这里使用晶振12M,精确延时请使用汇编
  53. ------------------------------------------------*/
  54. void DelayMs(unsigned char t)
  55. {
  56. while(t--)
  57. {
  58. //大致延时1mS
  59. DelayUs2x(245);
  60. DelayUs2x(245);
  61. }
  62. }
  63. /*------------------------------------------------
  64. 定时器中断子程序
  65. ------------------------------------------------*/
  66. void Timer0_isr(void) interrupt 1
  67. {
  68. TH0=0xfe; //重新赋值
  69. TL0=frq; //低8位值在主程序中不断累加
  70. SPK=!SPK; //端口电平取反
  71. }

七、音乐播放

程序实例7:

  1. #include<reg52.h> //包含头文件,一般情况不需要改动?
  2. //头文件包含特殊功能寄存器的定义
  3. /*------------------------------------------------
  4. 硬件端口定义
  5. ------------------------------------------------*/
  6. sbit SPK=P1^2; //定义音乐输出端口
  7. unsigned char Timer0_H,Timer0_L,Time;
  8. //世上只有妈妈好数据表
  9. code unsigned char MUSIC[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,
  10. 6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,
  11. 6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,
  12. 5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,
  13. 2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0
  14. };
  15. // 音阶频率表 高八位
  16. code unsigned char FREQH[]={
  17. 0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
  18. 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
  19. 0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
  20. 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
  21. } ;
  22. // 音阶频率表 低八位
  23. code unsigned char FREQL[]={
  24. 0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
  25. 0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
  26. 0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
  27. 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
  28. };
  29. /*------------------------------------------------
  30. uS延时函数,含有输入参数 unsigned char t,无返回值
  31. unsigned char 是定义无符号字符变量,其值的范围是
  32. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  33. 长度如下 T=tx2+5 uS
  34. ------------------------------------------------*/
  35. void DelayUs2x(unsigned char t)
  36. {
  37. while(--t);
  38. }
  39. /*------------------------------------------------
  40. mS延时函数,含有输入参数 unsigned char t,无返回值
  41. unsigned char 是定义无符号字符变量,其值的范围是
  42. 0~255 这里使用晶振12M,精确延时请使用汇编
  43. ------------------------------------------------*/
  44. void DelayMs(unsigned char t)
  45. {
  46. while(t--)
  47. {
  48. //大致延时1mS
  49. DelayUs2x(245);
  50. DelayUs2x(245);
  51. }
  52. }
  53. /*------------------------------------------------
  54. 节拍延时函数
  55. 各调1/4节拍时间:
  56. 调4/4 125ms
  57. 调2/4 250ms
  58. 调3/4 187ms
  59. ------------------------------------------------*/
  60. void delay(unsigned char t)
  61. {
  62. unsigned char i;
  63. for(i=0;i<t;i++)
  64. DelayMs(250);
  65. TR0=0;
  66. }
  67. /*------------------------------------------------
  68. 定时器0中断
  69. ------------------------------------------------*/
  70. void TIM0_ISR() interrupt 1
  71. {
  72. TR0 = 0;
  73. SPK = !SPK;
  74. TH0 = Timer0_H;
  75. TL0 = Timer0_L;
  76. TR0 = 1;
  77. }
  78. /*------------------------------------------------
  79. 歌曲处理函数
  80. ------------------------------------------------*/
  81. void Song()
  82. {
  83. TH0=Timer0_H;//赋值定时器时间,决定频率
  84. TL0=Timer0_L;
  85. TR0=1; //打开定时器
  86. delay(Time); //延时所需要的节拍
  87. }
  88. /*------------------------------------------------
  89. 主函数
  90. ------------------------------------------------*/
  91. void main(void)
  92. {
  93. unsigned char k,i;
  94. TMOD|=0x01; //置定时器0工作方式1
  95. EA=1; //打开全局中断
  96. ET0=1; //打开定时0中断
  97. while(1)
  98. {
  99. i=0;
  100. while(i<100)
  101. { //音乐数组长度 ,唱完从头再来
  102. k=MUSIC[i]+7*MUSIC[i+1]-1;//去音符振荡频率所需数据
  103. Timer0_H=FREQH[k];
  104. Timer0_L=FREQL[k];
  105. Time=MUSIC[i+2]; //节拍时长
  106. i=i+3;
  107. Song();
  108. }
  109. }
  110. }

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

闽ICP备14008679号