单片机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();
        }
    } 
}
相关推荐
极客小张6 分钟前
基于STM32MP157与OpenCV的嵌入式Linux人脸识别系统开发设计流程
linux·stm32·单片机·opencv·物联网
浅陌pa1 小时前
24:RTC实时时钟
c语言·stm32·单片机·嵌入式硬件
敲上瘾1 小时前
多态的使用和原理(c++详解)
开发语言·数据结构·c++·单片机·aigc·多态·模拟
小熊在忙fpga1 小时前
STM32如何修改外部晶振频率和主频
stm32·单片机·嵌入式硬件
Reese_Cool2 小时前
【二级C语言考试】自定义数据类型
c语言·开发语言
我命由我123452 小时前
GPIO 理解(基本功能、模拟案例)
linux·运维·服务器·c语言·c++·嵌入式硬件·c#
学习日记hhh2 小时前
STM32G431RBT6(蓝桥杯)串口(发送)
stm32·单片机·嵌入式硬件
老李的森林2 小时前
嵌入式开发--STM32延时函数重构
stm32·单片机·嵌入式硬件·重构·延时
只对您心动4 小时前
【C高级】有关shell脚本的一些练习
linux·c语言·shell·脚本
学习前端的小z6 小时前
【AI视频】Runway:Gen-2 图文生视频与运动模式详解
人工智能·aigc·音视频