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

一、喇叭发声原理

程序实例1:

cpp 复制代码
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit SPK = P1^2;    //定义喇叭端口
/*------------------------------------------------
                  函数声明
------------------------------------------------*/
void DelayUs2x(unsigned char t);//函数声明 
void DelayMs(unsigned char t);
/*------------------------------------------------
                    主函数
------------------------------------------------*/
main()
{
	while(1)
    {     
		DelayMs(1); //发出大约500Hz的方波 频率越大声音越尖
		SPK=!SPK;     
	}
}

/*------------------------------------------------
 uS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
 长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
	while(--t);
}
/*------------------------------------------------
 mS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{    
	while(t--)
	{
		//大致延时1mS
		DelayUs2x(245);
		DelayUs2x(245);
	}
}

二、警车声音

程序实例2:

cpp 复制代码
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit SPK = P1^2;    //定义喇叭端口
unsigned char frq; 

void DelayUs2x(unsigned char t);//函数声明 
void DelayMs(unsigned char t);

/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
	TMOD |= 0x01;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     
	//TH0=0x00;	      //给定初值
	//TL0=0x00;
	EA=1;            //总中断打开
	ET0=1;           //定时器中断打开
	TR0=1;           //定时器开关打开
}

/*------------------------------------------------
                    主函数
------------------------------------------------*/
main()
{
	Init_Timer0(); //初始化定时器
	while(1)
    {  
		DelayMs(1); //延时1ms,累加频率值
		frq++;    
	}
}

/*------------------------------------------------
 uS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
 长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
	while(--t);
}

/*------------------------------------------------
 mS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{    
	while(t--)
	{
		//大致延时1mS
		DelayUs2x(245);
		DelayUs2x(245);
	}
}

/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 
{
	TH0=0xfe;		  //重新赋值 
	TL0=frq;         //低8位值在主程序中不断累加
 
	SPK=!SPK;        //端口电平取反
}

三、救护车声音

程序实例3:

cpp 复制代码
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit SPK = P1^2;    //定义喇叭端口
unsigned char frq; 

void DelayUs2x(unsigned char t);//函数声明 
void DelayMs(unsigned char t);
/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
	TMOD |= 0x01;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     
	//TH0=0x00;	      //给定初值
	//TL0=0x00;
	EA=1;            //总中断打开
	ET0=1;           //定时器中断打开
	TR0=1;           //定时器开关打开
}

/*------------------------------------------------
                    主函数
------------------------------------------------*/
main()
{
	unsigned char i;
	Init_Timer0(); //初始化定时器
	while(1)
    {
		frq=0;
		for(i=0;i<60;i++)//播放1s左右一种频率
		{
			DelayMs(10); 
		}
		frq=100;
		for(i=0;i<60;i++)//播放1s左右另外一种频率
		{  
			DelayMs(10); 
		}
          
	}
}

/*------------------------------------------------
 uS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
 长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
	while(--t);
}

/*------------------------------------------------
 mS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{    
	while(t--)
	{
		//大致延时1mS
		DelayUs2x(245);
		DelayUs2x(245);
	}
}

/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 
{
	TH0=0xfe;		  //重新赋值 
	TL0=frq;         //低8位值在主程序中不断累加
 
	SPK=!SPK;        //端口电平取反
}

四、喇叭滴答声

程序实例4:

cpp 复制代码
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit SPK = P1^2;    //定义喇叭端口
unsigned char frq; 

void DelayUs2x(unsigned char t);//函数声明 
void DelayMs(unsigned char t);

/*------------------------------------------------
                    主函数
------------------------------------------------*/
main()
{
	unsigned int i;

	while(1)
    {
		for(i=0;i<500;i++)
		{
			DelayUs2x(200); 
			DelayUs2x(200); 
			SPK=!SPK;
		}
		for(i=0;i<500;i++)
		{
			DelayMs(1);  
			SPK=!SPK;
		}
          
	}
}

/*------------------------------------------------
 uS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
 长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
	while(--t);
}
/*------------------------------------------------
 mS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{    
	while(t--)
	{
		//大致延时1mS
		DelayUs2x(245);
		DelayUs2x(245);
	}
}

五、报警声音

程序实例5:

cpp 复制代码
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit SPK = P1^2;    //定义喇叭端口
unsigned char frq; 

void DelayUs2x(unsigned char t);//函数声明 
void DelayMs(unsigned char t);

/*------------------------------------------------
                    主函数
------------------------------------------------*/
main()
{
	unsigned int i;

	while(1)
    {
		for(i=0;i<200;i++)
		{
			DelayUs2x(200); 
			SPK=!SPK;
		}
		SPK=0;//防止一直给喇叭通电造成损坏
		for(i=0;i<200;i++)
		{
			DelayMs(1);  
		}       
    }
}

/*------------------------------------------------
 uS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
 长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
	while(--t);
}

/*------------------------------------------------
 mS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{    
	while(t--)
	{
		//大致延时1mS
		DelayUs2x(245);
		DelayUs2x(245);
	}
}

六、消防车警报

程序实例6:

cpp 复制代码
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit SPK = P1^2;    //定义喇叭端口
unsigned char frq; 

void DelayUs2x(unsigned char t);//函数声明 
void DelayMs(unsigned char t);

/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
	TMOD |= 0x01;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     
	//TH0=0x00;	      //给定初值
	//TL0=0x00;
	EA=1;            //总中断打开
	ET0=1;           //定时器中断打开
	TR0=1;           //定时器开关打开
}

/*------------------------------------------------
                    主函数
------------------------------------------------*/
main()
{
	unsigned char i;
	Init_Timer0(); //初始化定时器
	while(1)
    {
		for(i=0;i<200;i++)
		{
			DelayMs(10); //延时10ms,累加频率值
			frq=i;
		}
		for(i=200;i>0;i--)
		{
			DelayMs(10); //延时10ms,累减频率值
			frq=i;
		}
          
	}
}

