基于51单片机--简易门铃打铃

C51单片机按键控制流水灯模式(定时器版本)以及定时器时钟 由前面我们讲过的定时器0的配置,我们给计数寄存器赋的初值是64535,每次溢出只需要1ms,所以每隔1ms,程序便会进入一次中断,这时如果我们想配置一个每隔0.5秒发生一次的程序,我们只需要进入500次中断即可,因此,我们定义了一个局部变量static unsigned int count(加static的原因是,count是一个局部变量,每次离开中断就会被销毁,下次进来时初值还是0,因此,static防止了count被销毁,保留了其初值,这也为后面累计500次中断做铺垫)。这便是定时器时钟的原理。 阅读详情

+本文为博主 LED-执棋困局,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步!
> 发布人:LED-执棋困局
> 欢迎你为独创博主LED-执棋困局点赞❤❤❤+关注👍+收藏🌹+评论☺。

系列专栏:优快云-单片机学习系列🎁
> 我的格言是:“尽最大努力,做最好的自己!💪
版权声明:本文为优快云博主「

LCD-执棋困局」的原创文章,优快云独一份。

如需转载,还请通知一声噢⚠!

目录

一、频率计简介

1.1门铃打铃概述

1.2门铃打铃组成

1.3叮咚发声原理

1.4定时设置

二、仿真硬件设计

2.1声音硬件电路设计

2.1.1理论阐述

2.1.2电路模块

2.2按键硬件设计

2.3仿真图展现

三、软件程序设计

3.1总体软件设计思路

3.2主程序程序设计

3.3定时器初始化程序设计

3.4中断程序设计

3.5按键程序设计

3.6延时模块

四、波形仿真测量

4.1示波器调用

4.2示波器用法

五、结果与扩展

5.1结果展现

5.2扩展功能

六、总结

一、频率计简介

1.1门铃打铃概述

设计要求:

1.通过按键控制门铃启动停止,按下第一个按键能启动和停止门铃打铃。

2.门铃打铃声音为叮咚叮咚。

3.每次发咚或每次发叮,持续时间为500ms。

4.发出叮咚时,可以用示波器检测到正确的波形。

1.2门铃打铃组成

以at89c51单片机为核心,内部使用定时器,一次定时250us,外接按键模块、蜂鸣器模块和示波器,按键模块负责控制蜂鸣器是否发声,蜂鸣器模块则负责发出叮咚叮咚。

1.3叮咚发声原理

我们应该知道,声音是一种信号,可用波形描述出来,不同声音其波形不同(频率/周期/振幅等不同),所以只有满足相应的波形,就能发出对应的声音。

下图为咚的波形图。通过网上资料查找,咚的频率大概为700hz,根据T=1/f得周期T=1428.6us,因为一个周期高低电平各占一半,电平反转时间为T/2=714.3us。

d3f1d1c983a048d59daa1a46afdd5721.png

叮的频率大概在500hz,根据T=1/f得周期T=2000us,因为一个周期高低电平各占一半,电平反转时间为T/2=1000us。

b3b9ccb754354a00ab42ad0385815379.png

1.4定时设置

at89c51单片机内部自带定时器,我们定时250us中断一次,对于咚声音来说,每714.3us电平反转一次,所以需要每中断3次让电平反转一次。对于叮声音来说,每1000us电平反转一次,所以需要每中断4次让电平反转一次。

494d9ca67aef4546955d06b125a10d97.png

二、仿真硬件设计

2.1声音硬件电路设计

2.1.1理论阐述

蜂鸣器广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。按照驱动方式的不同,分为有源蜂鸣器和无源蜂鸣器。这里的有源和无源不是指电源,而是振荡源。无源蜂鸣器要加500hz-4.5khz的脉冲频率信号驱动,有源蜂鸣器自带震荡源,加电就能响。
按构造方式的不同,可分为:电磁式蜂鸣器和压电式蜂鸣器;按封装的不同,可分为:DIP BUZZER(插针蜂鸣器)和SMDBUZZER(贴片式蜂鸣器);按电流的不同,可分为:直流蜂鸣器和交流蜂鸣器。

三极管导通:Ve-0.7>Vc 

饱和条件:电流Ib>Iec/β

Iec=(5-0.2-2)/1K=3mA,已知β=100,则Iec/β=30uA,饱和条件为电流Ib>30uA,

所以R47max=(5-0.7)/30=143K

