51单片机-LED灯蜂鸣器数码管按键DS18B20温度传感器

news2024/11/15 21:25:18

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 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,否则为1
	delay(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进行与操作获取最低位数字发送给DS18B20
		DQ=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以上,实际等待了18us
		DQ=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 0000
			dat|=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位 LSB
	tempH = readOneChar(); // 读取温度值的高8位 MSB
	
	// 将读取到的温度值进行转化成实际温度
	// LSB 1111 1100
	// MSB 0000 0111
	// 0000 0111 0000 0000
	// 0000 0000 1111 1100
	// 0000 0111 1111 1100
	
	sdata = (float)(tempH << 8 | tempL) / 16.0; // 整数部分计算
	// 计算小数一位
	xiaoshu1 = (tempL&0x0f)*10/16;
	// 计算小数二位
	xiaoshu2 = (tempL&0x0f)*100/16%10;
}

void led()
{
	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;
}
void main()
{
	while(1)
	{
		readTemperature();
		led();
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2038569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】类和对象 ——中

1. 赋值运算符重载 1.1 运算符重载 • 当运算符被⽤于类类型的对象时&#xff0c;C语⾔允许我们通过运算符重载的形式指定新的含义。C规定类类型对象使⽤运算符时&#xff0c;必须转换成调⽤对应运算符重载&#xff0c;若没有对应的运算符重载&#xff0c;则会编译报错。 •…

Leetcode—1143. 最长公共子序列【中等】

2024每日刷题&#xff08;155&#xff09; Leetcode—1143. 最长公共子序列 实现代码 class Solution { public:int longestCommonSubsequence(string text1, string text2) {int m text1.length();int n text2.length();vector<vector<int>> dp(m 1, vector&…

sadtalker推理的时候报错:IndexError: Cannot choose from an empty sequence

问题描述 在进行推理的时候&#xff0c;报错IndexError: Cannot choose from an empty sequence&#xff0c;如下图 解决办法&#xff1a; 这个报错是因为你输入的音频太短了&#xff0c;不到1秒就会报这个错。你可以输入个大于1秒的视频试一下。 也可以修改代码解决这个问题…

Python教程(十四):Requests模块详解

目录 专栏列表前言&#xff1a;安装 Requests查看包安装情况&#xff1a; RESTful 介绍RESTful API设计原则示例 基本用法1. 查询ID为1的用户&#xff08;GET&#xff09;2. 创建新用户&#xff08;POST&#xff09;3. 更新ID 为 1 的用户&#xff08;PUT&#xff09;4. 删除ID…

Haproxy讲解

Haproxy: haproxy是一个开源的高性能反向代理和负载均衡器&#xff0c;主要用于‌TCP和‌HTTP流量管理。 功能和特点&#xff1a;haproxy能够处理大量的并发连接&#xff0c;支持TCP和HTTP协议&#xff0c;具有高可用性和负载均衡功能。它特别适用于需要处理大量流量的网站&am…

AI终于会画手了,Flux.1一出世就直接碾压Stable Diffusion(SD)和Midjourney(MJ)

Flux.1模型一发布&#xff0c;AI文生图终于会画手了&#xff0c;Flux.1模型比Stable Diffusion&#xff08;SD&#xff09;和Midjourney&#xff08;MJ&#xff09;更能将手部和长文本生成得更好更合理。 Flux.1模型生成的图&#xff0c;现在手部不再有畸形了。 同时&#xff…

hfs通过stunnel实现https访问

hfs通过stunnel实现https访问 REF:官方文档&#xff0c;有点老旧 https://blog.51cto.com/u_15015155/2554641 步骤 下载stunnel工具 download (笔者用的是windows的) 下载stunnel途中会进行本地证书的制作&#xff08;也可以用openssl自定义证书&#xff09;&#xff0c;如…

C++ 适配器

适配器 适配器是一种设计模式&#xff0c;我们最终实现的功能可以通过不同的路径来实现&#xff0c;那么这个路径就可以称作适配器。 例如下面的例子&#xff1a; 那么在c中也有适配器&#xff0c;例如stack、queue、priority_queue&#xff0c;它们并不是使用了什么新的内存…

【python爬虫】利用Python爬取天气数据,并做可视化分析

首先登录网站&#xff0c;查看网页内容及数据格式(使用代码查看内容)&#xff0c;选择两个城市及对应月份&#xff0c;爬取对应天气数据&#xff0c;进行数据预处理(如缺失值处理、数据类型转换、字符串截取等)&#xff0c;数据的初步探索性分析(如描述性统计、数据可视化查看数…

应对猫咪掉毛挑战,希喂、小米热门宠物空气净化器实测功效PK

随着养宠人群的增多&#xff0c;铲屎官们的需求日益增长&#xff0c;市场上出现了很多品牌的宠物空气净化器。然而&#xff0c;产品质量参差不齐&#xff0c;给消费者选择带来不少困难。劣质宠物空气净化器不仅无法有效去除宠物毛发、皮屑、异味及空气中的有害微粒&#xff0c;…

启动虚拟机:另一个程序已锁定文件的一部分,进程无法访问,打不开磁盘xxx或它所依赖的某个快照磁盘

theme: nico 你们好&#xff0c;我是金金金。 场景 启动虚拟机时报错如下 造成error的原因 这是一种虚拟机的保护机制 虚拟机在运行时&#xff0c;为了防止数据被篡改&#xff0c;会将所运行的文件保护起来。 当虚拟机突然崩溃或强制结束导致异常退出&#xff08;我昨天是直接…

【C++】设计模式 — 从零开始认识单例模式

人的一生本来就是一场有来无回的冒险。 --- priest 《残次品》--- 设计模式 — 单例模式 1 设计模式2 单例模式2.1 饿汉模式2.2 懒汉模式 3 总结 1 设计模式 设计模式&#xff08;Design Pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结…

YZ系列工具之YZ05:代码运行中调用“计算器”使用说明

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套一部VBA手册&#xff0c;教程分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的…

语音播报加入预警系统

语音播报加入预警系统 引言 引入语音警报 我们前一章, 已经把jq8900-16p模块, 单独进行了测试, 可以通过发送命令, 让模块播报设定好的声音。那么语音播报&#xff0c; 在预警系统中&#xff0c; 也必不可少&#xff0c; 我们现在有了led灯光警报,如果主人在睡觉, 是不能及时…

redis列表若干记录

2、列表 ziplist ziplist参数 entry结构 entry-data:节点存储的元素prelen&#xff1a;记录前驱节点长度encoding&#xff1a;当前节点编码格式encoding encoding属性 使用多个子节点存储节点元素长度&#xff0c;这种多字节数据存储在计算机内存中或者进行网络传输的时的字节…

排序算法——插入排序

一、插入排序概念 直接插入排序&#xff08;Insertion Sort&#xff09;是一种简单的排序算法&#xff0c;它的工作原理类似于人们手动排序卡片的方式。该算法通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插…

ubuntu、cpolar、api开启映射之路

1.国内cpolar安装 curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash或 cpolar短链接安装方式&#xff1a;(国外使用&#xff09; curl -sL https://git.io/cpolar | sudo bash2.查看版本号&#xff0c;正常显示即为安装成功 cpolar …

HR系统怎么选?2024年10大热门工具评测

本文中介绍的工具有&#xff1a;Moka、名才MCHR、HiHR、华天动力HRM、红海eHR、易路eRoad、宏景HJSOFT、Gusto、Zenefits、BambooHR。 在当今竞争激烈的商业环境中&#xff0c;找到一个适合企业的HR系统可能是一个令人头疼的问题。市面上的HR工具琳琅满目&#xff0c;各有千秋&…

Django 自定义用户 VS 用户资料

Django是一个流行的Web框架&#xff0c;它提供了一套完整的用户认证系统&#xff0c;其中包括内置的User模型用于存储基本的用户信息&#xff0c;如用户名、密码等。然而&#xff0c;如果我们需要更详细的用户资料管理&#xff0c;比如添加更多的字段或者自定义验证规则&#x…

Linux 常见的冷知识集锦

一、前言 本文旨在记录那些常见的Linux概念和名词&#xff0c;但这些又没经常直接使用到&#xff0c;更多在底层运行&#xff0c;见过却又不是特别清楚的碎片知识&#xff0c;以温故知新。 二、知识点和概念说明 2.1、POSIX标准/协议 POSIX&#xff08;Portable Operating S…