详细解读一下这个音乐门铃程序, #include <reg51.h> #include <intrins.h> sbit Beep = P1^5 ;

详细解读一下这个音乐门铃程序, #include <reg51.h> #include <intrins.h> sbit Beep = P1^5 ;,第1张

初次看到该代含首雀码,就一种感觉:很多地方比较冗余,比如像

if(key1==0) //判断是否有键按下芹尺

{

if(key1==0)

if(key1==0)

{

if(key1==0)

{

等等,这些语句都是重复,如果想加上一个延时防抖,就应该加上相应的延时,最好封装成函数。这样可读性比较高,另一个不容易出错。

该程序的主要思路是采用定时器0作为频率发生器,读入music_tab[]中的频率代码,用蜂鸣器产生不同的谈早频率,用两个按钮控制播放。

#include<reg52.h> //包含52单片机寄存器定义的头文件

sbit sound=P3^7 //将sound位定义为P3.7

unsigned int C//储存定时器的定时常数

//以下是C调中音的音频宏定义

#define dao 523 //将"dao"宏定义为中音"1"的频率523Hz

#define re 587 //将"re"宏定义为中音"2"的频率587Hz

#define mi 659 //将"mi"宏定义为中音"3"的频率659Hz

#define fa 698 //将"fa"宏定义为燃磨中音"4"的频率698Hz

#define sao 784 //将"sao"宏定义为中音"5"的频率784Hz

#define la 880 //将"la"宏定义为中音"6"的频率880Hz

#define xi 987 //将"xi"宏定义为中音"7"的频率523Hz

/*******************************************

函数功局段隐能:1个延时单位,延时200ms

******************************************/

void delay()

{

unsigned char i,j

for(i=0i<250i++)

for(j=0j<250j++)

}

/*******************************************

函数功能:主函数

******************************************/

void main(void)

{

unsigned char i,j

//以下是《两只老虎》歌曲

unsigned int code f[]={dao,re,mi,dao, //每行对应一小节音符

dao,re,mi,dao,

mi,fa,sao,

mi,fa,sao,

sao,la,sao,fa,mi,dao,

sao,la,sao,fa,mi,dao,

dao,sao,dao,

dao,sao,dao,

0xff}//以0xff作为音符的结束标志

//以下是简谱中每个音符的节拍

//"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位

unsigned char code JP[ ]={2,2,2,2,

2,2,2,2,

2,2,3,

2,2,3,

1,2,2,1,2,2,

1,2,2,1,2,2,

2,2,2,

2,2,2,

}

EA=1//开总中断

ET0=1 //定时器T0中断允许

TMOD=0x00 // 使用定时器T0的模式1(13位计数器)

while(1) //无限循环

{

i=0 //从第1个音符f[0]开始播放

while(f[i]!=0xff)//只要没有读到结束标志就继续播放

{

C=460830/f[i]

TH0=(8192-C)/32 //可证明这是13位计数器TH0高8位的赋初值方法

TL0=(8192-C)%32 //可证明这是13位计数器TL0低5位的赋初值方法

TR0=1//启动定时器T0

for(j=0j<JP[i]j++) //控制节拍数桐厅

delay() //延时1个节拍单位

TR0=0 //关闭定时器T0

i++//播放下一个音符

}

}

}

/***********************************************************

函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频的方波

************************************************************/

void Time0(void ) interrupt 1 using 1

{

sound=!sound //将P3.7引脚输出电平取反,形成方波

TH0=(8192-C)/32 //可证明这是13位计数器TH0高8位的赋初值方法

TL0=(8192-C)%32 //可证明这是13位计数器TL0低5位的赋初值方法

}

51资源还不够啊?汗!用51都能实现GSM远程防盗报警器 这么个门铃就不行了啊

再说了 这个电路提供了功放和录放音电路 单片机需要做的很少 但是我不知道楼主用的是什么样的录放电路 所以我没办法提供程序 不过我可以详细化工作流程

按一次 门铃之后 单片机会延时10秒 十秒之后无人应答 说燃码察明家里模搜无人 那么这时候单片机会通过指示灯告知来人可以留言 然后根据录放电路的存储容量进行时间的管理。在录音时间快完毕的时候点亮指示灯 提示录音时间快完毕 避免漏掉信息 然后在录音时间到后自动关闭录音电路 并提示 来人可以离开了 主人来的是后可以按按键进行录音的播放,并且会显示录音的时间 根据录音电路的容量可以设置皮茄 3段录音 5段录音等 当然随着段数的增加,单片机的编程会变得复杂,但是其工作原理同一段式录音控制程序是一样的


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12427533.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存