c51单片机利用蜂鸣器与二极管同时工作模拟炸弹倒计时爆炸效果
c51单片机利用蜂鸣器与二极管同时工作模拟炸弹倒计时爆炸效果
今天是学习c51单片机的第二天,这两天学习了蜂鸣器的使用与点亮二极管,我想趁着刚刚学习来把他们巩固一下,于是自己折腾了半天写了一个他们同时工作的程序。此程序可以通过二极管闪烁与蜂鸣器一响一响的效果来模拟炸弹倒计时爆炸的效果。
首先,我们来看看我用的开发板(普中51-双核-A7开发板)的蜂鸣器和二极管的原理图(由于开发板上没有专门的发光二极管,于是我用LED&交通灯模块来代替二极管)。
当蜂鸣器J7-1端接低电平时蜂鸣器工作。
下图为开发板实物图。
下面为最后实现的代码
#include<reg51.h>
#define uint unsigned int
void delay(uint z); //延时函数
void fmq(uint a); //蜂鸣器工作函数
void lighton(); //二极管点亮函数
void lightoff(); //二极管熄灭函数
sbit D1 = P1^0; //P1^0引脚接二极管
sbit deep = P0^0; //P0^0引脚接蜂鸣器void main(){uint a = 0; //此处a代表二极管闪多少次,即蜂鸣器响多少声while(1){for(a = 8; a > 0; a--){ lighton();fmq(500);lightoff(); delay(50000); //50000代表每一次闪间隔的相对时长,由于时间关系,没有严格模拟正确的时间}for(a = 10; a > 0; a--){lighton();fmq(500);lightoff();delay(20000);}for(a = 20; a > 0; a--){ lighton();fmq(500);lightoff();delay(5000);}for(a = 20000; a > 0; a--){ //此循环代表最后蜂鸣器一直在工作,中间没有间隔,而二极管不在工作deep = 0; //该循环未用fmq()函数,因为此处蜂鸣器要连续工作,而不是一响一响的工作delay(5); deep = 1;delay(5); }}}void delay(uint z){while(z--);
}void fmq(uint a){ //a代表蜂鸣器响的相对时长while(a) {deep = 0;delay(5); deep = 1;delay(5); a-- ; }}void lighton(){D1 = 0;
}
void lightoff(){D1 = 1;
}//用我的开发板实现程序后,整个程序大约为12s
总结:一开始的思路是在一个大循环里先调用fmq()函数和light()函数(点亮二极管的函数),然而问题是他俩无法同时进行,即蜂鸣器响完之后二极管才发光,效果不好,于是便直接使用lighton()与lightoff()两个函数,分别在蜂鸣器工作前后调用,实现二极管与蜂鸣器同时工作。
错误分析:在此之前我为把蜂鸣器工作列入一个函数里,部分错误代码如下:
deep = ~deep;
delay(10);
D1 = 0;
delay(50000)
此代码不仅不能让蜂鸣器正常工作,也不能实现二极管的闪烁。
于是我将蜂鸣器工作的实现单独写进一个函数里:
void fmq(){deep = ~deep;delay(10);
}
此时主函数里面为:
void main(){fmq();D1 = 0;delay(50000);D1 = 1;delay(50000);
}
利用此代码烧进开发板后,发现蜂鸣器没法发出声音,只是很沉接近无声的声音,代表蜂鸣器不能正常工作。思考之后,发现除了fmq()函数中的延迟函数外,蜂鸣器还会经过一个主函数中的delay()函数,于是导值蜂鸣器高低电平之间的变换太慢,导值蜂鸣器不能正常工作。
解决以上两种问题的办法就是不在主函数中加延迟,而是在fmq()中加延迟,可以控制每次响多长时间,而主函数主要控制能响多少次,并且让二极管与蜂鸣器同时工作,以及每次闪烁间隔的时间。此时,虽然主函数中仍有延迟函数,但是并不影响fmq()函数,因为fmq()函数调用运行完之后,才允许之函数中的延迟函数,所以并不影响蜂鸣器正常工作。当仔细思考后,写出了上面正确的可以实现的代码。
关于这个程序有问题的可以在评论里问,我会尽力为大家解答哒!
c51单片机利用蜂鸣器与二极管同时工作模拟炸弹倒计时爆炸效果相关推荐
- 单片机利用蜂鸣器如何输出音乐
采用音乐音谱节拍的方式 举个栗子,单片机通过蜂鸣器来播放生日快乐歌. #include "reg51.h" #define uchar unsigned char #define ...
- (十)51单片机——利用蜂鸣器播放《孤勇者》(附成果展示)
目录 硬件部分 蜂鸣器介绍 驱动电路 ULN2003 乐理部分 音符 音符与频率对照 代码部分 运行结果 随着最近孤勇者成为小朋友们的接头暗号之后,于是产生了利用单片机去播放孤勇者的想法,接下来我们来 ...
- MSP430G2553单片机——利用蜂鸣器播放一首歌
利用MSP430G2553单片机和无源蜂鸣器播放一首歌,下面给出两种方案. 方案一: 播放<两只老虎> #include<MSP430G2553.h> //音乐播放 // by ...
- C51单片机 波特率选择 和 串口的工作方式
串口的工作方式 MCS-51串行口有0.1.2.3四种工作方式. 方式0:8位同步移位寄存器方式 方式1:10位通用异步通信 方式2:11位异步通信 方式3:可变波特率11位异步通信. 方式0:同步移 ...
- 51单片机 AT24C04+蜂鸣器+Proteus仿真
51单片机 AT24C02+蜂鸣器+Proteus仿真 Proteus仿真截图 由于是音频效果,只能以截图展示基本电路 实例代码 #include <reg52.h> #include & ...
- 【C51单片机学习笔记--DS1302时钟芯片蜂鸣器I2C总线AT24C02存储器】
C51单片机学习笔记–DS1302时钟芯片&&蜂鸣器&&I2C总线&&AT24C02存储器 文章目录 一.DS1302时钟芯片介绍 二.DS1302时钟 ...
- 利用c51单片机实现测频仪(基于proteus仿真)
主要使用了c51单片机内部的定时器计数器功能 最近在准备期末考试,就结合这个实验复习了一下TMOD,TCON, EA, IP的使用 还有就是今年的蓝桥杯单片机省赛的时候就考到了测频功能,当时还没有学习 ...
- c51语言双层for循环延时2ms,51单片机利用for语句嵌套实现简单的延时1s功能
原标题:51单片机利用for语句嵌套实现简单的延时1s功能 51单片机利用for语句嵌套实现简单的延时1s功能 名词解释: (1)时钟周期.定义为时钟频率的倒数,本例使用12MHz的时钟频率,它的时钟 ...
- 对C51单片机的初步认识
对C51单片机,以前只是为应付考试而学习过,自己几乎没有动过什么手,感觉51很难很高深,现在通过自己实际动手操作了一遍,个人感觉51还是很简单的,当然对完整开发出一款产品而言还需要时间,去积累.现将本 ...
- 【C51开发应用】基于C51单片机开发的循迹灭火机器人
基于C51单片机开发的循迹灭火机器人 一.作品摘要 二.系统设计步骤 三.方案设计 3.1 小车主体设计 3.1.1 购买玩具小车进行改装 3.1.2 自己设计小车主体结构 3.2 电 ...
最新文章
- mysql2005备份_创建完整数据库备份 - SQL Server | Microsoft Docs
- uml 时序图_设计模式:UML是怎么回事?设计原则?
- AVFoundation和 GPUImage初探
- 重磅!居全国前列!合肥获批建设3个国家战略性新兴产业集群!
- php 文件上传系统,php需登录文件上传管理系统
- TextView 显示图像+文字的方法
- Docker系列之烹饪披萨(二)
- 自己动手焊制硬件开发板
- linux c++开发_Linux/Windows下进行C/C++开发的差异
- java 创建存储过程_如何在pl/sql中创建及调用JAVA存储过程 | 学步园
- mvc:annotation-driven /
- SilverLight学习之基本图形
- 你发这些什么目的_淘宝客怎么发朋友圈?淘宝客怎么通过朋友圈引流?
- java程序设计俄罗斯方块_Java俄罗斯方块实现代码
- pdf文件如何在线转换为jpg图片
- win10电脑磁盘占用百分百,电脑优化
- 软件需求的薛定谔之猫
- 基于51单片机及MAX6675的8通道测温系统 protues仿真
- Java开发必知Linux命令
- 学编程能做什么工作 五大行业任你选