51单片机DS18B20温度测量制作
- 格式:doc
- 大小:43.50 KB
- 文档页数:8
51单片机控制DS18B20测温的PID温控程序51单片机控制DS18B20测温的PID温控程序#include;#include;#include;#include;struct PID {unsigned int SetPoint; // 设定目标 Desired Value unsigned int Proportion; // 比例常数 Proportional Constunsigned int Integral; // 积分常数 Integral Const unsigned int Derivative; // 微分常数 Derivative Constunsigned int LastError; // Error[-1]unsigned int PrevError; // Error[-2]unsigned int SumError; // Sums of Errors};struct PID spid; // PID Control Structure unsigned int rout; // PID Response (Output) unsigned int rin; // PID Feedback (Input) sbit data1=P1^0;sbit clk=P1^1;sbit plus=P2^0;sbit subs=P2^1;sbit stop=P2^2;sbit output=P3^4;sbit DQ=P3^3;unsigned char flag,flag_1=0;unsigned char high_time,low_time,count=0;//占空比调节参数unsigned char set_temper=35;unsigned char temper;unsigned char i;unsigned char j=0;unsigned int s;void delay(unsigned char time){unsigned char m,n;for(n=0;nfor(m=0;m;>;i;temp=temp&1;write_bit(temp);}delay(7);// TR0=1;EA=1;}unsigned char read_bit(){unsigned char i,value_bit;EA=0;DQ=0;_nop_();_nop_();DQ=1;for(i=0;i;>;4;temper=i|j;}void PIDInit (struct PID *pp){memset ( pp,0,sizeof(struct PID)); //全部初始化为0 }unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint ) {unsigned int dError,Error;Error = pp->;SetPoint - NextPoint; // 偏差pp->;SumError += Error; // 积分dError = pp->;LastError - pp->;PrevError; // 当前微分pp->;PrevError = pp->;LastError;pp->;LastError = Error;return (pp->;Proportion * Error // 比例项+ pp->;Integral * pp->;SumError // 积分项+ pp->;Derivative * dError); // 微分项}void compare_temper(){unsigned char i;if(set_temper>;temper) //是否设置的温度大于实际温度{if(set_temper-temper>;1) //设置的温度比实际的温度是否是大于1度{high_time=100; //如果是,则全速加热low_time=0;}else //如果是在1度范围内,则运行PID计算 {for(i=0;i;0){high_time=0;low_time=100;}else{for(i=0;i;>;1;if(m==1)data1=1;elsedata1=0;_nop_();clk=1;_nop_();}}}void display(){unsigned char codenumber[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0 ,0xfe,0x f6};unsigned char disp_num[6];unsigned int k,k1;k=high_time;k=k00;k1=k/100;if(k1==0)disp_num[0]=0;elsedisp_num[0]=0x60;k=k0;disp_num[1]=number[k/10];disp_num[2]=number[k];k=temper;k=k0;disp_num[3]=number[k/10];disp_num[4]=number[k]+1;disp_num[5]=number[s/10];disp_1(disp_num);}void main(){unsigned char z;unsigned char a,b,flag_2=1,count1=0;unsigned char phil[]={2,0xce,0x6e,0x60,0x1c,2}; TMOD=0x21;TH0=0x2f;TL0=0x40;SCON=0x50;PCON=0x00;TH1=0xfd;TL1=0xfd;PS=1;EA=1;EX1=0;ET0=1;ES=1;TR0=1;TR1=1;high_time=50;low_time=50;PIDInit ( &spid ); // Initialize Structure spid.Proportion = 10; // Set PID Coefficients 比例常数 Proportional Constspid.Integral = 8; //积分常数 Integral Const spid.Derivative =6; //微分常数Derivative Const spid.SetPoint = 100; // Set PIDSetpoint 设定目标Desired Valuewhile(1){if(plus==0){EA=0;for(a=0;a;5)temper=a;elsetemper=b;a=temper;flag_2=0;if(++count1>;30){display();count1=0;}compare_temper();}TR0=0;z=1;while(1){EA=0;if(stop==0){for(a=0;a<5;a++)for(b=0;b<102;b++){} if(stop==0)disp_1(phil);// break;}EA=1; }}。
51单片机+1602+DS18B20的温度报警程序+实物设计(按键可调温度阈值)实现功能:51单片机做的温度显示,温度显示在LCD1602液晶屏上。
然后按键可以调整温度阈值,温度高于或低于所设温度,蜂鸣器就会响……单片机源程序如下:1./**************************************************************************************2.3.* 基于单片机的实时温度报警系统设计*4.5.(1)DS18b20采集到的温度可以实时地在数码管或者在液晶上显示出来;6.(2)用三个独立键盘设置阀值,包括设置键,加键,减键和确认键;7.(3)按下设置键时,数码管或者液晶上显示2S“H”字,随后温度闪烁显示,进入设置阀值最大值状态;8.再次按下设置键,数码管或者液晶上显示2S“L”字,随后温度闪烁显示,进入设置阀值最小值状态,9.第三次按下设置键(此时相当于确认键),系统保存设置好的阀值并进入正常的温度显示状态;10.(此程序功能与第三点有出入)11.(4)当采集到的温度大于阀值最大值或者小于阀值最小值时蜂鸣器发出声音报警。
12.13.注释:k1:温度加 k2:温度减 k3:低温度阈值设置 k4:高温度阈值设置14.15.适用单片机:STC89C52RC 适用开发板:普中科技 CH—6800ES V2.0 晶振:12MHZ16.17.***************************************************************************************/18.19.#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器20.#include "lcd.h"21.#include "temp.h"22.#include "intrins.h"23.#include "key.h"24.25.typedef unsigned int u16; //对数据类型进行声明定义26.typedef unsigned char u8;27.28.u8 Disp[]= "Temp: ";29.u8 Disp2[]= "Xiaoliyu Design ";30.31.extern unsigned int LTemp; //低阈值温度32.extern unsigned int LLTemp;33.unsigned int DTemp; //高阈值温度34.unsigned int DLTemp;35.36.u16 NowTemp=35; //当前温度37.u16 IntFlag1=0; //外部中断1标志位38.u16 IntFlag0=0; //外部中断0标志位39.40.sbit Beep=P1^5; //设置蜂鸣器引脚41.sbit LA=P2^2;42.sbit LB=P2^3;43.sbit LC=P2^4;44.45.void delay10us(void);46.void delay100us(void);47.void delay10ms(void);48.void delay1s(void);49.void Int1Init();50.void Int0Init();51.void Timer0Init();52.53./*******************************************************************************54.* 函数名 : main55.* 函数功能 : 主函数56.* 输入 : 无57.* 输出 : 无58.*******************************************************************************/59.void main(void)60.{61. u8 i;62. Int1Init(); //外部中断1初始化63. Int0Init(); //外部中断0初始化64. LcdInit(); //LCD1602初始化65. Timer0Init(); //定时器0初始化66.67. LA =1;68. LB =0;69. LC =0;70.71.////////////////////////////////////////////////////////////////////////////////72.73. for(i=0;i<16;i++) //初始化LCD屏(第一行)74. {75. LcdWriteData(Disp[i]);76. }77.78. delay100us();79. LcdWriteCom(0xC0); //初始化LCD屏(第二行)80.81. for(i=0;i<16;i++)82. {83. LcdWriteData(Disp2[i]);84. }85.86. /////////////////////////////////////////////////////////////////////87.88. while(1)89. {90.91. LcdWriteCom(0x85);92. datapros(Ds18b20ReadTemp()); //获取DS18B20温度93. for(i=0;i<11;i++) //温度信息写入160294. {95. LcdWriteData(DisplayData[i]);96. }97.98.99. if(IntFlag1==1) //若外部中断1标志位为1,则进入高温度阈值设置界面100. {101. LcdMenu();102. if(IntFlag1==0) //若外部中断1标志位为0,则退出高温度阈值设置界面103. { //重载温度显示页面参数104. LcdInit();105. for(i=0;i<16;i++)106. {107. LcdWriteData(Disp[i]);108. }109. delay100us();110.111. LcdWriteCom(0xC0);112. for(i=0;i<16;i++)113. {114. LcdWriteData(Disp2[i]);115. }116.117. }118. delay10ms();119.120. }121.122.123. if(IntFlag0==1) //若外部中断0标志位为1,则进入低温度阈值设置界面124. {125.126. LcdMenuL();127. if(IntFlag0==0) //若外部中断0标志位为0,则退出低温度阈值设置界面128. { //重载温度显示页面参数129. LcdInit();130. for(i=0;i<16;i++)131. {132. LcdWriteData(Disp[i]);133. }134. delay100us();135.136. LcdWriteCom(0xC0);137. for(i=0;i<16;i++)138. {139. LcdWriteData(Disp2[i]);140. }141.142. }143. delay10ms();144. }145.146.147. NowTemp=dataReturn(Ds18b20ReadTemp()); //获取当前温度148. DTemp=(LTemp/100); //获取高温度阈值149. DLTemp=(LLTemp/100); //获取低温度阈值150.151. if((NowTemp>=DTemp)|(NowTemp<=DLTemp)) //如果当前温度大于高温度阈值或小于低温度阈值,则打开定时器0启动蜂鸣器152. {153. ET0=1; //打开定时器0中断允许154. led=~led;155. delay10us();156. }157. else158. {159. ET0=0; //关闭定时器0中断允许160. delay10us();161. }162.163. }164.165./////////////////////////////////////////////////////////////////////////// /////166.167.}168.169./************************************************************************** *****170.* 函数名 : delay10ms171.* 函数功能 : 延时函数10ms172.* 输入 : 无173.* 输出 : 无174.*************************************************************************** ****/175.176.void delay10ms(void)177.{178. unsigned char a,b,c;179. for(c=1;c>0;c--)180. for(b=38;b>0;b--)181. for(a=130;a>0;a--);182.}183.184./************************************************************************** *****185.* 函数名 : delay100us186.* 函数功能 : 延时函数100us187.* 输入 : 无188.* 输出 : 无189.*************************************************************************** ****/190.191.void delay100us(void)192.{193. unsigned char a,b;194.for(b=1;b>0;b--)195. for(a=47;a>0;a--);196.}197.198./************************************************************************** *****199.* 函数名 : delay10us200.* 函数功能 : 延时函数10us201.* 输入 : 无202.* 输出 : 无203.*************************************************************************** ****/204.205.void delay10us(void)206.{207. unsigned char a,b;208. for(b=1;b>0;b--)209. for(a=2;a>0;a--);210.}211.212./************************************************************************** *****213.* 函数名 : Int1Init214.* 函数功能 : 延时函数10us215.* 输入 : 无216.* 输出 : 无217.*************************************************************************** ****/218.219.void Int1Init()220.{221. //设置INT1222. IT1=1;//跳变沿出发方式(下降沿)223. EX1=1;//打开INT1的中断允许。
目录前言 (1)正文 (1)2.1 设计目的和意义 (1)2.1.1 设计目的 (1)2.1.2 设计意义 (1)2.2 设计方法和步骤 (1)3.1 单片机最小系统设计 (2)3.1.1 电源电路 (2)3.1.2 振荡电路与复位电路 (2)3.2 DS18B20与单片机的接口电路 (3)3.3 PROTEUS仿真电路图 (3)4.1 程序流程 (3)4.1.1 主程序流程图 (4)4.1.2 各子程序流程图 (4)4.2 汇编语言程序源代码 (8)5.1 DS18B20简单介绍 (10)5.1.1 DS18B20 的性能特点如下: (11)5.1.2 DS18B20使用中的注意事项 (11)5.1.3 DS18B20内部结构 (12)5.2 DS18B20测温原理 (14)总结 (15)参考文献 (16)前言随着现代信息技术的飞速发展和传统工业改造的逐步实现,能够独立工作的温度检测和显示系统应用于诸多领域。
传统的温度检测以热敏电阻为温度敏感元件。
热敏电阻的成本低,但需后续信号处理电路,而且可靠性相对较差,测温准确度低,检测系统也有一定的误差。
这里设计的数字温度计具有读数方便,测温范围广,测温精确,数字显示,适用范围宽等特点。
本设计选用AT89C51型单片机作为主控制器件,DS18B20作为测温传感器,通过LCD1602实现温度显示。
通过DS18B20直接读取被测温度值,进行数据转换,该器件的物理化学性能稳定,线性度较好,在0℃~100℃最大线性偏差小于0.01℃。
该器件可直接向单片机传输数字信号,便于单片机处理及控制。
另外,该温度计还能直接采用测温器件测量温度,从而简化数据传输与处理过程。
正文2.1 设计目的和意义2.1.1 设计目的作为理工科的学生应该在学习与动手实践中提高自己的专业技能知识,通过课程设计使我进一步熟悉了单片机的内部结构和工作原理,掌握了单片机应用系统设计的基本方法和步骤;通过利用MCS-51单片机,理解单片机在自动化装置中的作用以及掌握单片机的编程调试方法;通过设计一个简单的实际应用输入控制及显示系统,掌握protues和Wave以及各种仿真软件的使用。
基于51单片机和DS18B20的数字温度计设计毕业设计(论文)课题名称:基于51单片机和DS18B20的温度计设计指导教师:系别:电子信息系专业:楼宇智能化工程技术班级:14楼宇1班姓名:摘要随着科技的不断发展,电子设备的应用已经取得了非凡的成就。
即使是高度集成化的今天,单片机技术依旧在我们的日常生活中占据着重要的地位。
温度是日常生活、工业、医学、环境保护、化工、石油等领域最常用到的一个物理量。
测量温度的基本方法是使用温度计直接读取温度。
最常见到得测量温度的工具是各种各样的温度计。
它们常常以刻度的形式表示温度的高低,人们必须通过读取刻度值的多少来测量温度。
利用单片机和温度传感器构成的电子式智能温度计就可以直接测量温度,得到温度的数字值,既简单方便,有直观准确。
本文介绍了一个基于STC89C51单片机和数字温度传感器DS18B20的测温系统,并用LED数码管显示温度值,易于读数。
系统电路简单、操作简便,系统具有可靠性高、成本低、功耗小等优点。
通过Proteus画图以及Keil编程,成功的仿真出了能够实时测量温度并显示温度的数字温度计。
关键词:单片机、数字温度传感器、温度计目录第一章绪言1.1课题背景工农业生产中经常需要测量温度。
在设计温度测量系统时,通*要采用电池供电的极低功耗模块。
传统的温度测量手段比较多,但不论是采用分立晶体管,或者是热电偶,功耗都降不下来。
为达到低功耗要求,采用一枚极低功耗的、带Flash存储器的MCU,以及热敏电阻传感器、日历时钟和液晶模块(LCD)组成测量系统。
采用负温度系数(NTC)热敏电阻,具有测量灵敏度高、体积小,电阻值大、价格便宜等特点,且温度范围可以从-40℃~125℃,精度可达1%,基本上满足了行业中对温度的测量需求。
系统兼顾了温度测量精度和低功耗方面的要求。
温度控制系统在国内各行各业的应用虽然已经十分广泛,但从国内生产的温度控制器来讲,总体发展水平仍然不高,同日本、美国、德国等先进国家相比,仍然有着较大的差距。
#include<reg51.h>#include<intrins.h> //nop函数#include<stdlib.h>#include<math.h>#define uchar unsigned char#define uint unsigned intsbit DS18B20_DQ=P2^7;sbit feng=P2^0;sbit deng=P1^0;#define LCD_data P0 //ch375数据端口uchar count1,count2,count;sbit LCD_RS=P3^5;sbit LCD_RW=P3^6; //ch375的rw也是此口sbit LCD_EN=P3^4;#include<key_fo.h>uchar ds18b20_serial[4][8]={0x28,0x51,0x8c,0x9e,0x03,0x00,0x00,0xfd, //第1个18B20的ID0x28,0x71,0x91,0x9e,0x03,0x00,0x00,0xdb, //第2个18B20的ID0x28,0x43,0xa6,0x9a,0x03,0x00,0x00,0x83, //第3个18B20的ID0x28,0xe3,0x8a,0x9e,0x03,0x00,0x00,0x08 //第4个18B20的ID};#include<12864.h>uchar temp_num1;uchar temp_num2;uint temper=0,yushe1=325,yushe2=325,yushe3=325,yushe4=325,piancha;/****************************************************函数:void Ds18b20_Delay(uint timer)功能:STC单片机严格的us级延时函数*****************************************************/void Ds18b20_Delay(uint timer) //us{while(timer--){_nop_();_nop_();_nop_();}}/***************************************************函数:void rest()功能:DS18B20芯片复位函数说明:复位时,MCU将数据线置为低电平,并且保持480uS-960uS,然后置为高电平,延时一段时间后,然后由MCU接受DS18B20的响应信号。
基于51单片机的温度报警器设计引言:温度报警器是一种用来检测环境温度并在温度超过设定阈值时发出警报的装置。
本文将基于51单片机设计一个简单的温度报警器,以帮助读者了解如何利用单片机进行温度监测和报警。
一、硬件设计硬件设计包括传感器选择、电路连接以及报警装置的设计。
1.传感器选择温度传感器的选择非常重要,它决定了监测温度的准确性和稳定性。
常见的温度传感器有热敏电阻(如NTC热敏电阻)、热电偶以及数字温度传感器(如DS18B20)。
在本设计中,我们选择使用DS18B20数字温度传感器,因为它具有高精度和数字输出的优点。
2.电路连接将DS18B20与51单片机连接,可以采用一根三线总线(VCC、GND、DATA)的方式。
具体连接方式如下:-将DS18B20的VCC引脚连接到单片机的VCC引脚(一般为5V);-将DS18B20的GND引脚连接到单片机的GND引脚;-将DS18B20的DATA引脚连接到单片机的任意IO引脚。
3.报警装置设计报警装置可以选择发出声音警报或者显示警报信息。
在本设计中,我们选择使用蜂鸣器发出声音警报。
将蜂鸣器的一个引脚连接到单片机的任意IO引脚,另一个引脚连接到单片机的GND引脚。
二、软件设计软件设计包括温度读取、温度比较和报警控制的实现。
1.温度读取通过51单片机的IO引脚和DS18B20进行通信,读取DS18B20传感器返回的温度数据。
读取温度数据的具体步骤可以参考DS18B20的通信协议和单片机的编程手册。
2.温度比较和报警控制将读取到的温度数据和设定的阈值进行比较,如果温度超过阈值,则触发报警控制。
可以通过控制蜂鸣器的IO引脚输出高电平或低电平来控制蜂鸣器是否发出声音警报。
三、工作原理整个温度报警器的工作原理如下:1.首先,单片机将发出启动信号,要求DS18B20开始温度转换。
2.单片机等待一段时间,等待DS18B20完成温度转换。
3.单片机向DS18B20发送读取信号,并接收DS18B20返回的温度数据。
基于DS18B20的单片机温度监测系统一、引言近年来,随着物联网技术的快速发展,各种智能设备得到了广泛应用。
其中,温度监测系统在生活、工业和农业等领域发挥着重要作用。
基于DS18B20的单片机温度监测系统是一种成本低、精度高、易于实现的温度监测方案。
本文将详细介绍基于DS18B20的单片机温度监测系统的原理、设计和实现。
二、系统原理基于DS18B20的单片机温度监测系统由DS18B20温度传感器、单片机和显示设备组成。
DS18B20是一种数字温度传感器,通过单总线协议与单片机进行通信。
单片机负责接收DS18B20传感器的数据,并将温度值显示在相应的显示设备上。
三、硬件设计1. DS18B20温度传感器DS18B20温度传感器具有较高的温度测量精度和广泛的工作温度范围。
它采用单总线接口,只需要一个IO口即可完成与单片机的通信。
在设计中,将DS18B20的VDD引脚连接到单片机的供电引脚,GND引脚连接到单片机的地引脚,DQ 引脚连接到单片机的IO口。
2. 单片机单片机是温度监测系统的核心控制器,负责接收DS18B20传感器的数据并进行处理。
常用的单片机型号有STC89C52、AT89S52等。
在设计中,将单片机的IO口连接到DS18B20传感器的DQ引脚,通过单总线协议与传感器进行通信。
3. 显示设备显示设备用于将温度值显示出来,常用的显示设备有LCD液晶显示屏、LED数码管等。
在设计中,将单片机的IO口连接到显示设备的控制引脚,通过控制引脚向显示设备发送温度值。
四、软件设计1. 单片机程序设计单片机程序设计是整个系统的核心,主要包括初始化配置、与DS18B20传感器通信、温度数据处理和显示等功能。
在程序设计中,首先需要初始化单片机的IO口和定时器,使其能够与DS18B20传感器进行通信。
接着,通过单总线协议与传感器进行通信,从传感器读取温度数据。
然后,对读取的温度数据进行处理,计算出实际的温度值。
单片机应用课程设计(设计课题: 电子时钟及温度控制器院(系、部): 机械工程系专业: 机械制造及其自动化专业一、单片机电子时钟的设计目录第一章前言 (3)第二章方案论证与比较 (3)2.1数字时钟方案 (3)2.2数码管显示方案 (4)第三章系统设计 (5)3.1总体设计 (5)3.1.1系统说明 (5)3.1.2系统框图..................................................... 错误!未定义书签。
第四章原理图与仿真图. (6)4.1 Protel原理图 (6)4.2 Proteus 仿真图 (7)4.3流程图 (8)4.4源程序清单 (10)4.5设计总结 (18)第五章实验心得体会 (19)第六章参考文献 (20)第一章前言单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。
单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。
由于具有上述优点,在我国,单片机已广泛地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体化设备等各个方面,而51单片机是各单片机中最为典型和最有代表性的一种。
这次毕业设计通过对它的学习、应用,以AT89S51芯片为核心,辅以必要的电路,设计了一个简易的电子时钟,它由4.5V直流电源供电,通过数码管能够准确显示时间,日期,调整时间,日期,从而到达学习、设计、开发软、硬件的能力。
时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。
在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间,它通常有两种实现方法:一是用软件实现,即用单片机内部的可编程定时/计数器来实现,但误差很大,主要用在对时间精度要求不高的场合;二是用专门的时钟芯片实现,在对时间精度要求很高的情况下,通常采用这种方法,典型的时钟芯片有:DS1302,DS12887,X1203等都可以满足高精度的要求。
第1章引言在日常生活及工农业生产中经常要涉及到温度的检测及控制,传统的测温元件有热点偶,热敏电阻还有一些输出模拟信号得温度传感器,而这些测温元件一般都需要比较多的外部硬件支持。
其硬件电路复杂,软件调试繁琐,制作成本高,阻碍了其使用性。
因此美国DALLAS半导体公司又推出了一款改进型智能温度传感器——DS18B20。
本设计就是用DS18B20数字温度传感器作为测温元件来设计数字温度计。
本设计所介绍的数字温度计与传统温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于测温比较准确得场所,或科研实验室使用。
该设计控制器使用单片机STC89C51,测温传感器使用DS18B20,显示器使用LED.第2章任务与要求2.1测量范围-50~110°C,精确到0.5°C;2.2利用数字温度传感器DS18B20测量温度信号;2.3所测得温度采用数字显示,计算后在液晶显示器上显示相应得温度值;第3章方案设计及论证3.1温度检测模块的设计及论证由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,其中还涉及到电阻与温度的对应值的计算,感温电路比较麻烦。
而且在对采集的信号进行放大时容易受温度的影响出现较大的偏差。
进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,电路简单,精度高,软硬件都以实现,而且使用单片机的接口便于系统的再扩展,满足设计要求。
3.2显示模块的设计及论证LED是发光二极管Light Emitting Diode 的英文缩写。
LED显示屏是由发光二极管排列组成的一显示器件。
基于51单片机的数字温度计设计及应用数字温度计是一种测量环境温度的设备,它使用数字技术来转换和显示温度值。
基于51单片机的数字温度计设计及应用,我们将使用51单片机作为主控芯片,采集传感器的温度数据并将其转换为数字信号,然后通过数码管显示出来。
首先,我们需要选择合适的温度传感器。
常见的温度传感器有热敏电阻、热电偶和数字温度传感器等。
在本设计中,我们将使用DS18B20数字温度传感器。
DS18B20具有高精度、数字输出、通信简单等优点,非常适合于数字温度计的设计。
接下来,我们需要设计硬件电路。
首先,将DS18B20传感器连接到51单片机的GPIO引脚,并通过一条数据线进行通信。
接下来,将51单片机的引脚连接到数码管显示模块,用于将温度值显示出来。
此外,还可以添加其他功能,如按键开关用于控制菜单切换、蜂鸣器用于报警等。
在软件设计上,首先需要初始化51单片机的GPIO引脚,配置为输入或输出模式,通信时需要配置为模拟输入模式。
然后,利用51单片机的定时器模块生成一定频率的时钟信号,用于与DS18B20传感器通信。
在温度读取过程中,我们需要发送一系列的指令给DS18B20传感器,然后接收传感器返回的温度值。
根据DS18B20传感器的数据手册,我们可以编写相应的C语言代码进行数据的读取和解析。
接着,我们需要将读取到的温度值进行转换和显示。
由于DS18B20传感器输出的温度值为16位二进制补码形式,我们可以使用移位和逻辑运算等操作进行转换。
转换后的温度值可以直接显示在数码管上,通过扫描显示的方式实时更新温度数值。
在应用方面,基于51单片机的数字温度计可以广泛应用于各种温度测量场景。
例如,可以应用于室内温度测量,工业过程控制,农业温室监测等。
由于51单片机具有低功耗、成本低廉等优点,这种数字温度计可以在各种资源有限的环境中使用。
除了基本功能外,我们还可以进行功能扩展。
例如,可以添加存储功能,将温度数据保存到外部存储器中,以便进行后续分析和处理。
页脚 51单片机DS18B20温度测量制作(有程序电路) 硬件原理图
图 6 硬件原理图 软件代码 /***************************************************************************/
/*DS18B20演示程序 */ /*目标器件:AT89S51 */ /*晶振:11.0592MHZ */ 页脚
/*编译环境:Keil 7.50A */ /***************************************************************************/
/********************************* 包含头文件 ********************************/
#include /******************************* 共阳 LED 段码表 *******************************/
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/********************************* 端口定义 **********************************/
sbit DQ=P3^3; // 数据传输线接单片机的相应的引脚 /********************************* 定义全局变量 ******************************/
unsigned char tempL=0; // 临时变量低位 unsigned char tempH=0; // 临时变量高位 float temperature; // 温度值 /****************************************************************************
函数功能 : 延时子程序 入口参数 :k 出口参数 : ****************************************************************************/
void delay(unsigned int k) { 页脚
unsigned int n; n=0; while(n < k) {n++;} return; } /****************************************************************************
函数功能 : 数码管扫描延时子程序 入口参数 : 出口参数 : ****************************************************************************/
void delay1(void) { int k; for(k=0;k<400;k++); } /****************************************************************************
函数功能 : 数码管显示子程序 入口参数 :k 出口参数 : ****************************************************************************/ 页脚
void display(int k) { P2=0xfe; P0=tab[k/1000]; delay1(); P2=0xfd; P0=tab[k%1000/100]; delay1(); P2=0xfb; P0=tab[k%100/10]; delay1(); P2=0xf7; P0=tab[k%10]; delay1(); P2=0xff; } /****************************************************************************
函数功能 :DS18B20 初始化子程序 入口参数 : 出口参数 : ****************************************************************************/
Init_DS18B20(void) { 页脚
unsigned char x=0; DQ=1; //DQ 先置高 delay(8); // 延时 DQ=0; // 发送复位脉冲 delay(85); // 延时( >480ms) DQ=1; // 拉高数据线 delay(14); // 等待( 15~60ms) } /****************************************************************************
函数功能 : 向 DS18B20 读一字节数据 入口参数 : 出口参数 :dat ****************************************************************************/
ReadOneChar(void) { unsigned char i=0; unsigned char dat=0; for (i=8;i>0;i--) { DQ=1; delay(1); DQ=0; dat>>=1; 页脚
DQ=1; if(DQ) dat|=0x80; delay(4); } return(dat); } /****************************************************************************
函数功能 : 向 DS18B20 写一字节数据 入口参数 :dat 出口参数 : ****************************************************************************/
WriteOneChar(unsigned char dat) { unsigned char i=0; for(i=8;i>0;i--) { DQ=0; DQ=dat&0x01; delay(5); DQ=1; dat>>=1; } 页脚
delay(4); } /****************************************************************************
函数功能 : 向 DS18B20 读温度值 入口参数 : 出口参数 :temperature ****************************************************************************/
ReadTemperature(void) { Init_DS18B20(); // 初始化 WriteOneChar(0xcc); // 跳过读序列号的操作 WriteOneChar(0x44); // 启动温度转换 delay(125); // 转换需要一点时间,延时 Init_DS18B20(); // 初始化 WriteOneChar(0xcc); // 跳过读序列号的操作 WriteOneChar(0xbe); // 读温度寄存器(头两个值分别为温度的低位和高位) tempL=ReadOneChar(); // 读出温度的低位 LSB tempH=ReadOneChar(); // 读出温度的高位 MSB // 温度转换,把高低位做相应的运算转化为实际温度 temperature=((tempH*256)+tempL)*0.0625; delay(200); return(temperature); } 页脚
/****************************************************************************
函数功能 : 主程序 入口参数 : 出口参数 : ****************************************************************************/
void main() { float i; while(1) { i=ReadTemperature(); display(i); } }