89C52的IO口输入电流最大理论值是25mA,推荐不要超过6mA,图中取的是经验值。

buzz端高电平时,三极管无法导通,反之可以导通。当能导通时,电流流经蜂鸣器,使其发生声响。

2.1.2电路模块

626aa25cab62456f8e8b67580af3bd3c.png

2.2按键硬件设计

ac79c2673b8b48d6a056a7df55ece0b3.png

2.3仿真图展现

69fd3967b17443159b4beed6846f9d10.png

三、软件程序设计

3.1总体软件设计思路

定时器定时T0,定时250us中断一次,可以定义两个累加变量判断中断次数,达到一定次数就执行电平反转,同时考虑到有叮咚两种声音,可以定义一个标志位来判断发咚还是叮,此外,引用按键模块,书写按键服务函数,通过返回值判断按键是否按下,用TR0来控制蜂鸣器是否发出声音。

3.2主程序程序设计

定义uc500hz、uc700hz用于控制中断次数。

定义cnd用于控制发出叮/咚声音的总时间。

定义flag用于控制蜂鸣器发咚还是发叮。

#include <reg51.h>
#include "key.h"

void Timer0_Init();
void key_service();

unsigned int uc500Hz=0;
unsigned int uc700Hz=0;
unsigned int cnd=0;
unsigned int flag=0;

sbit button=P3^7;

void main()
{
	Timer0_Init();
	while(1)
	{
		key_service();
	}
}

3.3定时器初始化程序设计

void Timer0_Init(void)		//250微秒@12.000MHz
{
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0x06;				//设置定时初始值
	TH0 = 0xFF;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	ET0=1;
	EA=1;
}

3.4中断程序设计

定时一次250us,即250us中断一次,一种声音要持续时间为500ms=500000us,中断次数为500000us/250us=2000,所以cnd要累加到2000,flag取反。flag=0时,蜂鸣器发咚;flag≠0时,蜂鸣器发叮。当满足uc700hz=3时,说明中断了3次(750ms),发咚;当满足uc500hz=4时,说明中断了4次(1000ms),发叮;

void ISR_timers() interrupt 1
{
	cnd++;
	if(cnd>=2000) //先咚发声时间为500ms,然后叮发声时间为500ms,
                  //接着又轮到咚,过后又是叮,不断交替发声,一次500ms
	{
		flag=~flag; //flag用来判断声音发叮还是咚
		cnd=0;
	}
	if(!flag) //咚
	{
		uc700Hz++;
		if(uc700Hz>=3) //3次,咚
		{
			uc700Hz=0;
			button=~button;//电平反转
		}
	}
	if(flag) //钉
	{
		uc500Hz++;
		if(uc500Hz>=4) //4次,叮
		{
			uc500Hz=0;
			button=~button;//电平反转
		}
	}
	TL0 = 0x06;				//设置定时初始值
	TH0 = 0xFF;				//设置定时初始值
}

3.5按键程序设计

引用key_scan.h按键模块,通过控制TR0,来实现对蜂鸣器是否发声的功能。

void key_service()
{
	switch(key())
	{
		case 3:TR0=~TR0;break;
		default:break;
	}	
}

#include "key_scan.h"//独立键盘头文件
#include "delay.h"//延时头文件

/******************************************************************************************
函数名:key
功能:  独立键盘函数
参数:  无
返回值:unsigned char
******************************************************************************************/
unsigned char key_scan()//独立键盘按键函数
{
	unsigned char temp,temp2;
	static unsigned char keynum=20;
	KEYPIO=0xf0;//1为输入 0位输出 令高4位为1 低4位为0
	temp=KEYPIO;
	if(temp!=0xf0)//判断是否按下按键
	{
		delay(10);//消抖延时10ms
		if(temp!=0xf0)//再次判断是否按下按键
		{
			temp=KEYPIO&0xf0;//确定行
			KEYPIO=0x0f;//反转
			temp2=KEYPIO&0x0f;//确定列
		}
	}
	switch(temp+temp2)
	{
		case 0xee:keynum=1;break;
		case 0xed:keynum=2;break;
		case 0xeb:keynum=3;break;
		case 0xe7:keynum=4;break;
		case 0xde:keynum=5;break;
		case 0xdd:keynum=6;break;
		case 0xdb:keynum=7;break;
		case 0xd7:keynum=8;break;
		case 0xbe:keynum=9;break;
		case 0xbd:keynum=0;break;
		case 0xbb:keynum=10;break;
		case 0xb7:keynum=11;break;
		case 0x7e:keynum=12;break;
		case 0x7d:keynum=13;break;
		case 0x7b:keynum=14;break;
		case 0x77:keynum=15;break;
		default:break;
	}
	return keynum;
}