/*------------------------------------------------
 uS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
 长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
	while(--t);
}
/*------------------------------------------------
 mS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{   
	while(t--)
	{
		//大致延时1mS
		DelayUs2x(245);
		DelayUs2x(245);
	}
}

/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 
{
	TH0=0xfe;		  //重新赋值 
	TL0=frq;         //低8位值在主程序中不断累加
 
	SPK=!SPK;        //端口电平取反
}

七、音乐播放

程序实例7:

cpp 复制代码
#include<reg52.h>        //包含头文件,一般情况不需要改动?
                         //头文件包含特殊功能寄存器的定义
/*------------------------------------------------
                 硬件端口定义
------------------------------------------------*/
sbit      SPK=P1^2;  //定义音乐输出端口

unsigned char Timer0_H,Timer0_L,Time;
                         //世上只有妈妈好数据表
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,
                                      6,2,4,      3,2,2,      5,2,1,    6,2,1, 	  5,2,2, 	3,2,2, 	  1,2,1,
                                      6,1,1,      5,2,1,      3,2,1, 	2,2,4, 	  2,2,3, 	3,2,1,    5,2,2,
                                      5,2,1,      6,2,1,      3,2,2, 	2,2,2,    1,2,4, 	5,2,3, 	  3,2,1,
                                      2,2,1,      1,2,1,      6,1,1, 	1,2,1, 	  5,1,6, 	0,0,0 
                                      };
                         // 音阶频率表 高八位
code unsigned char FREQH[]={
                                0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8, 
                                0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
                                0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
                                0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
                               } ;
                         // 音阶频率表 低八位
code unsigned char FREQL[]={
                                 0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
                                 0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
                                 0xEE,0x44, 0x6B,0xB4,0xF4,0x2D, 
                                 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
                                };
/*------------------------------------------------
 uS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
 长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
	while(--t);
}
/*------------------------------------------------
 mS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{   
	while(t--)
	{
		//大致延时1mS
		DelayUs2x(245);
		DelayUs2x(245);
	}
}

/*------------------------------------------------
                节拍延时函数
 各调1/4节拍时间:
 调4/4  125ms
 调2/4  250ms
 调3/4  187ms
------------------------------------------------*/
void delay(unsigned char t)
{
    unsigned char i;
	for(i=0;i<t;i++)
	    DelayMs(250);
    TR0=0;
}

/*------------------------------------------------
               定时器0中断
------------------------------------------------*/
void TIM0_ISR() interrupt 1
{
	TR0	=	0;      
	SPK	=	!SPK;
	TH0	=	Timer0_H;
	TL0	=	Timer0_L;
	TR0	=	1;
}

/*------------------------------------------------
                歌曲处理函数
------------------------------------------------*/
void Song()
{
	TH0=Timer0_H;//赋值定时器时间,决定频率
	TL0=Timer0_L;
	TR0=1;       //打开定时器
	delay(Time); //延时所需要的节拍                      
}
/*------------------------------------------------
                主函数
------------------------------------------------*/
void main(void)
{
	unsigned char k,i;
	TMOD|=0x01; //置定时器0工作方式1
	EA=1;       //打开全局中断
	ET0=1;      //打开定时0中断
	while(1)
    {
		i=0;  
		while(i<100)
	    {         //音乐数组长度 ,唱完从头再来        
			k=MUSIC[i]+7*MUSIC[i+1]-1;//去音符振荡频率所需数据
			Timer0_H=FREQH[k];
			Timer0_L=FREQL[k];
			Time=MUSIC[i+2]; //节拍时长
			i=i+3;
			Song();
        }
    } 
}
相关推荐
houliabc1 分钟前
C语言个人笔记
c语言·数据结构·笔记·算法
菊风 Juphoon16 分钟前
菊风RTC 2.0 开发者文档正式发布,解锁音视频新体验!
音视频·实时音视频
双叶83633 分钟前
(51单片机)串口通讯(串口通讯教程)(串口接收发送教程)
c语言·开发语言·c++·单片机·嵌入式硬件·microsoft·51单片机
阿巴~阿巴~1 小时前
蓝桥杯 C/C++ 组历届真题合集速刷(一)
c语言·c++·算法·蓝桥杯
knightkkzboy3 小时前
《C语言中的“魔法盒子”:自定义函数的奇妙之旅》
c语言·开发语言·函数
JHC0000003 小时前
ubuntu 下调用系统麦克风,以及faster-whisper-medium 处理音频转写文本
ubuntu·whisper·音视频
Dovis(誓平步青云)4 小时前
【数据结构】排序算法(下篇·终结)·解析数据难点
c语言·数据结构·学习·算法·排序算法·学习方法·推荐算法
六bring个六9 小时前
相机功能特性(QCamera::Feature)详解
音视频·qt6.3
FreakStudio11 小时前
【电子DIY神器】通吃各种5线步进电机!I2C接口控制28BYJ-48五线四相步进电机
stm32·单片机·mcu·嵌入式·arm·技术栈·电子diy
学渣6765613 小时前
【GPIO8个函数解释】
stm32·单片机·嵌入式硬件