51单片机学习第六课---B站UP主江协科技
DS18B20
1、基本知识讲解









 
 



 2、DS18B20读取温度值
2、DS18B20读取温度值
 
main.c
#include<regx52.h>
#include"delay.h"
#include"LCD1602.h"
#include"key.h"
#include"DS18B20.h"float T;
void main ()
{LCD_Init();LCD_ShowString(1,1,"temp");while(1){DS18B20_convert();T=DS18B20_read();if(T<0){LCD_ShowChar(2,1,'-');	//显示负号T=-T;}else{LCD_ShowChar(2,1,'+');	 //显示正号T=T;}LCD_ShowNum(2,2,T,3);	 //显示正整数  ,精度是3,-55~125LCD_ShowChar(2,5,'.');		//显示小数点LCD_ShowNum(2,6,(unsigned long)(T*10000)%10000,4);//显示小数后面的数字,精度是4位 ,0.0623}}onewire.c
#include<REGX52.h>
sbit onewire_DQ=P3^7;
unsigned char onewire_init()
{ 
unsigned char ackbit;
unsigned char i;onewire_DQ=1;onewire_DQ=0;i = 247;while (--i);		//延时500usonewire_DQ=1;i = 32;			//延时70uswhile (--i);ackbit=onewire_DQ;i = 247;			//延时500us,这里从机拉低60-240us会自动释放总线while (--i);return ackbit;
}
void  onewire_sendbit(unsigned char Bit)
{unsigned char i;onewire_DQ=0;i = 4;while (--i);//延时10usonewire_DQ=Bit;	//如果bit=0,则DQ继续拉低50us,加上前面10us,刚好满足60us.如果bit=1,则DQ相当10us后总线释放,接着继续释放50usi = 24;while (--i);//延时50usonewire_DQ=1;}
unsigned char onewire_receivebit()
{unsigned char i;unsigned char Bit;onewire_DQ=0;i = 2;while (--i);//主机拉低总线5usonewire_DQ=1;i = 2;while (--i);//主机释放总线5usBit=onewire_DQ;//DS18B20将会发送0或1,此时主机读取数据i = 24;while (--i);//延时50usreturn Bit;
}
void  onewire_sendbyte(unsigned char byte)
{
unsigned char i;
for(i=0;i<8;i++)
{onewire_sendbit(byte&(0x01<<i));	//取一位用与
}}
unsigned char onewire_receivebyte()
{
unsigned char i;
unsigned char byte=0x00;
for(i=0;i<8;i++)
{if(onewire_receivebit()){byte=byte|(0x01<<i);	   //取整体用或}
}
return byte;
}DS18B20.C
#include<regx52.h>
#include"onewire.h"#define  DS18B20_SKIP_ROM       0xCC  
#define  DS18B20_CONVERT_T       0x44	
#define  DS18B20_READ_SCRATCHPAD     0xBEvoid DS18B20_convert()	   
{onewire_init() ;	 //初始化onewire_sendbyte(DS18B20_SKIP_ROM); //跳过ROMonewire_sendbyte(DS18B20_CONVERT_T);	//温度转换
}float DS18B20_read()		
{  unsigned char TLSB,TMSB;int temp;float T;onewire_init() ;onewire_sendbyte(DS18B20_SKIP_ROM);onewire_sendbyte(DS18B20_READ_SCRATCHPAD);//温度读取TLSB=onewire_receivebyte();	 //读取低八位TMSB=onewire_receivebyte();	//读取高八位temp=(TMSB<<8)|TLSB;			//把低八位和高八位整合成一个数T=temp/16.0;					  //由于存储小数的缘故,最低位不是从2的0次方开始,而是2的-4方开始,所以读取的值要除以16return T;
}3、DS18B20温度告警器
按键K1实现对温度上限值的加加,K2实现对温度上限值的减减,按键K3实现对温度下限值的加加,K4实现对温度下限值的减减,运用at24c02对温度上限值和下限值进行存储。超过上限值LCD1602显示ov:h,低于下限值LCD1602显示ov:l。
main.c
#include<regx52.h>
#include"delay.h"
#include"LCD1602.h"
#include"key.h"
#include"DS18B20.h"
#include"at24c02.h"
#include"timer0.h"
char Tlow,Thigh; //char类型表示数据位-127~128,满足DS18B20的测温范围-55~125
float  T,Tshow;
unsigned char keynum;
void main ()
{  DS18B20_convert();Delay(1000);Thigh=at24c02_readbyte(0); //一开始就读取AT24C02里的数据,这个时候还没有写入Tlow=at24c02_readbyte(1);if(Thigh>125||Tlow<-55||Thigh<=Tlow){ Thigh=25;Tlow=5;}	//读出的数据可能会超出范围,所以当超出范围时,赋初值LCD_Init();Timer0_Init();LCD_ShowString(1,1,"T:");LCD_ShowString(2,1,"TH:");LCD_ShowString(2,9,"TL:");LCD_ShowSignedNum(2,4,Thigh,3);LCD_ShowSignedNum(2,12,Tlow,3);while(1){keynum=key();DS18B20_convert();T=DS18B20_read();if(T<0) {LCD_ShowChar(1,3,'-');Tshow=-T;}//为什么要定一个Tshow,主要是当T为负数时,要转为正数,这样Tshow就始终是正数if(T>0) {LCD_ShowChar(1,3,'+');Tshow=T;} //因为shownum只能显示正整数,而且要显示小数部分,转成正整数方便转换LCD_ShowNum(1,4,Tshow,3);LCD_ShowChar(1,7,'.');	 LCD_ShowNum(1,8,(unsigned long)(Tshow*100)%100,2);if(keynum){if(keynum==1){Thigh++;if(Thigh>125){Thigh=125;}	  //温度上限值不能超过DS18B20的上限}if(keynum==2){Thigh--;if(Thigh<=Tlow)	//温度上限值减减不能减到小于温度下限值{Thigh++;}}if(keynum==3){Tlow++;if(Tlow>=Thigh)  //温度下限值加加不能加到大于温度上限值{Tlow--;}}if(keynum==4){Tlow--;if(Tlow<-55){Tlow=-55;}	   //温度下限值不能超过DS18B20的下限}at24c02_writebyte(0,Thigh);   //记住写入后要延时5msDelay(5);at24c02_writebyte(1,Tlow);Delay(5);LCD_ShowSignedNum(2,4,Thigh,3);LCD_ShowSignedNum(2,12,Tlow,3);
}if(T>Thigh){LCD_ShowString(1,13,"ov:H");}	//实际温度超过设定上限值告警else if(T<Tlow){LCD_ShowString(1,13,"ov:L");}	  //实际温度低于设定下限值告警else{LCD_ShowString(1,13,"    ");}}}void Timer0_Routine()        interrupt 1
{static unsigned  int count;	TL0 = 0x18;				TH0 = 0xFC;count++;
if(count>=20)	
{count=0;key_loop();}}onewire.c
这里增加一步关闭中断,再打开中断
#include <REGX52.H>
sbit onewire_DQ=P3^7;
unsigned char onewire_init()
{ 
unsigned char ackbit;
unsigned char i;onewire_DQ=1;onewire_DQ=0;EA=0;//单总线计时时不能进入中断,因为延时是us级别,中断之后再返回会计时不准,所以这里要关掉总中断,计时完后再打开。i = 247;while (--i);		//延时500usonewire_DQ=1;i = 32;			//延时70uswhile (--i);ackbit=onewire_DQ;i = 247;			//延时500us,这里从机拉低60-240us会自动释放总线while (--i);EA=1;return ackbit;
}
void  onewire_sendbit(unsigned char Bit)
{unsigned char i;onewire_DQ=0;EA=0;i = 4;while (--i);//延时10usonewire_DQ=Bit;	//如果bit=0,则DQ继续拉低50us,加上前面10us,刚好满足60us.如果bit=1,则DQ相当10us后总线释放,接着继续释放50usi = 24;while (--i);//延时50usEA=1;onewire_DQ=1;}
unsigned char onewire_receivebit()
{unsigned char i;unsigned char Bit;onewire_DQ=0;EA=0;i = 2;while (--i);//主机拉低总线5usonewire_DQ=1;i = 2;while (--i);//主机释放总线5usBit=onewire_DQ;//DS18B20将会发送0或1,此时主机读取数据i = 24;while (--i);//延时50usEA=1;return Bit;
}
void  onewire_sendbyte(unsigned char byte)
{
unsigned char i;
for(i=0;i<8;i++)
{onewire_sendbit(byte&(0x01<<i));	//取一位用与
}}
unsigned char onewire_receivebyte()
{
unsigned char i;
unsigned char byte=0x00;
for(i=0;i<8;i++)
{if(onewire_receivebit()){byte=byte|(0x01<<i);	   //取整体用或}
}
return byte;
}LCD1602
1、基本知识讲解








2、字符、字符串 
2、LCD1602.c代码
#include<regx52.h>
sbit lcd_RS=P2^6;
sbit lcd_RW=P2^5;
sbit lcd_EN=P2^7;
#define port  P0
void LCD_Delay()	//@12.000MHz  1ms  //延时函数
{unsigned char data i, j;i = 2;j = 239;do{while (--j);} while (--i);
}void lcd_write_command(unsigned char command)	//写命令
{lcd_RS=0;lcd_RW=0;port=command;lcd_EN=1;LCD_Delay();//因为这里E脉冲宽度时间是us级别,而单片机执行一次命令是us级别,所以这里检测不到,所以加延时函数lcd_EN=0;LCD_Delay();}
void lcd_write_Data(unsigned char Data)	 //写数据
{lcd_RS=1;lcd_RW=0;port=Data;lcd_EN=1;LCD_Delay();//因为这里E脉冲宽度时间是us级别,而单片机执行一次命令是us级别,所以这里检测不到,所以加延时函数lcd_EN=0;LCD_Delay();}void lcd_init()		  //初始化
{lcd_write_command(0x38);lcd_write_command(0x0C);lcd_write_command(0x06);lcd_write_command(0x01);
}void LCD_setcursor(unsigned char line,unsigned char column)	  //定义光标位置,在第几行第几列
{if(line==1){lcd_write_command(0x80|column-1);}else{lcd_write_command(0x80|(column-1)+0x40);}
}void LCD_ShowChar(unsigned char line,unsigned char column,unsigned char Char) //显示一个字符
{LCD_setcursor(line,column);lcd_write_Data(Char);
}
void LCD_ShowString(unsigned char line,unsigned char column,unsigned char *String)	//显示字符串
{unsigned char i;LCD_setcursor(line,column);for(i=0;String[i]!='\0';i++)
{
lcd_write_Data(String[i]);
}}
unsigned int pow(x,y)	   //定义一个幂函数	 例如x=6,y=4,则result=1*6*6*6*6=6^4
{unsigned char result=1;unsigned int i;for(i=0;i<y;i++){result*=x;}return result;
}
void LCD_ShowNum(unsigned char line,unsigned char column,unsigned int num,unsigned char length)	//显示十进制数字
{unsigned char i;LCD_setcursor(line,column);for(i=length;i>0;i--){lcd_write_Data(0x30+num/(pow(10,i-1))%10);}}
void LCD_ShowsignNum(unsigned char line,unsigned char column, int num,unsigned char length)//显示有符号十进制数字
{unsigned char i;unsigned int num1;LCD_setcursor(line,column);if(num>=0){lcd_write_Data('+');num1=num;}else{lcd_write_Data('-');num1=-num;//有符号int的负数最小值为-32768,正数最大值为32767,取反会超出范围,所以定义一个无符号int   num1}for(i=length;i>0;i--){lcd_write_Data(0x30+num1/(pow(10,i-1))%10);
}
}
void LCD_ShowHexNum(unsigned char line,unsigned char column, unsigned int num,unsigned char length)	 //显示十六进制数
{unsigned char i;unsigned char SingleNum;LCD_setcursor(line,column);for(i=length;i>0;i--){SingleNum=num/(pow(16,i-1))%16;if(SingleNum<10){lcd_write_Data(0x30+SingleNum); }else{{lcd_write_Data(0x41+SingleNum-10); }}}}
void LCD_ShowBinNum(unsigned char line,unsigned char column, unsigned int num,unsigned char length)	//显示二进制数
{unsigned char i;LCD_setcursor(line,column);for(i=length;i>0;i--){lcd_write_Data(0x30+num/(pow(2,i-1))%2);}}main.c
#include<regx52.h>
#include"LCD1602.h"
#include"delay.h"
void main ()
{lcd_init();LCD_ShowChar(2,4,'A');
//   LCD_ShowString(1,3,"hello");LCD_ShowNum(2,6,66,2);LCD_ShowsignNum(2,10,-77,2);
//   LCD_ShowHexNum(1,8,0x55,2);LCD_ShowBinNum(1,1, 0x55,8);LCD_ShowString(1,16,"welcome to my home!");
while(1)
{lcd_write_command(0x1c);	//流动字幕,移屏Delay(500);		
}}直流电机
1、基本知识讲解

 


2、LED呼吸灯
main.c
#include<regx52.h>sbit LED=P2^0;void Delay(unsigned int ms)
{while(ms--);}
void main ()
{while(1)
{
unsigned char i,t;
for(i=100;i>0;i--){for(t=0;t<20;t++){	LED=0;Delay(i);LED=1;Delay(100-i);}}
for(i=0;i<100;i++){for(t=0;t<20;t++){	LED=0;Delay(i);LED=1;Delay(100-i);}}}
}3、直流电机调速
按K1键实现电机的调速,并在数码管上显示档数。
main.c
#include<regx52.h>
#include"key.h"
#include"nixie.h"
#include"Timer0.h"
sbit motor=P1^0;
unsigned char counter,compare,keynum,speed;void main ()
{Timer0_Init();while(1){keynum=key();if(keynum==1){speed++;speed%=4;if(speed==0){ compare=0;}if(speed==1){ compare=5;}if(speed==2){ compare=50;}if(speed==3){ compare=100;}}nixie (0,speed);}
}void Timer0_Routine()        interrupt 1
{TL0 = 0x9C;				TH0 = 0xFF;counter++;counter%=100;if(counter<compare){motor=1;}else{motor=0;}}ps:对达林顿管还不是很清楚
相关文章:
 
51单片机学习第六课---B站UP主江协科技
DS18B20 1、基本知识讲解 2、DS18B20读取温度值 main.c #include<regx52.h> #include"delay.h" #include"LCD1602.h" #include"key.h" #include"DS18B20.h"float T; void main () {LCD_Init();LCD_ShowString(1,1,"temp…...
 
sadTalker本地编译
SadTalker一款开源的可生成逼真的人像动画的工具。它利用深度学习技术,根据输入的图像和音频,生成具有生动表情和动作的视频。用户可以通过上传照片或使用预设的模型,轻松创建个性化的动画内容. 以上是官网的图, 下边是本地部署生成的,效果差…...
强化学习核心概念与公式总结
强化学习核心概念与公式总结 1. 核心概念 1.1 智能体(Agent)和环境(Environment) 智能体:学习和做决策的实体环境:智能体交互的外部系统1.2 状态(State) 描述环境在特定时刻的情况1.3 动作(Action) 智能体可以执行的操作1.4 奖励(Reward) 环境对智能体动作的即时反馈1.5 策…...
 
基础算法--双指针【概念+图解+题解+解释】
更多精彩内容..... 🎉❤️播主の主页✨😘 Stark、-CSDN博客 本文所在专栏: 数据结构与算法_Stark、的博客-CSDN博客 其它专栏: 学习专栏C语言_Stark、的博客-CSDN博客 项目实战C系列_Stark、的博客-CSDN博客 座右铭&a…...
 
国产化系统/鸿蒙开发足浴店收银源码-收缩左侧———未来之窗行业应用跨平台架构
一、左侧展开后 二、代码 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head><title></title><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><style t…...
 
如何从硬盘恢复丢失/删除的视频
您是否想知道是否可以恢复已删除的视频? 幸运的是,您可以使用奇客数据恢复从硬盘驱动器、SD 卡和 USB 闪存驱动器恢复已删除的视频文件。 你有没有遇到过这样的情况:当你随机删除文件以释放空间时,你不小心按下了一些重要视频的…...
《Effective C++》第三版——设计与声明(1)
参考资料: 《Effective C》第三版 注意:《Effective C》不涉及任何 C11 的内容,因此其中的部分准则可能在 C11 出现后有更好的实现方式。 条款 18:让接口容易被正确使用,不易被误用 好的接口很容易被正确使用&…...
 
数值计算的程序设计问题举例
### 数值计算的程序设计问题 #### 1. 结构静力分析计算 **涉及领域**:工程力学、建筑工程 **主要问题**:线性代数方程组(Linear Algebraic Equations) **解释说明**: 在结构静力分析中,我们需要解决复杂的…...
 
Java之方法的使用
修饰符 返回值 方法名称(形式参数){ } 当无参数的时候形式参数中什么都不写。 列如求两个数相加 修饰符可有可无。 方法重载: 1.方法名相同 2.参数列表不同 3。返回值不影响重载...
 
sudo 命令:掌握系统权限控制,实现安全高效管理
一、命令简介 sudo 命令允许系统管理员授权普通用户执行特定命令,并以管理员身份运行这些命令,通常需要输入用户自己的密码。  sudo 全称是"substitute user do",意为“替用户做”,也就是“以另一个用户的身…...
 
AndroidStudio导入so文件
点击app 右键依次选择New-Floder-JNI Floder 创建jni目录 将需要的so文件拷贝到jni目录 在app目录下,build.gradle文件的android{}中添加: sourceSets {main{jniLibs.srcDirs [src/main/jni]}}点击一下Sync Project with Gradle Files 然后编译生成AP…...
Kuebernetes 群集基于 Docker 部署
Kuebernetes 群集基于 Docker 部署 实验报告资源列表基础环境一、准备 Docker1、安装 Docker 二、安装 Kubeadm 工具1、配置 yum 源2、安装 Kubeadm 工具 三、初始化 Master 节点1、配置 Master 节点2、常见故障 四、Node 节点加入集群五、部署网络插件(CNI…...
 
追随 HarmonyOS NEXT,Solon v3.0 将在10月8日发布
Solon (开放原子开源基金会,孵化项目)原计划10月1日发布 v3.0 正式版。看到 HarmonyOS NEXT 将在 10月8日启用公测,现改为10月8日发布以示庆贺。另外,Solon 将在2025年启动“仓颉”版开发(届时,…...
服装时尚与动漫游戏的跨界联动:创新运营与策划策略研究
摘要:本论文聚焦于服装时尚与动漫游戏的跨界联动现象,深入探讨其在运营和策划方向的策略与实践。通过对相关理论的梳理和实际案例的分析,阐述了跨界联动的背景、意义、模式以及面临的挑战。研究发现,成功的跨界联动能够实现品牌价…...
 
Redis中String类型的常用命令(append,getrenge,setrange等命令)
Redis----String命令 前言.常见的String存储类型. 常见命令1. set 命令2. get 命令3. mget命令与mset命令4. setnx命令5. setex与psetex命令6. incr与incrby与incrbyfloat命令7. decr与decrby命令8. append命令9. getrange和setrange命令10. strlen命令. 前言. 常见的String存…...
 
深度拆解:如何在Facebook上做跨境电商?
国内社交媒体正在逐渐兴盛,海外也不例外。在数字营销的新时代,Facebook已成为跨境电商不可或缺的平台之一。通过Facebook的巨大流量,卖家可以更好的触及潜在消费者,以实现销售增长。本文就深度拆解一下,卖家如何利用Fb…...
为啥数据需转换成tensor才能参与后续建模训练
将数据转换为Tensor(张量)格式用于深度学习和机器学习模型训练,主要是出于以下几个关键原因: 数值计算的效率:Tensor(由PyTorch、TensorFlow等库提供)是在GPU上执行高效的数值运算的数据结构。相…...
 
leetcode:380. O(1) 时间插入、删除和获取随机元素
实现RandomizedSet 类: RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。bool remove(int val) 当元素 val 存在时࿰…...
 
Linux集群部署RabbitMQ
目录 一、准备三台虚拟机,配置相同 1、所有主机都需要hosts文件解析 2、所有主机安装erLang和rabbitmq 3、修改配置文件 4、导入rabbitmq 的管理界面 5、查看节点状态 6、设置erlang运行节点 7、rabitmq2和rabbitmq3重启服务 8、查看各个节点状态 二、添加…...
01DSP学习-了解DSP外设-以逆变器控制为例
(由于是回忆自己简单的DSP学习过程,所以博客看起来有些没有章法,请见谅~) 上一篇博客介绍了学习DSP需要的软件和硬件准备,以及一个DSP的工程包含了哪些东西。我的学习方法是目的导向,即我需要用什么我就学什么,并没有…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
 
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
 
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
 
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
 
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
 
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