这是头文件key_scan.h,需要对key_scan()声明,对P3宏定义。

#ifndef __KEY_SCAN_H__
#define __KEY_SCAN_H__

#include <reg51.h>//51头文件

#define KEYPIO P3 //矩阵键盘两端所接的IO口

unsigned char key_scan();//独立键盘函数声明

#endif

3.6延时模块

delay.c

#include "delay.h"
/******************************************************************************************
函数名:delay
功能:延时函数
参数:unsigned char xms
返回值:无
******************************************************************************************/
void delay(unsigned char xms)
{
	unsigned char i,j;
	for(i=xms;i>0;i--)
	  for(j=124;j>0;j--);
}

delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

void delay(unsigned char xms);//延时函数声明

#endif

四、波形仿真测量

4.1示波器调用

以下是调用示波器的步骤。

e2746cb810d84d7ca395650c5e552037.png

a7216fd41fac46ca96cb579c000f4113.png

49c3ae0a66dc4fac8007f9cbd0cc519a.png

4.2示波器用法

示波器最多同时测4个波形。①:通过调电压大小使波形振幅发生变化。②:波形整体上下移动。③:波形整体左右移动。④:调节波形宽度,但频率不会发生改变。

94a034b2d9c04c6294b72d7fc57842bf.png

五、结果与扩展

5.1结果展现

结果:完成设计要求,按键灵敏度高,蜂鸣器能发出叮咚声,无噪音,波形正确。

0280efd06c884ae881b1ff403c253e2f.png

示波器用的是黄色A接口,第一个图是咚的波形图,第二个是叮的波形图。

8dfb30a52c3e4c6fb824d643b695db2a.png

bf048be1e6554db2beb4adb9a5b7581a.png

5.2扩展功能

本次实战,主要是手动的门铃打铃,读者可以制作智能门铃打铃,采用红外线,当有人时,红外线会扫描到,从而发出叮咚声;没人时,不会发出声音。这个跟现实生活中有人来店里,机器会发出欢迎光临声音功能是相似的。

六、总结

本次介绍了门铃打铃的基本理论知识,学习计算周期T、每种声音中断次数,同时提供模块代码和仿真图,帮助大家理解相关编码思路。

hi!我是博主LED-执棋困局🔥,喜欢或期待更好作品的,可以关注一下我🙏🙏🙏,带你们一起进步,另外欢迎大家的点评😊!!!

下一文:制作pwn波形模块,下集更精彩。

C51定时器实现蜂鸣器叮咚敲门声Proteus仿真 源自b站UP主金善愚 51单片机实现按键启动蜂鸣器发出叮咚声音,500ms转变一次 阅读详情

相关推荐

基于51单片机电子打铃器设计

随着和社会的发展和信息化的进步,单片机的普及应用,越来越多的系统需要嵌入单片机设计,作为一个智能化设备而存在。对于传统校园的打铃系统,我们发现可以通过这个单片机系统实现自动打铃,不需要认为的干预,减少人力和节省人力成本。随着信息化校园的发展这个必将在校园中得到广泛的应用。所以本课题就研究这个系统的实现及其验证是不是可以实现这些基本的功能。这样来看,这个系统的应用是比较广泛的,与我们的生活也是很密切的。 这个系统采用的是C51内核单片机STC89C52作为主控芯片,显示屏采用的是LCD1602,字符显示多,小巧稳定,低功耗,通过设定几组打铃时间通过蜂鸣器来播放。系统经过使用验证基本满足系统功能和性能设计。

【C51】基于51单片机无线遥控门铃电路的设计与实现

本设计以AT89C51单片机作为主控芯片,把编码器的编码功能、时钟芯片的实时计时功能、LCD显示功能、无线传输电路传输功能等,利用单片机有效结合完成本次设计。无线遥控音乐门铃的功能有:实时显示时间、查看来访时间、语音留言、自动转换音乐。因为音乐的呈现是通过写入单片机的程序进行控制,所以可自行修改初始音乐。同时本设计还具有电路可靠简单、抗干扰能力强、功耗低等优点。

