单片机温度检测报警程序(ds18b20)

发布者:会飞的笨鱼最新更新时间:2017-02-06 来源: eefocus关键字:单片机  温度检测  报警程序  ds18b20 手机看文章 扫描二维码
随时随地手机看文章

程序采用数字温度采集芯片 ds18b20 获取温度 分辨率为12位 可以由此程序获的更低分辨率温度

ds18b20 只有三个i/o接口 其中两个为电源引脚 一个为数据总线

只需要一条口线通信 简化了分布式温度传感应用 无需外部元件 可用数据总线供电

电压范围为3.0 V至5.5 V 无需备用电源 测量温度范围为-55 ° C至+125 ℃

 

ds18b20 相关介绍:ds18b20 百度百科

 

Proteus 仿真:

温度报警Proteus 仿真

 

Code:

	#include 
	#include 
	#define uchar unsigned  char     // 宏定义uchar 为无符号字符
	#define uint  unsigned  int  	  


	sbit 	DQ=P2^3;
	sbit    alarm =P3^4;              //温度告警标志位
    sbit    test = P1^0;

	unsigned long 	temp;			  //温度值
	uchar 	tempH,tempL,tempSign;	 //ds18b20 读取的温度高位  和低8位 ,最高上限温度和最低下限温度,温度符号

    signed long   setMax=10;   
	signed long   setMin=-10;
	float   precision=0.0625;		  //温度精度(默认12位)
	uchar	seg[8]={0};               // eg. -100.0625  

	// 延时函数
	void delay(uint t)					//最大65ms	2^16
	{
		/*TMOD = 0x01; 					//启用T0 计时器 工作方式1  
		TH0  = (65536 - t )/256;   
		TL0  = (65536 - t )%256;
		EA   = 0;						//禁止中断
		TR0  = 1; 						//开始T0计数
		while( TF0 == 0); 
		TF0  = 0; 						// 清除T0 溢出标志位
		TR0  = 0; 						//关闭T0计数*/   
		while(t--);
	}


    // ds18b20 初始化函数
	uchar  init(void)
	{
		uchar feedback;

		DQ = 0 ;
		delay(100);
		DQ = 1;

		/*while(DQ);							//用于获取反馈信号,返回0为成功,返回1为初始化失败
		feedback = DQ;*/
									
		delay(25);

		//return feedback;  		 		   //返回0复位成功,返回1复位失败
	
	}


	// 写函数

	void  write(uchar var)				       //先输出低位,再输出高位
	{
		uchar i;
		for(i=8;i>0;i--)
		{
		 	DQ = 0;
			DQ = var&0x01;					    // 获取最后一位数据写入数据线
			delay(5);
			//(DQ == 1)? delay(10):delay(70);     //延时保证ds18b20 采样。写入为 1 15us 内需释放数据线;写入为 0 至少延时 60us; 
			DQ = 1;
			var >>= 1;  						//右移一位		
		}
		//delay(5);
	}

	// 读函数
	uchar read( void )
	{										   //先读取低位,再读取高位
		uchar feedback = 0;
		uchar  i;
		for(i=8;i>0;i--)
		{	
			
			DQ = 0;				   		
			feedback >>= 1;			 			// 右移
			DQ = 1;								// 数据线拉低15us内 释放数据线
			//delay(1);
			if(DQ){ feedback |= 0x80;}			//在feedback 在高位写入1 等待右移处理
			delay(5);
		}
	
		return feedback;
	}


	// 配置ds18b20 参数说明:(最高温度,最低温度)  
	//暂不可用 
	void setConfig(char th,char tl)
	{
	   
	   uchar precision;

	   init();
	   write(0xcc);
	   write(0x4e);
	   write(th); //默认最高温度为+125
	   write(tl);//默认最低温度为-55	 
	   
	}


	// 温度超限报警处理
	void  warning()
	{
		uchar maxSign=0,minSign=0;	   //最高温度和最低温度符号

		if(setMax > 0)
		{
			 maxSign = 1;
		}
		if(setMin > 0)
		{ 
			minSign = 1;
		}

 		if( temp < labs(setMin)*10000  && tempSign <= minSign )		 //小于下限温度
		{  
			alarm=0; 
			delay(100);
			alarm=1;
			delay(100);
		}else{
			alarm =0; 
		} 

		if( temp > setMax*10000  && tempSign >=maxSign )		  //大于上限温度
		{  
			alarm=0; 
			delay(100);
			alarm=1;
			delay(100);

		}else{
			alarm =0; 
		}




	}

	// 温度显示处理,转换 tampH 和 tempL ,写入数组 seg[8], 得出十进制 温度 temp
	void  convert()
	{
		uint   tempC;	    		//补码温度
		uchar  seg7;			//温度符号位

		tempC  = tempH*256.0 + tempL;  
		
		//tempC=tempH<<8;
	 	//tempC|=tempL;


		if(tempC > 0x0800)
		{
			seg7 = 0x40;			//温度为负温度
			tempSign = 0;
			temp = (~tempC + 1);		// 补码求原码,取反加一
			temp=temp*precision;    
			
			 
		}else{
			tempSign = 1;
		 	seg7 = 0x00; 			// 温度为正
			temp = tempC ;
			temp=temp*precision*10000; 	//放大10000倍,用于取余获取各位数值		
		} 

	    //temp = 1234567;
		seg[7] = seg7;
		seg[6] = temp/1000000;
		seg[5] = temp%1000000/100000;
		seg[4] = temp%1000000%100000/10000;
		seg[3] = temp%1000000%100000%10000/1000;
		seg[2] = temp%1000000%100000%10000%1000/100;
		seg[1] = temp%1000000%100000%10000%1000%100/10;
		seg[0] = temp%1000000%100000%10000%1000%100%10;
	}



	//数码管动态显示 ,读取数组seg[8]
	void ledShow()
	{

		uchar i=0,m,led;

		uchar tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};              //共阴数码管 0-9 
																							
		uchar tabPoint[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};			//共阴数码管 0-9 带小数点
		
		do{
			m=seg[i];

			if( i == 4 )				   //数码管第四位包含小数点		 单片机开发板 数码管和proteus 仿真不同
			{ 
				led = tabPoint[m];
			}else if( i==7 ){	  			//符号位跳过译码
				led = seg[7]; 
			}else{
				led = tab[m]; 
			}  


			P2 = i ;				       //送位码  单片机开发板 数码管和proteus 仿真不同
			P0 = led;					   //送段码

			delay(100);
				  
			i++;
			
			warning();
		}while(i<8);  

	}
    

	//从ds18b20 获取温度,获取 tempH 和 tempL
	void getTemp()
	{

		init();
		write(0xCC);  				//跳过rom搜索 
		write(0x44);  				//启动温度转换
		delay(100);				//温度转换最多750ms 

   		init();
		write(0xCC);
		write(0xBE);        		//读出ds18b20 内部RAM 9直接内容
		delay(100);
		tempL = read();     		//读出温度低字节
		tempH = read(); 			//读出温度高字节
		
		//tempMax = read();			//读取高温触发器
		//tempMin = read();			//读取低温触发器
	}
  

	void main()
	{
		while(1){
		getTemp();
		convert();
		ledShow(); 
		
		}
	}


