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.mzph.cn/pingmian/55167.shtml

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

相关文章

64 注意力机制_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录注意力机制&#xff08;或叫注意力池化&#xff09;[**生成数据集**]平均汇聚非参数注意力汇聚[**带参数注意力汇聚**]批量矩阵乘法定义模型训练 小结练习 注意力机制&#xff08;或叫注意力池化&#xff09; 卷积、全连接、池化层都只考虑…

Mac制作Linux操作系统启动盘

前期准备 一个 Mac 电脑 一个 U 盘&#xff08;8GB 以上&#xff09; 下载好 Linux 系统镜像&#xff08;iso 文件&#xff09; 具体步骤 挂载 U 盘 解挂 U 盘 写系统镜像到 U 盘 完成 一、挂载 U 盘 首先插入 U 盘&#xff0c;打开终端输入下面的命令查看 U 盘是否已经 m…

HarmonyOS NEXT:实现电影列表功能展示界面

时至今日HarmonyOS NEXT早已发布运行了&#xff0c;等其正式推出并大规模商用后&#xff0c;HarmonyOS的历史使命就完成并将退出历史舞台&#xff0c;为用户提供丰富的应用选择。但是Harmony NEXT是在HarmonyOS基础上剔除安卓&#xff08;AOSP&#xff09;后的产品&#xff0c;…

自动驾驶系列—自动驾驶MCU架构全方位解析:从单核到多核的选型指南与应用实例

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

工作笔记【四】

对于这种&#xff0c;样式一样&#xff0c;但是图片和字体颜色不一样&#xff0c;动态渲染。 代码&#xff1a; <template><view class"page"><view class"rows" v-for"item in data"><view class"v0"><v…

基于解压缩模块的JPEG同步重压缩检测论文学习

一、论文基本信息&#xff1a; 论文题目&#xff1a;基于解压缩模块的JPEG同步重压缩检测 作者&#xff1a;王金伟1 &#xff0c;胡冰涛1 &#xff0c;张家伟1 &#xff0c;马 宾2 &#xff0c;罗向阳3 &#xff08;1.南京信息工程大学计算机学院、网络空间安全学院&#xf…

Footprint Growthly Quest 工具:赋能 Telegram 社区实现 Web3 飞速增长

作者&#xff1a;Stella L (stellafootprint.network) 在 Web3 的快节奏世界里&#xff0c;社区互动是关键。而众多 Web3 社区之所以能够蓬勃发展&#xff0c;很大程度上得益于 Telegram 平台。正因如此&#xff0c;Footprint Analytics 精心打造了 Growthly —— 一款专为 Tel…

阿里大模型算法岗面试,上来就手撕代码啊

最近已有不少大厂都在秋招宣讲了&#xff0c;也有一些在 Offer 发放阶段。 节前&#xff0c;我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新手如何入门算法岗、该如何准备面试攻略、面试常考点、大模型技术趋势、算法项目落地经验分享等热门话题进行了…

怎样才能写出好的知识竞赛活动策划方案

好的知识竞赛活动策划方案是抄不会的&#xff0c;尤其是抄一堆烂方案的话&#xff0c;只会让你走偏。首要的是建立策划底层思维&#xff0c;搞清楚如何从策划角度思考问题和解决问题。注意读、思、学&#xff0c;读&#xff1a;大量读策划案例和营销案例&#xff0c;分析总结和…

当贝播放器 1.5.0 畅享原画,支持阿里网盘、杜比视界和8K播放

当贝播放器TV是一款专为智能电视设计的视频播放器&#xff0c;具有强大的解码能力&#xff0c;支持阿里网盘、百度网盘等网盘资源导入。此外&#xff0c;还支持外部设备导入&#xff0c;并能自动匹配电影海报封面、内容介绍和剧照。 大小&#xff1a;47.3M 百度网盘&#xff1…

【ARM】MDK-当选择AC5时每次点击build都会全编译

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决MDK中选择AC5时每次点击build都会全编译 2、 问题场景 在MDK中点击build时&#xff0c;正常会只进行增量编译&#xff0c;但目前每次点击的时候都会全编译。 3、软硬件环境 1 软件版本&#xff1a;Keil MDK 5.…

html+css+js实现dialog对话框

实现效果 HTML部分 <span class"text">点击打开 Dialog</span><!-- 警告框 --><div class"alert"><div class"header"><i>X</i> </div><div class"content">确认关闭</di…

基于php的律所管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

从0开始深度学习(6)——Pytorch动态图机制(前向传播、反向传播)

PyTorch 的动态计算图机制是其核心特性之一&#xff0c;它使得深度学习模型的开发更加灵活和高效。 0 计算图 计算图&#xff08;Computation Graph&#xff09;是一种用于表示数学表达式或程序流程的图形结构&#xff0c;可以将复杂的表达式分解成一系列简单的操作&#xff0…

详解代理模式-【静态代理与JDK动态代理】(非常的斯国一)

目录 静态代理 什么是静态代理: ​ 特点: 例子&#xff1a; JDK动态代理&#xff08;主要讲点&#xff09; 大纲&#xff1a; 1、与静态代码的联系 2、JDK动态代理的主流程 3、Proxy的源码 整体概述&#xff1a; 重要点的翻译 &#xff1a; newProxyInstance源码&am…

深信服2025届全球校招研发笔试-C卷(AK)

前面14个填空题 T1 已知 子数组 定义为原数组中的一个连续子序列。现给定一个正整数数组 arr&#xff0c;请计算该数组内所有可能的奇数长度子数组的数值之和。 输入描述 输入一个正整数数组arr 输出描述 所有可能的奇数长度子数组的和 示例 1 输入 1,4,2,5,3 输出 58 说明 …

使用 Light Chaser 进行大屏数据可视化

引言 在当今数据驱动的世界中&#xff0c;数据可视化变得越来越重要。Light Chaser 是一款基于 React 技术栈的大屏数据可视化设计工具&#xff0c;通过简单的拖拽操作&#xff0c;你可以快速生成漂亮、美观的数据可视化大屏和看板。本文将介绍如何使用 Light Chaser 进行数据…

828华为云征文|部署在线文档应用程序 CodeX Docs

828华为云征文&#xff5c;部署在线文档应用程序 CodeX Docs 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 CodeX Docs3.1 CodeX Docs 介绍3.2 CodeX Docs 部署3.3 CodeX…

RabbitMQ应用

RabbitMQ 共提供了7种⼯作模式, 进⾏消息传递 一、七种模式的概述 1、Simple(简单模式) P:生产者,就是发送消息的程序 C:消费者,就是接收消息的程序 Queue:消息队列,类似⼀个邮箱, 可以缓存消息; ⽣产者向其中投递消息, 消费者从其中取出消息 特点: ⼀个⽣产者P,⼀…

小米2025届软件开发工程师(C/C++/Java)(编程题AK)

选择题好像也是25来个 编程题 T1 题目描述 小明喜欢解决各种数学难题。一天&#xff0c;他遇到了一道有趣的题目:他需要帮助他的朋友们完成一个排序任务。小明得到两个长度为 n 的数组a[]和b[]。他可以在两个数组对应位置进行交换&#xff0c;即选定一个位置 i &#xff0c…