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语言包。 上图所示,在【选项】里找到【编辑】设置,可以更改软件默认…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...

快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
算法250609 高精度
加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...