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");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:对达林顿管还不是很清楚

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

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

相关文章

汽车革命下半场AI先锋:广汽为新“智”汽车装配大模型“底盘”

汽车革命的上半场是电动化&#xff0c;下半场是智能化&#xff0c;这是全球汽车产业普遍认同的观点。当前&#xff0c;我国汽车产业已经在电动化上半场取得了显著成效&#xff0c;在下半场智能化的全球战场能否胜出&#xff0c;关键看车企的创新意愿和研发实力。 在2024年9月1…

【Orange Pi 5嵌入式应用编程】-用户空间GPIO控制

用户空间GPIO控制 文章目录 用户空间GPIO控制1、嵌入式Linux的GPIO子系统介绍1.1 sysfs文件访问GPIO1.2 通过字符设备访问GPIO1.3 库与工具2、RK3588的GPIO介绍3、用户空间操作GPIO编程3.1 硬件准备3.2 通过libgpio操作GPIO3.2.1 GPIO输出3.2.3 GPIO输入3.2.3 边沿事件检测(中断…

《Windows PE》3.2.3 NT头-扩展头

■扩展头&#xff08;可选标头仅限映像文件&#xff09; OptionalHeader字段描述了可执行文件的更多细节和布局信息&#xff0c;如图像基址、入口点、数据目录、节表等。它的具体结构取决于文件的机器架构&#xff0c;可以是IMAGE_OPTIONAL_HEADER32&#xff08;32位&#xff…

【论文笔记】Flamingo: a Visual Language Model for Few-Shot Learning

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Flamingo: a Visual Langu…

html空单元格的占位

先上代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title></head><body> <H1>我的WEB页面</H1><table border"2px" bgcolor"#7fffd4&…

【Ubuntu】安装常用软件包-mysql

我的几个服务是部署在docker的同一个网络里&#xff0c;这样相互访问就可以通过docker容器的名字访问&#xff0c;比如容器A访问容器B&#xff0c;就可以http://B:8080/xxx 这样访问&#xff0c;不用关心ip是多少。 所以mysql前面文章给安装到主机里&#xff0c;感觉有点坑自己…

JavaScript 网页设计案例 简单的电商案例 页面切换 数据搜索 动态网页

JavaScript 网页设计案例 简单的电商案例 页面切换 数据搜索 动态网页 1. 案例描述 以下是一个简单的产品展示网页&#xff0c;用户可以通过点击不同的产品类别按钮来查看相应的产品&#xff0c;且在鼠标悬停时显示产品详情。页面还将包含一个搜索框&#xff0c;用户可以输入…

深蕾半导体Astra™ SL1620详细介绍,嵌入式物联网处理器

一&#xff0c;SL1620是什么 Astra™ SL系列是深蕾半导体推出的高度集成的嵌入式物联网处理器SoC&#xff08;System on Chip&#xff09;系列产品&#xff0c;专为多模式消费者、企业和工业物联网工作负载而设计。SL1620是Astra™ SL系列中的一款成本和功耗优化的安全嵌入式So…

解决 Failed to connect to 127.0.0.1 port XXXX: Connection refused问题

查看自己的代理&#xff0c;如果有设置&#xff0c;取消即可。注意https还是http&#xff0c;或者都取消算了 git config --global http.proxy git config --global --unset http.proxygit config --global https.proxy git config --global --unset https.proxy注意如果有人在…

进程的管道

进程之间的通信有两种&#xff0c;无名管道通信和有名管道通信&#xff0c; 为什么有通信呢&#xff0c;可以理解为你有一个同事&#xff0c;你两干一件事从不同的方向&#xff0c;哪一件事你干&#xff0c;哪一件事他干&#xff0c;你俩得知道吧&#xff0c;差不多是这个意思…

AMD硬件分析工具简介

Introduction to profiling tools for AMD hardware — ROCm Blogs **注意:** 本文博客内容此前为[ AMD实验室笔记]博客系列的一部分。 让代码功能正确只是基础&#xff0c;在许多行业中&#xff0c;还要求应用程序及其复杂的软件栈尽可能高效地运行以满足操作需求。这尤为具有…

Linux gadget 模拟触控屏 支持多点触控

通过gadget命令行生成hid设备 下面xxx自己根据需要修改&#xff0c;例如VID,PID&#xff0c;产品名称 const char *INSTALL_GADGET_CMDS[] {"modprobe libcomposite","mkdir /sys/kernel/config/usb_gadget/g1","echo xxx > /sys/kernel/config/…

华为 海思22AP10(SS524)H.265 编解码处理器用户指南

1.1 概述 22AP10 是针对多路高清 / 超高清&#xff08; 1080p/4M/5M/4K &#xff09; DVR 产品应用开发的新一代专 业 SoC 芯片。 22AP10 集成了 ARM Cortex-A7 四核处理器和性能强大的 图像分析工具 推理引擎&#xff0c;支持多种智能算法应用。同时&#xff0c; 2…

智能招聘系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;企业管理&#xff0c;招聘信息管理&#xff0c;应聘信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;招聘信息&#xff0c;我的 开发系统&…

启动服务并登录MySQL9数据库

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) Windows平台下安装与配置MyS…

QSqlDatabase在多线程中的使用

Qt中多线程使用数据库_qt数据库管理类支持多数据库,多线程-CSDN博客 1. 代码&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError>…

Chainlit集成LlamaIndex并使用通义千问实现和数据库交互的网页对话应用(text2sql)

前言 我在之前的几篇文章中写了如何使用Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用&#xff0c;但是发现Langchain的几种和数据库交互的组件都不够让我满意&#xff0c;虽然已经满足了大部分场景的需求&#xff0c;但是问题还是很多&#xff0c;比如…

无人机协同作业中的多网融合技术详解

无人机协同作业中的多网融合技术是一种复杂且高效的技术体系&#xff0c;它旨在通过整合多种通信网络和技术&#xff0c;实现多架无人机之间的无缝协同作业&#xff0c;从而提升任务执行效率、增强系统可靠性和扩展应用场景。以下是对该技术的详细解析&#xff1a; 一、多网融…

【C++】多态练习题(面试常考)

学习之前&#xff0c;建议观看&#xff1a;【C】多态&#xff1a;深度剖析&#xff08;多态、虚函数、抽象类、底层原理&#xff09;_c 多态和虚函数,虚函数的实现原理-CSDN博客https://blog.csdn.net/2301_80555259/article/details/142178677?spm1001.2014.3001.5501 一.概念…

解决 Macos下 Orbstack docker网络问题

两种解决方法&#xff0c;第一种开代理 参考 —— 但是我这一种没成功&#xff0c;第二种方法是换镜像源 { "registry-mirrors": ["http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://mirrors.tencent.com&q…