蜂鸣器的原理及使用方法及实验:开关S1闭合发出频率为1kHz的声音,发声时间约为1s。开关S2闭合发出频率为500Hz的声音,发声时间约为0.5s。

该实验旨在掌握51单片机并行I/O口应用,通过开关S1和S2控制P1.0引脚的蜂鸣器,S1闭合产生1kHz、1s声音,S2闭合产生500Hz、0.5s声音。实验涉及Proteus硬件设计、Keil µVersion3编程及联机调试,使用BUZZER作为发声器,并通过三极管开关驱动。
摘要由CSDN通过智能技术生成

实验2 并行I/O口应用设计实验

一、实验目的
(1)熟练掌握51单片机内部并行I/O口的基本应用;
(2)掌握蜂鸣器的原理及使用方法;
(3)能够根据项目任务在Proteus 上设计硬件原理图;
(4)能够在Keil µVersion3上编程实现蜂鸣器的程序管理;
(5)能够使用调试工具进行Proteus和Keil µVersion3的联机调试。
二、实验要求
设计用两个开关S1、S2控制P1.0引脚实现蜂鸣器报警的程序,要求如下:
(1)开关S1、S2分别接到P3.0、P3.1引脚上。
(2)蜂鸣器接到P1.0引脚上。
(3)开关S1闭合发出频率为1kHz的声音,发声时间约为1s。
(4)开关S2闭合发出频率为500Hz的声音,发声时间约为0.5s。
提示:
(1)假设单片机系统时钟频率为12MHz。
(2)采用软件延时。
(3)在Proteus中,可以使用的蜂鸣器有两种,分别是SOUNDER和BUZZER,实验前请查阅资料了解蜂鸣器的使用方法。
三、实验步骤及结果

  1. 用Proteus绘制实验电路原理图
    蜂鸣器的特点与用法:
    1、 BUZZER只是SOUNDER的一种,SOUNDER 可以理解为发声器,本实验采用BUZZER。
    2、 电磁式蜂鸣器: 由振荡器电磁线圈、磁铁、振动膜片及外壳等组成,详情如图:
    在这里插入图片描述蜂鸣器结构图

                          图1-1  蜂鸣器原理图
    

3、 蜂鸣器工作原理:
通过在某一接脚接高电压使线圈产生电流从而产生电磁场。产生磁场后将振动膜片吸附到中间的铁柱上,然后在此接脚接低电压,电流断开,磁场消失,振动膜片回弹。有振荡器的蜂鸣器为有源蜂鸣器,它可以直接将输入的高电压转换为一定频率的方波。无源蜂鸣器则没有振荡器需自己设计频率。
4、 蜂鸣器的用法:
三极管做蜂鸣器的开关应用:
首先不接三级管是不可以的,虽然单片机能直接写1,在输出口输出5V的电压,但是因为P1的I/o口内接上拉电阻,上拉电阻的电压比较大的,所以单片机的输出电流是不足以驱动蜂鸣器的。
在这里插入图片描述
图1-2 三级管原理图
如图:当IB>1mA时,E到C接通。
所以蜂鸣器的应用如图所示:
在这里插入图片描述
图1-3 蜂鸣器应用图

5、 试验电路原理图如图1-4所示:
在这里插入图片描述
图1-4 实验电路原理图
表1-1 所用元器件及其参数
序号 器件编号 Proteus器件名称 器件性质 参数及说明 数量
1 U1 AT89C51 单片机 12MHz 1
2 R

  • 13
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,以下是优化后的代码: ```c #include <reg51.h> // 定义定时器的初值 #define TIMER_INIT_VALUE 65535 - 50000 // 定义计时器的计数值 unsigned int timerCount = 0; // 定义开关按钮的引脚 sbit startButton = P1^0; sbit stopButton = P1^1; // 定义显示数码管的引脚 sbit segA = P2^0; sbit segB = P2^1; sbit segC = P2^2; sbit segD = P2^3; // 定义蜂鸣器引脚 sbit buzzer = P3^4; // 定义显示时间的变量 unsigned char minute = 0; unsigned char second = 0; // 定义延时函数 void delay(unsigned int time) { unsigned int i, j; for (i = 0; i < time; i++) { for (j = 0; j < 125; j++); } } // 定义定时器中断函数 void timerInterrupt() interrupt 1 { // 清除定时器中断标志 TF0 = 0; // 重新赋初值 TH0 = TIMER_INIT_VALUE / 256; TL0 = TIMER_INIT_VALUE % 256; // 计数器加1 timerCount++; // 判断计数器是否达到1钟 if (timerCount == 20) { timerCount = 0; // 数加1 second++; // 判断是否到达1分钟 if (second == 60) { // 停止定时器 TR0 = 0; // 发出蜂鸣声 buzzer = 0; delay(500); buzzer = 1; // 显示时间到了 while (1) { segA = segB = segC = segD = 0xff; delay(500); segA = segB = segC = segD = 0x00; delay(500); } } } } void main() { // 初始化定时器 TMOD = 0x01; TH0 = TIMER_INIT_VALUE / 256; TL0 = TIMER_INIT_VALUE % 256; TR0 = 1; ET0 = 1; EA = 1; // 循环检测开关按钮 while (1) { if (startButton == 0) { // 开始计时 TR0 = 1; } if (stopButton == 0) { // 停止计时 TR0 = 0; minute = 0; second = 0; // 清空计数器 timerCount = 0; } // 显示时间 segA = second % 10; segB = second / 10; segC = minute % 10; segD = minute / 10; } } ``` 上面的代码在原有代码的基础上进行了以下优化: 1. 将时间定为1分钟,当计时器达到1分钟时发出蜂鸣声,并停止计时器。 2. 添加了蜂鸣器控制,当计时器达到1分钟时发出蜂鸣声。 3. 去除了不必要的延时,使用硬件定时器来计时,提高计时的准确性和稳定性。 4. 优化了显示时间的代码,使显示更加清晰。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

‾͟͟͞(((ꎤ✧曲✧)̂—̳͟͞加油哟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值