3254968421的博客 6158

单片机程序设计的门铃

单片机程序设计的门铃 主要用c51编写,利用定时器中断控制

51单片机实现按键提示音

简单介绍了让无源蜂鸣器固定频率振动作为按键提示音程序

weixin_53456019的博客 3813

基于51单片机的门铃程序设计

基于51单片机的门铃程序设计,适用于stc89、stc90系列单片机,内含程序源代码、程序说明,可用于课程设计、学习电路电子知识等等。

altium room 布局_ALtium 16相同重复模块PCB布局,复制布局走线

自己做了实际工程以后发现PCB器件名字后缀太长了,所以文章最后写了一下后缀的调整方法。第一种方法:1、建立子原理图如下,文件名CANM 2、之后新建一个顶层文件,文件名TOP,之后design—create sheet symbol form sheet or hdl。选择CANM,并放置到TOP中,如下 3、由于我们要多次调用CANM所以使用repeat命令修改如下: 4、之后根据自己的定义,连...

weixin_39609573的博客 5749

基于51单片机的校园电子打铃器 proteus仿真原理图程序设计

硬件设计 (末尾附文件) 功能: 1、8位数码管显示当前时间。 2、使用DS1302获得时钟信号,能够进行时钟设置 3、能够设置10组打铃时间,并具有临时打铃功能,打铃的时长为5S钟 4、使用1602液晶屏幕显示。 仿真图: 程序设计 #include <all.h> u8 LCD1602_Cursor_address=0; //光标标记 // uchar code degree[]={0x16,0x09,0x08,0x08,0x08,0x09,0x06,0x00}; //摄氏度 符号

ajing666的博客 4660

告别专业软件!用QGIS+GDAL免费搞定S-57电子海图,附全套符号库和样式文件

本文详细介绍了如何利用免费开源工具QGIS和GDAL处理S-57电子海图,包括数据转换、符号库配置和专业可视化方案。通过实战指南,用户无需依赖昂贵的商业软件,即可实现从S-57到SHP的转换及专业级海图制作,特别适合预算有限的个人和小型机构。

weixin_33701294的博客 391

基于单片机的教室电子打铃器

该课设是一款基于单片机的上下课电子打铃器,系统内部集成了实时计时器、显示器以及响铃驱动器等。

weixin_52564375的博客 1668

视觉SLAM与激光SLAM简单对比分析

本文旨在梳理目前较为前沿的SLAM技术,包括激光和视觉,主要从精度和实时性两个方面对算法进系评价。对于激光SLAM了解不深,后期需要补充相关算法的核心思想与算法框架。有问题请大佬们随时留言,我再改正。

超爱吃小蛋糕的66的博客 3854

动作识别(三)Win10复现OpenPose1.7.0+ST-GCN代码

动作识别(三)Win10复现OpenPose1.7.0+ST-GCN代码1.Win10系统配置OpenPose1.7.0的Python API 本人最近在研究基于骨架的动作识别方法,有幸看到端到端的ST-GCN算法,于是决定自己复现一下。(具体原理这里不介绍,大家自行查阅,比如Openpose是个啥?ST-GCN又是个啥?) 1.Win10系统配置OpenPose1.7.0的Python API 安装步骤: (1) ...

QIANFANGshiwo的博客 3039

定时器_定时器设计的门铃

#includetypedef unsigned char u8;typedef unsigned int u16;sbit beep=P1^5;sbit k1=P2^7;u8 ding,dong,flag,stop;u16 n;void delay(u16 i){ while(i--);}void time0init() //定时器0初始化{ TMOD=0X01; //定时器0 ...

weixin_39675215的博客 803

服务器被矿工入侵记录

一次服务器被矿工入驻的处理记录

王瑞的技术专栏 1332

51单片机—独立按键的控制

本文介绍51单片机最基本的独立按键,并用独立按键控制最简单的LED流水灯。

distinglish的博客 1万+

SAR学习笔记后续-phased工具箱介绍

摘要:相控阵雷达介绍,基于仿真对MATLAB中phased工具箱进行了详细介绍

yjh_2019的博客 1万+

C#跨平台制图新纪元:Mapsui,一库在手,地图我有

深入学习Mapsui的渲染机制,定制属于你的地图样式,无论是颜色、图标还是文字,都可以随心所欲。

