56 基于51单片机无线门铃控制系统设计【毕设课设】

硬件构成:单片机+最小系统+放音模块+无线模块+按键模块

本设计基于STC89C51/52单片机

1.采用三极管驱动放音喇叭;

2.采用315M无线模块实现无线的连接,实际应用中更易安装,是家居首选;

3.内置5首音乐,按一下门铃键,就会播放第一首音乐,再按一下就会播放下一曲。

 

 

 

//
//51单片机无线遥控门铃程序
//
#include<REG51.H>
#define sound_amount 5 //歌曲的数量
sbit pause=P2^5;       //播放\暂停
sbit speaker=P2^7;     //无源蜂鸣器
//
unsigned char timer0h,timer0l,time;//timer0h,timer0l为定时器T0的高低位初值,time为对应的节拍时间
unsigned char music_num,num;       //music_num为歌曲编号,music_num=0表示刚开机时的状态,num是查找歌曲数据表的地址
signed char fre;                   //对应频率数据表的地址
bit play_enable;                   //歌曲播放的使能标志位,用于播放\暂停
void delay(unsigned char t);	   //延时子函数,控制发音的时间长度
void delayms(unsigned int t);	   //普通延时子程序,可用于按键消抖
void song(void);		           //演奏一个音符
void music_play(void);	           //播放歌曲
//
//每三个数字,代表一个音符
//第一个数字是音符的数值1234567之一(第几个音),代表哆来咪发...
//第二个数字是0123之一,代表低音\中音\高音\超高音(第几个八度)
//第三个数字是时间长度,以半拍为单位,乐曲数据表的结尾是三个0
//
//《祝你生日快乐》
unsigned char code song1[]={
     5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,
     5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,
     5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2,
     4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4, 0,0,0};

//《世上只有妈妈好》
unsigned char code song2[]={
     6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1,
	 //6,2,3代表6,中音,3个半拍;
	 //5,2,1代表5,中音,1个半拍;
	 //3,2,2代表3,中音,2个半拍;
	 //5,2,2代表5,中音,2个半拍;
	 //1,3,2代表1,高音,2个半拍;
	 //...
     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};

//《当你孤单你会想起谁》
unsigned char code song3[]={
     3,2,2, 3,2,1, 4,2,1, 3,2,2, 2,2,1, 1,2,1,  2,2,2, 5,2,2, 2,2,2, 2,2,3,
	 1,2,2, 1,2,1, 2,2,1, 1,2,2, 7,1,1, 6,1,1, 7,1,2, 3,2,2, 7,1,2, 7,1,3, 
	 6,1,2, 2,2,1, 3,2,1, 2,2,1, 1,2,1, 6,1,2, 5,1,2, 2,2,1, 3,2,1, 2,2,1, 
	 1,2,1, 6,1,2, 6,1,2, 2,2,1, 3,2,1, 2,2,1, 1,2,1, 6,1,1, 7,1,1, 1,2,6, 0,0,0 };

//《乡间小路》
unsigned char code song4[]={
     3,1,2, 3,1,1, 3,1,1, 6,0,1, 6,0,1, 1,1,2,
     6,0,1, 5,0,1, 6,0,4, 6,0,2, 6,0,1 ,6,0,1, 6,0,2, 6,0,1, 1,1,1, 
     2,1,2, 2,1,1, 3,1,1, 2,1,4, 3,1,1, 3,1,1, 3,1,1, 2,1,1, 4,1,2,
     4,1,2, 3,1,2, 2,1,1, 1,1,1, 2,1,4, 7,0,1, 7,0,1, 7,0,1, 6,0,1, 
     5,0,1, 5,0,1, 6,0,1, 7,0,1, 7,0,1, 6,0,1, 5,0,1, 6,0,4, 6,1,2,
     3,1,1, 6,1,1, 7,1,1, 6,1,1, 5,1,1, 5,1,2, 5,1,1, 2,1,1, 5,1,1, 
     6,1,1, 5,1,1, 4,1,1, 4,1,2, 4,1,1, 3,1,1, 2,1,2, 1,1,1, 2,1,1, 
     3,1,1, 2,1,1, 1,1,1, 2,1,1, 3,1,4, 6,1,2, 3,1,1, 6,1,1, 7,1,1, 
	 6,1,1, 5,1,1, 5,1,2, 2,1,1, 5,1,1, 6,1,1, 5,1,1, 4,1,1, 0,0,0};     

//《送别》
unsigned char code song5[]={
     5,1,2, 3,1,3, 5,1,1, 1,2,3, 6,1,2, 1,2,2, 
     5,1,4, 5,1,2, 1,1,1, 2,1,1, 3,1,2, 2,1,1, 1,1,1, 2,1,4, 5,1,2, 
	 3,1,1, 5,1,1, 1,2,2, 7,1,1, 6,1,2, 1,2,2, 5,1,4, 5,1,2, 2,1,1, 
	 3,1,1, 4,1,2, 7,0,1, 1,1,4, 6,1,2, 1,2,2, 1,2,4, 7,1,2, 6,1,1,
	 7,1,1, 1,2,4, 6,1,1, 7,1,1, 1,2,1, 6,1,1, 6,1,1, 5,1,1, 3,1,1, 
	 1,1,1, 2,1,8, 5,1,2, 3,1,1, 5,1,1, 1,2,2, 7,1,1, 6,1,2, 1,2,2, 
	 5,1,4, 5,1,2, 2,1,1, 3,1,1, 4,1,2, 7,0,2, 1,1,4, 0,0,0};


