基于51单片机的无线遥控门铃仿真程序原理图设计

硬件设计

链接:https://pan.baidu.com/s/1emnHoMjtyDn0Y5GKofWDeA
提取码:8lqo

原理图: 包含了发射和接收部分
在这里插入图片描述
仿真图:发射部分用按键模拟
在这里插入图片描述

程序设计

//
//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;
 }

.

文件仅供参考:

.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值