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


    一、喇叭发声原理

    程序实例1:

    1. #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
    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 //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
    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 //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
    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 //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
    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 //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
    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 //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
    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 //包含头文件,一般情况不需要改动?
    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
    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. }

  • 相关阅读:
    极智开发 | CUDA Compiler NVCC编译流程
    用HTML和CSS打造跨年烟花秀视觉盛宴
    flink增量检查点启动恢复的时间是很久的,业务上不能接受,怎么处理
    爬虫逆向实战(29)-某蜂窝详情页(cookie、混淆、MD5、SHA)
    datepicker设置中文
    Redis学习(九)SpringBoot实现(Pub/Sub)发布订阅
    postfix+dovecot+SSL 搭建邮件服务器
    数据结构与算法-树
    想做动态规划入门微课视频 思路是什么该如何实现
    Linux-Shell整理集合
  • 原文地址:https://blog.csdn.net/m0_49968063/article/details/132794258