// 频率-半周期数据表 高八位  共保存了四个八度的28个频率数据
unsigned char code FREQH[]={
    0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8,    //低音1234567
    0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i
    0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE,            //高音 234567
    0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF};   //超高音 1234567

// 频率-半周期数据表 低八位
unsigned char code FREQL[]={
    0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6,    //低音1234567
    0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i
    0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D,             //高音 234567
    0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16};   //超高音 1234567  

void main(void)
{
	TMOD=0x11; //T0 T1 均在工作方式1
	ET0=1;  //T0开中断
	EA=1;   //CPU开中断	 
	while(1)
	{
		music_play();	//根据当前状态播放相应歌曲的某个音符

		if(!pause)		//暂停键处理
		{
		delayms(5);
		if(!pause)
		{
			if(music_num==0)    //music_num=0只有在刚开机,且未按下暂停键时存在,表示刚开机时的状态,按下后从第一首开始播放
			{
				music_num=1;    //歌曲序号置1
				num=0;	        //从头播放
				play_enable=1;	//允许播放
			}
			else
			{
				play_enable=~play_enable;
			    speaker=1;
			}
			while(!pause)	 //若按着暂停键不放手时的处理
			{
			if(play_enable==0){}	        //如果是暂停,则显示时间不变//(暂停时play_enable==0)
			}

		  }//暂停键处理结束
	}//while结束
	}
} 

void delayms(unsigned int t)	   //MS延时子程序
{
	unsigned int i,j;
	for(i=0;i<t;i++)
	{
		for(j=0;j<123;j++)
			;
	}
}

void delay(unsigned char t)	    //延时子函数,控制发音的时间长度,每个节拍0.4S
{
	unsigned char t1;
	unsigned long t2;
	for(t1=0;t1<t;t1++)	       //嵌套循环, 共延时t个半拍
	{
    	for(t2=0;t2<8000;t2++) //延时期间, 可进入T0中断去发音
        {
        	;
        }
	}
	TR0=0;		               //关闭T0, 停止发音
}

void timer0(void) interrupt 1  //T0中断程序,控制发音的音调
{
	speaker=!speaker;//输出方波, 发音
	TH0=timer0h;	 //下次的中断时间,这个时间控制音调高低
	TL0=timer0l;
 }

void song(void)  	//演奏一个音符
{
	TH0=timer0h;    //控制音调
	TL0=timer0l;
	TR0=1;		    //启动T0, 由T0输出方波发音
	delay(time);    //每个音符的演奏时间
}

void music_play(void)//播放相应歌曲的某个音符
{
	if((music_num==1)&&(play_enable==1))
	{
		fre=song1[num]+7*song1[num+1]-1;//第i个是音符,第i+1个是第几个八度
		timer0h=FREQH[fre];	            //从数据表中读出频率数值,实际上是定时的时间长度
    	timer0l=FREQL[fre];
    	time=song1[num+2];              //读出时间长度数值
    	num+=3;
		if(fre==-1)		//判断歌曲的结束位,结束后转到下一首
		{
			num=0;	    //下一首从头播放
			music_num=2;
			play_enable=0;
    	}
		song();	        //发出一个音符
	}

	if((music_num==2)&&(play_enable==1))
	{  
		fre=song2[num]+7*song2[num+1]-1;
		timer0h=FREQH[fre];
    	timer0l=FREQL[fre];
    	time=song2[num+2];
    	num+=3;
		if(fre==-1)
		{
			num=0;
			music_num=3;
			play_enable=0;
    	}
		song();		
	}

		if((music_num==3)&&(play_enable==1))
	{  
		fre=song3[num]+7*song3[num+1]-1;
		timer0h=FREQH[fre];
    	timer0l=FREQL[fre];
    	time=song3[num+2];
    	num+=3;
		if(fre==-1)
		{
			num=0;
			music_num=4;
			play_enable=0;
    	}
		song();		
	}

	if((music_num==4)&&(play_enable==1))
	{
		fre=song4[num]+7*song4[num+1]-1;
		timer0h=FREQH[fre];
    	timer0l=FREQL[fre];
    	time=song4[num+2];
    	num+=3;
		if(fre==-1)
		{
			num=0;
			music_num=5;
			play_enable=0;
    	}
		song();		
	}

	if((music_num==5)&&(play_enable==1))
	{
		fre=song5[num]+7*song5[num+1]-1;
		timer0h=FREQH[fre];
    	timer0l=FREQL[fre];
    	time=song5[num+2];
    	num+=3;
		if(fre==-1)
		{
			num=0;
			music_num=1;
			play_enable=0;
    	}
		song();		
	}

}
//程序结束


资料下载地址

https://pan.baidu.com/s/1bNR5A012cEmgd8DOPobUJg?pwd=8888

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值