長春網(wǎng)絡(luò)營銷外包泰州seo推廣
一、喇叭發(fā)聲原理
程序?qū)嵗?:
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義sbit SPK = P1^2; //定義喇叭端口
/*------------------------------------------------函數(shù)聲明
------------------------------------------------*/
void DelayUs2x(unsigned char t);//函數(shù)聲明
void DelayMs(unsigned char t);
/*------------------------------------------------主函數(shù)
------------------------------------------------*/
main()
{while(1){ DelayMs(1); //發(fā)出大約500Hz的方波 頻率越大聲音越尖SPK=!SPK; }
}/*------------------------------------------------uS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值unsigned char 是定義無符號字符變量,其值的范圍是0~255 這里使用晶振12M,精確延時請使用匯編,大致延時長度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{ while(--t);
}
/*------------------------------------------------mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值unsigned char 是定義無符號字符變量,其值的范圍是0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{ while(t--){//大致延時1mSDelayUs2x(245);DelayUs2x(245);}
}
二、警車聲音
程序?qū)嵗?:
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義sbit SPK = P1^2; //定義喇叭端口
unsigned char frq; void DelayUs2x(unsigned char t);//函數(shù)聲明
void DelayMs(unsigned char t);/*------------------------------------------------定時器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響 //TH0=0x00; //給定初值//TL0=0x00;EA=1; //總中斷打開ET0=1; //定時器中斷打開TR0=1; //定時器開關(guān)打開
}/*------------------------------------------------主函數(shù)
------------------------------------------------*/
main()
{Init_Timer0(); //初始化定時器while(1){ DelayMs(1); //延時1ms,累加頻率值frq++; }
}/*------------------------------------------------uS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值unsigned char 是定義無符號字符變量,其值的范圍是0~255 這里使用晶振12M,精確延時請使用匯編,大致延時長度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{ while(--t);
}/*------------------------------------------------mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值unsigned char 是定義無符號字符變量,其值的范圍是0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{ while(t--){//大致延時1mSDelayUs2x(245);DelayUs2x(245);}
}/*------------------------------------------------定時器中斷子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{TH0=0xfe; //重新賦值 TL0=frq; //低8位值在主程序中不斷累加SPK=!SPK; //端口電平取反
}
三、救護(hù)車聲音
程序?qū)嵗?:
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義sbit SPK = P1^2; //定義喇叭端口
unsigned char frq; void DelayUs2x(unsigned char t);//函數(shù)聲明
void DelayMs(unsigned char t);
/*------------------------------------------------定時器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響 //TH0=0x00; //給定初值//TL0=0x00;EA=1; //總中斷打開ET0=1; //定時器中斷打開TR0=1; //定時器開關(guān)打開
}/*------------------------------------------------主函數(shù)
------------------------------------------------*/
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延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值unsigned char 是定義無符號字符變量,其值的范圍是0~255 這里使用晶振12M,精確延時請使用匯編,大致延時長度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{ while(--t);
}/*------------------------------------------------mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值unsigned char 是定義無符號字符變量,其值的范圍是0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{ while(t--){//大致延時1mSDelayUs2x(245);DelayUs2x(245);}
}/*------------------------------------------------定時器中斷子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{TH0=0xfe; //重新賦值 TL0=frq; //低8位值在主程序中不斷累加SPK=!SPK; //端口電平取反
}
四、喇叭滴答聲
程序?qū)嵗?:
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義sbit SPK = P1^2; //定義喇叭端口
unsigned char frq; void DelayUs2x(unsigned char t);//函數(shù)聲明
void DelayMs(unsigned char t);/*------------------------------------------------主函數(shù)
------------------------------------------------*/
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延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值unsigned char 是定義無符號字符變量,其值的范圍是0~255 這里使用晶振12M,精確延時請使用匯編,大致延時長度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{ while(--t);
}
/*------------------------------------------------mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值unsigned char 是定義無符號字符變量,其值的范圍是0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{ while(t--){//大致延時1mSDelayUs2x(245);DelayUs2x(245);}
}
五、報警聲音
程序?qū)嵗?:
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義sbit SPK = P1^2; //定義喇叭端口
unsigned char frq; void DelayUs2x(unsigned char t);//函數(shù)聲明
void DelayMs(unsigned char t);/*------------------------------------------------主函數(shù)
------------------------------------------------*/
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延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值unsigned char 是定義無符號字符變量,其值的范圍是0~255 這里使用晶振12M,精確延時請使用匯編,大致延時長度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{ while(--t);
}/*------------------------------------------------mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值unsigned char 是定義無符號字符變量,其值的范圍是0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{ while(t--){//大致延時1mSDelayUs2x(245);DelayUs2x(245);}
}
六、消防車警報
程序?qū)嵗?:
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義sbit SPK = P1^2; //定義喇叭端口
unsigned char frq; void DelayUs2x(unsigned char t);//函數(shù)聲明
void DelayMs(unsigned char t);/*------------------------------------------------定時器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響 //TH0=0x00; //給定初值//TL0=0x00;EA=1; //總中斷打開ET0=1; //定時器中斷打開TR0=1; //定時器開關(guān)打開
}/*------------------------------------------------主函數(shù)
------------------------------------------------*/
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延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值unsigned char 是定義無符號字符變量,其值的范圍是0~255 這里使用晶振12M,精確延時請使用匯編,大致延時長度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{ while(--t);
}
/*------------------------------------------------mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值unsigned char 是定義無符號字符變量,其值的范圍是0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{ while(t--){//大致延時1mSDelayUs2x(245);DelayUs2x(245);}
}/*------------------------------------------------定時器中斷子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{TH0=0xfe; //重新賦值 TL0=frq; //低8位值在主程序中不斷累加SPK=!SPK; //端口電平取反
}
七、音樂播放
程序?qū)嵗?:
#include<reg52.h> //包含頭文件,一般情況不需要改動?//頭文件包含特殊功能寄存器的定義
/*------------------------------------------------硬件端口定義
------------------------------------------------*/
sbit SPK=P1^2; //定義音樂輸出端口unsigned char Timer0_H,Timer0_L,Time;//世上只有媽媽好數(shù)據(jù)表
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,i0xFC,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,i0xEE,0x44, 0x6B,0xB4,0xF4,0x2D, 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,};
/*------------------------------------------------uS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值unsigned char 是定義無符號字符變量,其值的范圍是0~255 這里使用晶振12M,精確延時請使用匯編,大致延時長度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{ while(--t);
}
/*------------------------------------------------mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值unsigned char 是定義無符號字符變量,其值的范圍是0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{ while(t--){//大致延時1mSDelayUs2x(245);DelayUs2x(245);}
}/*------------------------------------------------節(jié)拍延時函數(shù)各調(diào)1/4節(jié)拍時間:調(diào)4/4 125ms調(diào)2/4 250ms調(diào)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;
}/*------------------------------------------------歌曲處理函數(shù)
------------------------------------------------*/
void Song()
{TH0=Timer0_H;//賦值定時器時間,決定頻率TL0=Timer0_L;TR0=1; //打開定時器delay(Time); //延時所需要的節(jié)拍
}
/*------------------------------------------------主函數(shù)
------------------------------------------------*/
void main(void)
{unsigned char k,i;TMOD|=0x01; //置定時器0工作方式1EA=1; //打開全局中斷ET0=1; //打開定時0中斷while(1){i=0; while(i<100){ //音樂數(shù)組長度 ,唱完從頭再來 k=MUSIC[i]+7*MUSIC[i+1]-1;//去音符振蕩頻率所需數(shù)據(jù)Timer0_H=FREQH[k];Timer0_L=FREQL[k];Time=MUSIC[i+2]; //節(jié)拍時長i=i+3;Song();}}
}