关键字:单片机  温度检测  报警程序  ds18b20 引用地址:单片机温度检测报警程序(ds18b20)

上一篇:单片机红外接收软件解码
下一篇:单片机课设:六路智能抢答器

推荐阅读最新更新时间:2024-03-16 15:32

AVR单片机驱动CH451实例程序_C语言
1) CH451简介 CH451可用于LED数码管显示驱动、键盘扫描控制、μP监控电路等领域。芯片封装包括双列直插DIP28、SOP28以及DIP24S封装。其内置RC振荡电路,可以直接动态驱动8位数码管或者64位LED,具有BCD译码或不译码功能,可实现数据的左移、右移、左循环、右循环、各数字独立闪烁等控制功能。CH451内置大电流驱动级,段电流不小于30 m A,字电流不小于160mA,并有16级亮度控制功能。该器件内置64键键盘控制器,可实现8×8矩阵键盘扫描,并内置去抖动电路,可提供按键中断与按键释放标志位等功能。CH451可选择简洁的1线串行接口或高速4线串行接口,且内置上电复位,可提供高电平有效复位和低电平有效复位
[单片机]
AVR<font color='red'>单片机</font>驱动CH451实例<font color='red'>程序</font>_C语言
从零开始学单片机(七)液晶接口
这里我买的板子上带有一个SMC1602A LCM。使用也很简单很方便,但是还是要看它的使用说明书才行。 先看看引脚说明,在开发板上,D0-D7接到P0口上,RS接到P3.5,使能信号E接到P3.6上,读写端RW接地(通常不需要读),没有结背光电源。 RAM要比实际显示的多很多(16字 2行),将来做平移就比较方便了。 时序图还是要看的。 1602的指令码(用于设置系统属性的) 显示模式设定: 38H(16 2显示,5 7点阵,8位数据接口) 显示开关及光标设置: 08H+x(x=4:开显示; x=2:显示光标; x=1:光标闪烁) 04H+x(x=2:读写一个字符后地址指针加1,光标加1; x=1:当写一个字
[单片机]
从零开始学<font color='red'>单片机</font>(七)液晶接口
基于ATmega128 单片机的自动投切开关电源设计
电源技术的发展方向之一是并联运行分布电源系统,以便通过N+1 冗余获得故障容错及冗余功率,并且建立模块式分布电源系统,以增大总负载电流。采用双端驱动集成芯片TL494 输出PWM 脉冲控制主开关的导通来控制电压输出,以ATmega128 单片机为核心,实现大电流时自动由单电源供电投切到双电源并联均流供电,增强了开关电源的带负载能力和提高电源的供电效率。 模块化是开关电源发展的总体趋势,可以采用模块化电源组成分布式电源系统,可以设计成N+1冗余电源系统,并实现并联方式的容量扩展,使整个电源体积重量下降,模块中半导体器件的电流应力小,提高了系统的可靠性。本研究的开关电源在带小负载时为单电源供电,带大负载时(电流超过1.7A)自动投切
[单片机]
基于ATmega128 <font color='red'>单片机</font>的自动投切开关电源设计
基于89C51单片机的开关电源优化设计
引言 开关电源是利用现代电力电子技术控制功率开关管(MOSFET,IGBT)开通和关断的时间比率来稳定输出电压的一种新型稳压电源。从上世纪90年代以来开关电源相继进入各种电子、电器设备领域,计算机、程控交换机、通讯、电子检测设备电源、控制设备电源等都已广泛地使用了开关电源。利用单片机控制的开关电源,可使开关电源具备更加完善的功能,智能化进一步提高,便于实时监控。其功能主要包括对运行中的开关电源进行检测、自动显示电源状态;可以通过按键进行编程控制;可以进行故障自诊断,对电源功率部分实现自动监测;可以对电源进行过压、过流保护;可以对电池充放电进行实时控制。 开关电源的系统结构 通信用-48V开关电源结构图如图1
[单片机]
基于89C51<font color='red'>单片机</font>的开关电源优化设计
单片机的低电压与高电压
让一个管脚输出高电平 SETB P1.0 -- D2H,90H 让一个管脚输出低电平 CLR P1.0 -- C2H,90H 汇编的几个指令 MOV R6,#250 -- 将250写入R6 DJNZ R6,标签名 -- 将R6的数据经过250次运算清零后调用标签名 LCALL 标签名-- 调用标签的方法 RET -- 退出当前标签 END -- 结束当前程序 一个简单的延迟函数 DELAY: MOV R7,#250 D1: MOV R6,#250 D2: DJNZ R6,D2 DJNZ R7,D1 RET END
[单片机]
C8051F单片机在远端测控装置中的应用
摘 要:本文介绍了C8051F系列单片机在远端测控装置中的应用,给出了整个系统的结构,包括硬件配置和系统网络构成,对一些技术问题也做出了详尽的说明。 关键词:C8051F ;远端测控;硬件配置 C8051F单片机是完全集成的混合信号系统芯片(SoC),具有与8051指令集完全兼容的CIP-51内核和高速、高性能、高集成度等特点。在本文设计的一套远端测控装置中取得了较好的效果。 系统简介 远端测控装置是一种现场可编程的控制器,它能完成数据的采集控制,而通过远程通信的方式(如电台、CDMA、拨号等)将数据上传至中心站或接收中心站的遥控指令。它往往被安装在比较分散、环境比较恶劣、无电源保障(经常断电或使用太阳能)且无人值守
[应用]
49-基于51单片机的PM2.5和温湿度检测报警
具体实现功能 系统由STC89C52单片机+LCD1602液晶显示屏+ADC0832模块+蜂鸣器+DHT11温湿度传感器 +GP2Y1010AUOF粉尘传感器+LED+按键构成。 具体功能: 1、LCD1602液晶第一行显示当前的PM2.5值,第二行显示当前的温度和湿度值; 2、可以设置PM2.5、温湿度上下限报警值。共4个按键:复位按键、减键、加键、设置键;设定的参数具有掉电保存,保存在STC单片机的内部,上电无需重新设置; 3、当粉尘浓度值高于设定的报警值或温度湿度超出上下限范围,蜂鸣器和指示灯会发出声光报警; 4、当温湿度值低于或高于设定的范围时,相应的指示灯亮,蜂鸣器报警。 设计背景 环境的监测与控
[单片机]
49-基于51<font color='red'>单片机</font>的PM2.5和温湿度检测<font color='red'>报警</font>
STM32单片机FSMC的使用解析
在做项目的过程中遇到了这个问题,感觉文章写得不错,共享给对FSMC的使用怀有疑惑的同伴们! LCD有如下控制线: CS:Chip Select片选,低电平有效 RS:Register Select寄存器选择 WR:Write写信号,低电平有效 RD:Read读信号,低电平有效 RESET:重启信号,低电平有效 DB0-DB15:数据线 假如这些线,全部用普通IO口控制。根据LCD控制芯片手册(大部分控制芯片时序差不多): 如果情况如下: DB0-DB15的IO全部为1(表示数据0xff),也可以为其他任意值,这里以0xff为例。 CS为0(表示选上芯片,CS拉低时,芯片对传入的数据才会有效) RS为1(表示DB0-15上传
[单片机]
STM32<font color='red'>单片机</font>FSMC的使用解析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved