当前位置: 首页 > backend >正文

嵌入式学习--江科大51单片机day7

我们在听课的过程中,可能对老师讲的有疑问,或者有些自己的理解,我们可以去问豆包,包括在写博客的时候我也是,不断去问豆包保证思考的正确性。(有人感觉豆包很low啊,其实这些基础性的东西豆包一般是不会出错的)

学习内容:DS18B20

DS18B20

DS18B20为温度传感器,采用单总线通信接口,可寄生供电(DQ口数据传输的同时供电)

与I2C类似,单总线的时序结构是重要的学习内容

因为没有时钟线,所以单总线要求的是较为准确的时间

(我贴的代码是在老师的源码的基础上,对照图片进行了更加详细的注释)

#include <REGX52.H>//引脚定义
sbit OneWire_DQ=P3^7;/*** @brief  单总线初始化* @param  无* @retval 从机响应位,0为响应,1为未响应*/
unsigned char OneWire_Init(void)
{unsigned char i;unsigned char AckBit;//拉低总线OneWire_DQ=1;OneWire_DQ=0;i = 247;while (--i);		//Delay 500us//释放总线OneWire_DQ=1;//等待并接收从机响应i = 32;while (--i);			//Delay 70usAckBit=OneWire_DQ;//度过从机剩余响应时间i = 247;while (--i);		//Delay 500usreturn AckBit;
}/*** @brief  单总线发送一位* @param  Bit 要发送的位* @retval 无*/
void OneWire_SendBit(unsigned char Bit)
{unsigned char i;//拉低总线OneWire_DQ=0;//这里按照图片可能15us比较合适吧//但图片那里是有阴影的,10us最后也正确//总体的意思是跳过15us,若是发送1那么就已经释放总线//若是发送0就还是处于拉蒂状态太i = 4;while (--i);			//Delay 10usOneWire_DQ=Bit;//满足时间片大于60usi = 24;while (--i);			//Delay 50us//释放总线OneWire_DQ=1;
}/*** @brief  单总线接收一位* @param  无* @retval 读取的位*/
unsigned char OneWire_ReceiveBit(void)
{unsigned char i;unsigned char Bit;//拉低总线OneWire_DQ=0;i = 2;while (--i);			//Delay 5us//释放总线OneWire_DQ=1;//贴近15us末尾i = 2;while (--i);			//Delay 5us//读取总线电平Bit=OneWire_DQ;//满足时间片60usi = 24;while (--i);			//Delay 50usreturn Bit;
}/*** @brief  单总线发送一个字节* @param  Byte 要发送的字节* @retval 无*/
void OneWire_SendByte(unsigned char Byte)
{unsigned char i;for(i=0;i<8;i++){OneWire_SendBit(Byte&(0x01<<i));}
}/*** @brief  单总线接收一个字节* @param  无* @retval 接收的一个字节*/
unsigned char OneWire_ReceiveByte(void)
{unsigned char i;unsigned char Byte=0x00;for(i=0;i<8;i++){if(OneWire_ReceiveBit()){Byte|=(0x01<<i);}}return Byte;
}

这里我们只需要学习部分数据帧(由于温度存储格式,温度读取要进行数据处理)

#include <REGX52.H>
#include "OneWire.h"//DS18B20指令
#define DS18B20_SKIP_ROM			0xCC
#define DS18B20_CONVERT_T			0x44
#define DS18B20_READ_SCRATCHPAD 	0xBE/*** @brief  DS18B20开始温度变换* @param  无* @retval 无*/
void DS18B20_ConvertT(void)
{OneWire_Init();OneWire_SendByte(DS18B20_SKIP_ROM);OneWire_SendByte(DS18B20_CONVERT_T);
}/*** @brief  DS18B20读取温度* @param  无* @retval 温度数值*/
float DS18B20_ReadT(void)
{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;return T;
}

温度读取

#include <REGX52.H>
#include "LCD1602.h"
#include "DS18B20.h"
#include "Delay.h"float T;void main()
{DS18B20_ConvertT();		//上电先转换一次温度,防止第一次读数据错误Delay(1000);			//等待转换完成LCD_Init();LCD_ShowString(1,1,"Temperature:");while(1){DS18B20_ConvertT();	//转换温度T=DS18B20_ReadT();	//读取温度if(T<0)				//如果温度小于0{LCD_ShowChar(2,1,'-');	//显示负号T=-T;			//将温度变为正数}else				//如果温度大于等于0{LCD_ShowChar(2,1,'+');	//显示正号}LCD_ShowNum(2,2,T,3);		//显示温度整数部分LCD_ShowChar(2,5,'.');		//显示小数点LCD_ShowNum(2,6,(unsigned long)(T*10000)%10000,4);//显示温度小数部分}
}

温度报警

后续会给代码添上led闪烁和蜂鸣器

#include <REGX52.H>
#include "LCD1602.h"
#include "DS18B20.h"
#include "Delay.h"
#include "AT24C02.h"
#include "Key.h"
#include "Timer0.h"float T,TShow;
char TLow,THigh;
unsigned char KeyNum;void main()
{DS18B20_ConvertT();		//上电先转换一次温度,防止第一次读数据错误Delay(1000);			//等待转换完成THigh=AT24C02_ReadByte(0);	//读取温度阈值数据TLow=AT24C02_ReadByte(1);if(THigh>125 || TLow<-55 || THigh<=TLow){THigh=20;			//如果阈值非法,则设为默认值TLow=15;}LCD_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);Timer0_Init();while(1){KeyNum=Key();/*温度读取及显示*/DS18B20_ConvertT();	//转换温度T=DS18B20_ReadT();	//读取温度if(T<0)				//如果温度小于0{LCD_ShowChar(1,3,'-');	//显示负号TShow=-T;		//将温度变为正数}else				//如果温度大于等于0{LCD_ShowChar(1,3,'+');	//显示正号TShow=T;}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)	//K1按键,THigh自增{THigh++;if(THigh>125){THigh=125;}}if(KeyNum==2)	//K2按键,THigh自减{THigh--;if(THigh<=TLow){THigh++;}}if(KeyNum==3)	//K3按键,TLow自增{TLow++;if(TLow>=THigh){TLow--;}}if(KeyNum==4)	//K4按键,TLow自减{TLow--;if(TLow<-55){TLow=-55;}}LCD_ShowSignedNum(2,4,THigh,3);	//显示阈值数据LCD_ShowSignedNum(2,12,TLow,3);AT24C02_WriteByte(0,THigh);		//写入到At24C02中保存Delay(5);AT24C02_WriteByte(1,TLow);Delay(5);}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 T0Count;TL0 = 0x18;		//设置定时初值TH0 = 0xFC;		//设置定时初值T0Count++;if(T0Count>=20){T0Count=0;Key_Loop();	//每20ms调用一次按键驱动函数}
}

今日语录:走在一条不想回头的路上....

http://www.xdnf.cn/news/6428.html

相关文章:

  • Metagloves Pro+Manus Core:一套组合拳打通虚拟制作与现实工业的任督二脉
  • 题海拾贝:P4017 最大食物链计数
  • 399. 除法求值
  • 自然资源和空间数据应用平台
  • 深度学习框架---TensorFlow概览
  • 【vue】【环境配置】项目无法npm run serve,显示node版本过低
  • 【2025最新】VSCode Cline插件配置教程:免费使用Claude 3.7提升编程效率
  • Unity光照笔记
  • 解决Mawell1.29.2启动SQLException: You have an error in your SQL syntax问题
  • Java EE初阶——线程安全
  • 死锁(Deadlock)知识点详解
  • 青少年气胸术后护理要点清单
  • Cursor安全漏洞事件深度解析:当AI编程工具成为供应链攻击的新战场
  • WebGL 3着色器和GLSL
  • Elasticsearch性能调优全攻略:从日志分析到集群优化
  • C++多态实现的必要条件剖析
  • 架构进阶:企业流程框架设计思路【附全文阅读】
  • 微信小程序van-dialog确认验证失败时阻止对话框的关闭
  • Spring 模拟转账开发实战
  • 什么是红海战略?了解红海战略的竞争目标
  • (面试)Handler消息处理机制原理
  • 基于Deeplearning4j的多源数据融合预测模型实现:从设计到落地全解析
  • 【frp XTCP 穿透配置教程
  • 关于AI人工智能的知识图谱简介
  • 2025认证杯数学建模第二阶段A题小行星轨迹预测思路+模型+代码
  • Framebuffer显示bmp图片
  • 【实证分析】MDA文本相似度分析(2008-2023年)
  • 基于redis实现分布式锁方案实战
  • Linux:理解文件系统
  • 网络损伤仪功能介绍与应用场景剖析