51单片机-LED灯蜂鸣器数码管按键DS18B20温度传感器
LDE灯的相关程序
LED灯闪烁

LED流水灯
方法1

方法二:
因为P1口可以直接控制P1^0~P1^7的8个led灯,利用一个8位的二进制数字来进行控制即可。如果要点亮P1^0 只需要给P1口传递 1111 1110即可。

蜂鸣器的使用
什么是蜂鸣器?
蜂鸣器是一种一体化结构的电子发生器,主要是用来起到报警的作用。
蜂鸣器分类
有源蜂鸣器
内部有震荡源,所以只要通电就会鸣叫,控制比较方便。
无源蜂鸣器
内部不带震荡源,所以通电不能让它直接鸣叫,必须使用2K~5K的方波去驱动它,声音频率可以调整。
什么是三极管
一种控制电流的半导体器件,作用就是把微弱的电信号放大成更大幅度的电信号,在电路中主要作用于开关和放大电流的作用。
三级管有三个引脚:B(基极)、C(集电极)、E(发射极)。
PNP三极管的图示:

关键点在于B极和E极之间的电压情况,对于PNP而言,只要E极电话高于B极0.7V以上,这个三极管就可以顺利导通。
方波
一种非正弦曲线的波形,通常会与电子和讯号处理的时候出现。
理想的方波只有高和低这两个值,救护车的声音频率高频是1000Hz 低频是 750Hz。
1000HZ的分析:

750HZ的分析:

方波图:

代码实现


数码管的使用
数码管显示数字的原理
数码管的电路图

数码管段选图

不同的数字对应的P0口应该传递的16进制数字(不带小数点的)

数码管显示指定数字

数码管显示动态数字

按键的使用
按键消抖
当物理按键按下或者弹起的时候,电平都不是立即为0或者立即为1的,会出现抖动的情况,所以要进行消抖操作。
按键按下一次的时候电平变化:

代码演示

DS18B20温度传感器的使用
简介
DS18B20是一款常用的高精度单总线数字温度测量芯片,体积小,占用资源少,抗干扰能力强。

使用方法说明
图示

由于温度传感器的电路设计原因,必须按照如下顺序进行操作才能成功
1、先复位
2、执行一次ROM指令
3、执行一次RAM指令
注意: 一次ROM只能搭配一次RAM
完成温度读取的步骤
先做温度转换
复位和检测:每次发命令之前都要先进行复位检测,目的是检测当前温度传感器的状态是否正常。
按照ROM指令表,发送0xCC来跳过ROM存储器,因为设备上只有一个DS18B20,所以不需要进行其他的寻址等操作。
按照RAM指令表,发送0x44来启动温度传感器降温度转化为数字信号,存储到RAM中。
读取温度数据
复位和检测
给ROM发送0xCC跳过ROM存储器
给RAM发送0xBE来读取RAM暂存器中的温度数据:读取温度低位;读取温度高位。
温度的转化问题
图示

原码、反码和补码
原码:
最高位是符号位,0表示正数,1表示负数。
反码:
最高位是符号位,0表示正数,1表示负数;
正数的反码是它本身,负数的反码除了符号位以外,各位取反。
补码:
最高位是符号位,0表示正数,1表示负数;
正数的补码也是它本身,负数的补码是反码+1;
如:原码是1011 对应反码是1100 补码就是 1101;
设计补码的目的:就是能够和其相反数相加通过溢出的方式从而使计算机内的结果变为合理的二进制码。
例:比如1 和 -1相加 正常的结果是0;如果用原码计算:0001 + 1001 = 1010,结果是-2 这样的结果是错误的;利用补码实现:0001 + 1111 = 10000, 将最高位的1溢出, 结果就变成了0000,这样的结果是正确的。
DS18B20的时序问题
初始化时序
图示:

单总线上所有的通信都是从初始化时序开始的,主机输出低电平,保持低电平至少480us(实际在480~960us之间都可以),以产生复位脉冲。
接着主机释放总线,将电平拉高,延时15~60us,进入接受模式,接着DS18B20会自己拉低总线60~240us,会产生应答脉冲,如果是低电平会延时一段时间,之后会上拉电阻至少480us结束。
代码

写时序
图示:

说明:
写0时序:主机输出低电平,60us以后拉高电平 延时一会让电平稳定。
写1时序:主机输出低先平,立即拉高,然后延时60us即可。
按位与(&):
按位与遵循的原则:两个二进制数对应的每一位如果都是1,结果就是1,否则0。

代码演示

读时序
图示:

说明:
单总线仅在主机发出读时序的时候,才向主机传输数据,所以在发出读数据命令之后,必须马上产生读时序,以便从机能够发送输出给主机。
所有的读时序都需要60us的时间, 并且要在两次独立的读时序之间要间隔至少1us。主机在读时序期间必须要释放总线,并且在时序起始后的15us采样数据。
按位或(|):
对应的两个数字,如果有一个为1,那么结果就是1,否则结果为0。

代码:

使用DS18B20温度传感器完成温度检测并在数码管上显示:
// DS18B20的温度传感器程序
#include <reg51.h>
// 定义温度传感器的引脚变量
sbit DQ=P3^7;
// 定义不带小数点的数字数组
unsigned char arr1[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
// 定义带小数点的数字数组
unsigned char arr2[10] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10};
// 定义全局变量来保存温度的低八位和高八位
unsigned char tempL = 0;
unsigned char tempH = 0;// 定义一个变量来确定温度到底是正值还是负值
unsigned char flag=1;
// 定义变量存放温度值的整数部分
unsigned int sdata;// 定义变量来存放小数第一位和第二位
unsigned char xiaoshu1;
unsigned char xiaoshu2;
// 定义延时函数
// 这个延时程序的具体延时时间是 time(us) = i * 8 + 10, 适用于2ms之内的延时
void delay(unsigned char i)
{for(i; i > 0; i--);
}
// 初始化程序
unsigned char Init_DS18B20()
{unsigned char x = 0;DQ=1; // 先让DS18B20稳定在高电平的状态,先拉高delay(8); // 延时74us准备开始初始化时序DQ=0; // 发送低电平,开始发送低电压的脉冲信号delay(80); // 等待650us,在480us到960us之间DQ=1; // 拉高总线delay(5); // 延时50us(在15us到60us之间) 等待DS18B20反应,准备接收DS18B20发送的数据x = DQ; // 用x来接受DS18B20返回的电平值,如果DS18B20初始化成功X的值就是0,否则为1delay(30); // 等待一会完成整个的初始化时序。return x;
}// 写函数
// 调用一次写入一个字节
void writeOneChar(unsigned char dat)
{unsigned char i=0;for(i = 8;i > 0;i--) // 循环8次,每次写入一位,写完8位 就是一个字节{DQ=0; // 不论写0还是写1,都需要先拉低总线// 从最低位开始写,让dat和0x01进行与操作获取最低位数字发送给DS18B20DQ=dat&0x01;delay(5); // 继续延时,等待DS18B20采样完成DQ=1; // 释放总线dat>>=1; // 将dat的值直接右移,将下一位的值移动到最低位,再重新赋值给dat用来下次获取最低位数据delay(2); // 执行完一个写数字的程序,等待一下 准备开始下次写程序。}
}// 读函数
// 循环8次可以读完一个字节
unsigned char readOneChar()
{unsigned char dat=0; // 准备一个变量来接受读出来的一个字节的数据unsigned int i ;for(i = 0; i < 8 ;i++){DQ=1;// 先拉高电平,进入准备工作delay(1); // 可以让每次的读时序间隔1us以上,实际等待了18usDQ=0; // 拉低总线delay(1); // 延时18us// 将dat右移一位,因为实际保存的数据是8位数据。// 但是在每次保存之后进行位移,总共位移7次,所以要将第一次位移给取消掉dat>>=1; // 如果读到的DQ是1 进行下面判断将1写入dat,如果是0,就直接进行右移,将0保存下来即可DQ=1; // 释放总线,回到高电平,会产生读信号。// 因为DS18B20如果发送的是一个0的数据,产生读信号之后,仍然会将总线设置为低电平持续完读时序之后才释放总线// 如果DS18B20要发送的是一个1的数据,产生读信号之后,会直接释放总线,那么我们读到的就是高电平。// 如果读到的DQ是高电平,就直接与0x80进行按位或运算, 将数据直接写到dat中if(DQ){// dat 0000 0000// 0x80 1000 0000// 1000 0000// 右移一位// 0100 0000// dat 0100 0000// 0x80 1000 0000// 1100 0000// 0110 0000dat|=0x80;}delay(4); // 等待42us完成整个的读时序}return dat;
}// 读取温度值
void readTemperature()
{while(Init_Ds18B20()); // 初始化writeOneChar(0xcc); // 跳过ROM读序列号的操作writeOneChar(0x44); // 命令DS18B20开始温度转化delay(124); // 等一会开始下一次的执行步骤while(Init_Ds18B20()); // 初始化writeOneChar(0xcc); // 跳过ROM读序列号的操作writeOneChar(0xbe); // 开始读暂存器的数据tempL = readOneChar(); // 读取温度值的低8位 LSBtempH = readOneChar(); // 读取温度值的高8位 MSB// 将读取到的温度值进行转化成实际温度// LSB 1111 1100// MSB 0000 0111// 0000 0111 0000 0000// 0000 0000 1111 1100// 0000 0111 1111 1100// 判断温度是否负值,如果是负值,就取反加1,如果是正值就不做处理if(tempH>0x7f){tempL = ~tempL + 1;tempH = ~tempH;flag = 0;}sdata = (float)(tempH << 8 | tempL) / 16.0; // 整数部分计算// 计算小数一位xiaoshu1 = (tempL&0x0f)*10/16;// 计算小数二位xiaoshu2 = (tempL&0x0f)*100/16%10;
}void led()
{if(flag){P2=0xfe;// 打开第一个数码管P0=arr1[sdata/10]; // 显示十位数P0=0xff;P2=0xfd;// 打开第二个数码管P0=arr2[sdata%10]; // 显示个位数P0=0xff;P2=0xfb;// 打开第三个数码管P0=arr1[xiaoshu1]; // 显示小数第一位P0=0xff;P2=0xf7;// 打开第四个数码管P0=arr1[xiaoshu2]; // 显示小数第二位P0=0xff;}else{P2=0xfe;// 打开第一个数码管P0=0xbf; // 显示负号P0=0xff;P2=0xfd;// 打开第二个数码管P0=arr1[sdata/10]; // 显示十位数P0=0xff;P2=0xfb;// 打开第三个数码管P0=arr2[sdata%10]; // 显示整数个位P0=0xff;P2=0xf7;// 打开第四个数码管P0=arr1[xiaoshu1]; // 显示小数第一位P0=0xff;}}// 定义蜂鸣器
sbit beef = P3^6;
// 报警程序
void alarm()
{if(sdata >= 25){beef = !beef;}else{beef = 1;}
}
void main()
{while(1){readTemperature();led();}
}
相关文章:
51单片机-LED灯蜂鸣器数码管按键DS18B20温度传感器
LDE灯的相关程序 LED灯闪烁 LED流水灯 方法1 方法二: 因为P1口可以直接控制P1^0~P1^7的8个led灯,利用一个8位的二进制数字来进行控制即可。如果要点亮P1^0 只需要给P1口传递 1111 1110即可。 蜂鸣器的使用 什么是蜂鸣器? 蜂鸣器是一种一…...
笔记本一线品牌有哪些
笔记本电脑的一线品牌通常指的是在市场上具有较高市场份额、良好口碑、较强的技术实力和服务能力的品牌。根据目前的信息,笔记本电脑市场的一线品牌主要包括以下几个: 联想 (Lenovo):联想在全球笔记本市场上的占有率较高,其产品线…...
mysql聚合函数和分组
我最近开了几个专栏,诚信互三! > |||《算法专栏》::刷题教程来自网站《代码随想录》。||| > |||《C专栏》::记录我学习C的经历,看完你一定会有收获。||| > |||《Linux专栏》࿱…...
ubuntu20.04+RealSenseD455
ubuntu20.04安装驱动双目相机RealSenseD455 安装环境安装RealSense SDK 2.0ROS包安装启动Realsense摄像头存在的 bugD455标定安装环境 系统:Ubuntu20.04 ROS:Noetic 视觉传感器:Intel RealSense D455 安装RealSense SDK 2.0 该安装有两种方式,一个是用命令安装,另一个是…...
WAF绕过技巧
WAF绕过技巧 WAF(Web Application Firewall)是一种安全系统,旨在监控和控制网络流量,以防止攻击,如SQL 注入、跨站脚本(XSS)和拒绝服务(DoS)。 WAF 可以通过多种方式绕过…...
HarmonyOS应用三之组件生命周期和参数传递
目录: 1、生命周期的执行顺序2、页面数据传递3、图片的读取4、数据的备份和恢复5、轮播图6、页面布局图 1、生命周期的执行顺序 /** Copyright (c) 2023 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* yo…...
[Qt][Qt 网络][上]详细讲解
目录 0.概述1.UDP Socket1.核心API概览2.回显服务器3.回显客户端 0.概述 要使用Qt中有关网络编程的API,需要添加network模块 1.UDP Socket 1.核心API概览 主要的类有两个:QUdpSocket和QNetworkDatagramQUdpSocket表⽰⼀个UDP的socket⽂件 bind(const …...
读零信任网络:在不可信网络中构建安全系统21读后总结与感想兼导读
1. 基本信息 零信任网络:在不可信网络中构建安全系统 道格巴斯(Doug Barth) 著 人民邮电出版社,2019年8月出版 1.1. 读薄率 书籍总字数252千字,笔记总字数73194字。 读薄率73194252000≈29.5% 这个读薄率是最高的吧&#x…...
Java基础——注释
在开发中注释是必不可少的,帮助我们更好的标记阅读代码,下面介绍几种常用的注释方式。 一、注释种类 1. 单行注释 使用//一行代码来进行注释,只能注释一行内容 2. 多行注释 使用斜杠星号的方式 /*注释多行代码*/,注释多行代…...
Redis未授权访问漏洞利用合集
一、基本信息 靶机:IP:192.168.100.40 攻击机:IP:192.168.100.60 二、漏洞 & 过程 Redis 未授权访问漏洞利用无口令远程登录靶机 靶机 cd redis-4.0.8/src./redis-server ../redis.conf 攻击机 ./redis-cli -h 192.168.100.40 Redis 未授权访问…...
基于asp.net的在线考试系统、基于c#的在线考试管理系统
摘 要 伴随着社会以及科学技术的发展,互联网已经渗透在人们的身边,网络慢慢的变成了人们的生活必不可少的一部分,紧接着网络飞速的发展,管理系统这一名词已不陌生,越来越多的学校、公司等机构都会定制一款属于自己个…...
将 hugo 博客搬迁到服务器
1. 说明 在 Ubuntu 22.04 上使用 root 账号,创建普通账号,并赋予 root 权限。 演示站点:https://woniu336.github.io/ 魔改hugo主题: https://github.com/woniu336/hugo-magic 2. 服务器配置 建立 git 用户 adduser git安装 git sudo apt …...
【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向笔记 Task04 RAG模型 人话八股文Bakwaan_Buddy项目创空间部署
【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向笔记 Task04 RAG模型 人话八股文Bakwaan_Buddy项目创空间部署 什么是RAG: 我能把这个过程理解为Kimi.ai每次都能列出的一大堆网页参考资料吗?Kimi学了这些资料以后,根据这里面的信息综…...
CTF密码学小结
感觉没啥好总结的啊 基础的永远是RSA、流密码、哈希、对称密码、古典密码那一套(密码学上过课都会),其他的就是数论的一些技巧 似乎格密码也很流行,以及一些奇奇怪怪的性质利用也很多 1、random设置种子后随机的性质:…...
Vue快速入门(七)——Vue3 状态管理 - Pinia(二)
目录 六、核心概念——Getter 1、基本操作 定义getter 访问getter 2、访问其他 getter 3、向 getter 传递参数 4、访问其他 store 的 getter 使用 setup() 时的用法 使用选项式 API 的用法 使用 setup() 不使用 setup() 七、核心概念——Action 1、基本操作 定义a…...
ZooKeeper集群环境部署
1. ZooKeeper安装部署 1.1 系统要求 1.1.1 支持的平台 ZooKeeper 由多个组件组成。一些组件得到广泛支持,而另一些组件仅在较小的一组平台上得到支持。 客户端是 Java 客户端库,由应用程序用于连接到 ZooKeeper 集群。 服务器是在 ZooKeeper 集群节点…...
10 个 C# 关键字和功能
在 Stack Overflow 调查中,C# 语言是排名第 5 位的编程语言。它广泛用于创建各种应用程序,范围从桌面到移动设备再到云原生。由于有如此多的语言关键字和功能,对于开发人员来说,要跟上新功能发布的最新信息将是一项艰巨的任务。本…...
贪心算法之重叠区间问题
以下四个题都是重叠区间问题 452. 用最少数量的箭引爆气球 为了让气球尽可能重叠,先按照气球起始位置由大到小排序tips:sort默认就可以实现以上排序,不需要写cmp重点:当下一个气球的左边界不小于上一个气球的右边界时(即有重叠的…...
Python爬虫入门教程(非常详细)适合零基础小白
一、什么是爬虫? 1.简单介绍爬虫 爬虫的全称为网络爬虫,简称爬虫,别名有网络机器人,网络蜘蛛等等。 网络爬虫是一种自动获取网页内容的程序,为搜索引擎提供了重要的数据支撑。搜索引擎通过网络爬虫技术,将…...
ArcGIS Pro基础:软件的常用设置:中文语言、自动保存、默认底图
上图所示,在【选项】(Options)里找到【语言】设置,将语言切换为中文选项,记得在安装软件时,需要提前安装好ArcGIS语言包。 上图所示,在【选项】里找到【编辑】设置,可以更改软件默认…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