java专栏 1455

玩转51单片机(STC89C52RC):第三章 独立按键控制LED的四大魔法“

本章介绍了独立按键的概念和连接方式。独立按键是一种电子开关,按下时开关接通,松开时开关断开。在STC89C51单片机中,独立按键连接到P3.0到P3.3处。通过代码控制独立按键可以实现LED的亮灭、状态变化、二进制显示和移位等功能。为了解决按键的抖动问题,可以利用物理或软件的方法进行处理。物理方法是在按键上添加一根线,而软件方法是在代码中添加延时。具体实现可以参考相应的示例代码。

m0_75096759的博客 3753

第7次CCF PTA编程培训师资认证-T1 真题解析(2024下)

B。

lan_in的博客 513

门铃C语言设计程序,单片机C语言程序设计:用定时器设计的门铃

/* 名称:用定时器设计的门铃说明:按下按键时蜂鸣器发出叮咚的门铃声。*/#include#define uchar unsigned char#define uint unsigned intsbit Key=P1^7;sbit DoorBell=P3^0;uint p=0;//主程序void main(){DoorBell=0;TMOD=0x00; //T0 方式 0TH0=(8192-70...

weixin_34824510的博客 2229

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

51系列—基于51单片机的校园教室打铃系统(代码+仿真+电路图超级全)

本资源主要基于51单片机实现的校园打铃系统设计,实现了基本的上下课打铃功能。本设计基于51单片机,使用单片机定时计数器及LCD1602接口实现实时时钟显示,并可设置三组的上下课作息时间,到时间控制蜂鸣器打铃,同时红色LED发光二极管点亮,液晶屏显示打铃状态(上课/下课)

u011816009的博客 6054

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Mixly14:非接触式声光门铃

门铃 即门上的铃,可以发出声音提醒主人有客到访,生活中非常常见。 Light Bell 是一款将灯泡与门铃结合为一体的智能产品,主要为听力受损的人群使用,按门铃时光源会以声响和灯光变化的两种反映提醒住户有访客在门口。 本次实验使用TCRT5000模块(近距离红外感应)、LED及无源蜂鸣器模拟实现触摸式声光门铃,既可以满足普通人声音门铃的使用,又可以考虑到听力障碍人群! 模块作用 ------...

漠宸离若的博客 1289

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

单片机中级项目14丨定时器设计的门铃

单片机中级项目14丨定时器设计的门铃 /* 下载程序后按键K1按下就会触发蜂鸣器门铃“叮咚”响 */ #include<reg52.h> typedef unsigned char u8; typedef unsigned int u16; sbit beep=P1^5; sbit k1=P3^1; u8 ding,dong,flag,stop; u16 n; void delay...

X的博客 1671

526、基于51单片机的门铃仿真设计(5种,数码管)

3、基本功能,在正常模式下长按按键2秒以上,进入门铃声类型选择模式, 短按进行类型选择,再次长痛键退出选择模式;在正常模式下,短按一 下,门铃声响一次,3秒内,短按5次,门铃声响1分钟。需要完整的资料可以点击下面的名片,找我要资源压缩包的百度网盘下载地址及提取码。2、门铃声音通过蜂鸣器播放,类型5种以上,数码管显示当前邮的门铃。毕设帮助、开题指导、技术解答(有偿)见文末。1、一个按键,选择门铃声。

2301_76924958的博客 577

c语言打铃器单片机程序,51单片机自动打铃C语言程序

51单片机自动打铃C语言程序:#include "reg51.h"#include "intrins.h" #define uchar unsigned char #define uint unsigned intuchar code DSY_CODE[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阴极总段//uch...

weixin_42398171的博客 718

【Proteus仿真】【STM32单片机】电子门铃设计

本项目使用Proteus8仿真STM32单片机控制器,使共阴数码管,按键、无源蜂鸣器等。主要功能:系统运行后,数码管默认显示第一种门铃音调,可通过K1键切换音调模式,K2键门铃键,按下时,蜂鸣器发出对应音调。

Hello_Muyi的博客 1009

基于51单片机的nrf24l01无线控制按键音乐门铃长期停留报警设计

51单片机 nrf24l01 音乐门铃 长期停留报警

Benso_H的博客 592
上一篇: 基于51单片机制作频率计-测脉冲数法
下一篇: 检测任意占空比PWN(与LED、数码管、按键结合)
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值