单片机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();
        }
    } 
}
相关推荐
A-code1 小时前
C/C++ 中 void* 深度解析:从概念到实战
c语言·开发语言·c++·经验分享·嵌入式
技术砖家--Felix3 小时前
Spring Boot入门篇:快速搭建你的第一个Spring Boot应用
java·开发语言·音视频
编程之路,妙趣横生5 小时前
详解C语言操作符
c语言
Fuchsia5 小时前
Linux软件编程笔记五——进程Ⅰ
linux·c语言·笔记·操作系统·进程
fxshy5 小时前
python使用ffmpeg对视频进行转码
python·ffmpeg·音视频
林一百二十八5 小时前
在Ubuntu上学习C语言(一)
c语言·学习·ubuntu
郭子涵本人5 小时前
51单片机(markdown格式阅读)
单片机·嵌入式硬件·51单片机
格里姆肖6 小时前
小米铁蛋电机1代驱动开发
单片机·嵌入式硬件
ZIM学编程6 小时前
「学长有话说」作为一个大三学长,我想对大一计算机专业学生说这些!
java·c语言·数据结构·c++·python·学习·php
hazy1k6 小时前
51单片机基础-LCD1602液晶显示
stm32·单片机·嵌入式硬件·51单片机·1024程序员节