当前位置: 首页 > news >正文

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 方法二&#xff1a; 因为P1口可以直接控制P1^0~P1^7的8个led灯&#xff0c;利用一个8位的二进制数字来进行控制即可。如果要点亮P1^0 只需要给P1口传递 1111 1110即可。 蜂鸣器的使用 什么是蜂鸣器&#xff1f; 蜂鸣器是一种一…...

笔记本一线品牌有哪些

笔记本电脑的一线品牌通常指的是在市场上具有较高市场份额、良好口碑、较强的技术实力和服务能力的品牌。根据目前的信息&#xff0c;笔记本电脑市场的一线品牌主要包括以下几个&#xff1a; 联想 (Lenovo)&#xff1a;联想在全球笔记本市场上的占有率较高&#xff0c;其产品线…...

mysql聚合函数和分组

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…...

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&#xff08;Web Application Firewall&#xff09;是一种安全系统&#xff0c;旨在监控和控制网络流量&#xff0c;以防止攻击&#xff0c;如SQL 注入、跨站脚本&#xff08;XSS&#xff09;和拒绝服务&#xff08;DoS&#xff09;。 WAF 可以通过多种方式绕过…...

HarmonyOS应用三之组件生命周期和参数传递

目录&#xff1a; 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&#xff0c;需要添加network模块 1.UDP Socket 1.核心API概览 主要的类有两个&#xff1a;QUdpSocket和QNetworkDatagramQUdpSocket表⽰⼀个UDP的socket⽂件 bind(const …...

读零信任网络:在不可信网络中构建安全系统21读后总结与感想兼导读

1. 基本信息 零信任网络&#xff1a;在不可信网络中构建安全系统 道格巴斯&#xff08;Doug Barth&#xff09; 著 人民邮电出版社,2019年8月出版 1.1. 读薄率 书籍总字数252千字&#xff0c;笔记总字数73194字。 读薄率73194252000≈29.5% 这个读薄率是最高的吧&#x…...

Java基础——注释

在开发中注释是必不可少的&#xff0c;帮助我们更好的标记阅读代码&#xff0c;下面介绍几种常用的注释方式。 一、注释种类 1. 单行注释 使用//一行代码来进行注释&#xff0c;只能注释一行内容 2. 多行注释 使用斜杠星号的方式 /*注释多行代码*/&#xff0c;注释多行代…...

Redis未授权访问漏洞利用合集

一、基本信息 靶机&#xff1a;IP:192.168.100.40 攻击机&#xff1a;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#的在线考试管理系统

摘 要 伴随着社会以及科学技术的发展&#xff0c;互联网已经渗透在人们的身边&#xff0c;网络慢慢的变成了人们的生活必不可少的一部分&#xff0c;紧接着网络飞速的发展&#xff0c;管理系统这一名词已不陌生&#xff0c;越来越多的学校、公司等机构都会定制一款属于自己个…...

将 hugo 博客搬迁到服务器

1. 说明 在 Ubuntu 22.04 上使用 root 账号&#xff0c;创建普通账号&#xff0c;并赋予 root 权限。 演示站点&#xff1a;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&#xff1a; 我能把这个过程理解为Kimi.ai每次都能列出的一大堆网页参考资料吗&#xff1f;Kimi学了这些资料以后&#xff0c;根据这里面的信息综…...

CTF密码学小结

感觉没啥好总结的啊 基础的永远是RSA、流密码、哈希、对称密码、古典密码那一套&#xff08;密码学上过课都会&#xff09;&#xff0c;其他的就是数论的一些技巧 似乎格密码也很流行&#xff0c;以及一些奇奇怪怪的性质利用也很多 1、random设置种子后随机的性质&#xff1a…...

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 由多个组件组成。一些组件得到广泛支持&#xff0c;而另一些组件仅在较小的一组平台上得到支持。 客户端是 Java 客户端库&#xff0c;由应用程序用于连接到 ZooKeeper 集群。 服务器是在 ZooKeeper 集群节点…...

10 个 C# 关键字和功能

在 Stack Overflow 调查中&#xff0c;C# 语言是排名第 5 位的编程语言。它广泛用于创建各种应用程序&#xff0c;范围从桌面到移动设备再到云原生。由于有如此多的语言关键字和功能&#xff0c;对于开发人员来说&#xff0c;要跟上新功能发布的最新信息将是一项艰巨的任务。本…...

贪心算法之重叠区间问题

以下四个题都是重叠区间问题 452. 用最少数量的箭引爆气球 为了让气球尽可能重叠&#xff0c;先按照气球起始位置由大到小排序tips&#xff1a;sort默认就可以实现以上排序&#xff0c;不需要写cmp重点&#xff1a;当下一个气球的左边界不小于上一个气球的右边界时(即有重叠的…...

Python爬虫入门教程(非常详细)适合零基础小白

一、什么是爬虫&#xff1f; 1.简单介绍爬虫 爬虫的全称为网络爬虫&#xff0c;简称爬虫&#xff0c;别名有网络机器人&#xff0c;网络蜘蛛等等。 网络爬虫是一种自动获取网页内容的程序&#xff0c;为搜索引擎提供了重要的数据支撑。搜索引擎通过网络爬虫技术&#xff0c;将…...

ArcGIS Pro基础:软件的常用设置:中文语言、自动保存、默认底图

上图所示&#xff0c;在【选项】&#xff08;Options&#xff09;里找到【语言】设置&#xff0c;将语言切换为中文选项&#xff0c;记得在安装软件时&#xff0c;需要提前安装好ArcGIS语言包。 上图所示&#xff0c;在【选项】里找到【编辑】设置&#xff0c;可以更改软件默认…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...