基于单片机的热电偶测温代码
- 格式:doc
- 大小:54.50 KB
- 文档页数:8
MAX6675是带冷端补偿的K型热电偶转换芯片,SO-8封装,精度12位,分辨率0.25℃,测量最高温度1023.75℃。
也就是1024/(2的12次方)=0.25℃。
VCC-GND接3~5.5V电压;T+,T-分别接K型热电偶正负极;CS为片选,低电平有效;SCK为串行时钟,需要由STM32提供;SO为数据串行输出;接线方式:MAX6675的输出方式是单片机输入时钟脉冲,MAX6675在时钟的下跳沿在SO管脚上输出数据。
在数据手册第5页有时序说明,在6页有时序图,时序说明和时序图有差别。
本人在读取数据过程中,发现按照时需说明操作,是正确的;而按时序图操作读取的数据有错误。
MAX6675每次输出一共是16位数据,第一位也就是D15,是虚拟位;D14-D3,是12位的温度MSB-LSB,也就是高位在前地位在后;D2是一个标志,正常为0,一旦热电偶开路,则为1;D1是ID,通常为0,不懂啥意思,反正我不管怎样读都为0;D0是三态输出。
Force CS low to output the first bit on the SO pin. Acomplete serial interface read requires 16 clock cycles.Read the 16 output bits on the falling edge of the clock.The first bit, D15, is a dummy sign bit and is alwayszero. BitsD14–D3 contain the converted temperature inthe order of MSB to LSB. Bit D2 is normally low andgoes high when the thermocouple input is open. D1 islow to provide a device ID for the MAX6675 and bit D0 is three-state.以上是时序说明,说的是在CS=0时,第一位就输出了,可以直接读取,不需要时钟,也就是读取16位数据只需要15个时钟;而时序图说的是CS=0之后,需要在第一个时钟下降沿读取第一位数据,也就是16位数据16个时钟;据我的实验,第一个数据不需要时钟,如果输出时钟,则所有数据左移一位。
基于51单片机的温度控制系统0引言在现代化的工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。
例如:在冶金工业、化工生产、电力工程、造纸行业、机械制造和食品加工等诸多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。
采用MCS-51单片机来对温度进行控制,不仅具有控制方便、组态简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而能够大大提高产品的质量和数量。
因此,单片机对温度的控制问题是一个工业生产中经常会遇到的问题。
本文以它为例进行介绍,希望能收到举一反三和触类旁通的效果。
1硬件电路设计以热电偶为检测元件的单片机温度控制系统电路原理图如图1所示。
1.1 温度检测和变送器温度检测元件和变送器的类型选择与被控温度的范围和精度等级有关。
镍铬/镍铝热电偶适用于0℃-1000℃的温度检测范围,相应输出电压为0mV-41.32mV。
变送器由毫伏变送器和电流/电压变送器组成:毫伏变送器用于把热电偶输出的0mV-41.32mV变换成4mA-20mA的电流;电流/电压变送器用于把毫伏变送器输出的4mA-20mA电流变换成0-5V的电压。
为了提高测量精度,变送器可以进行零点迁移。
例如:若温度测量范围为500℃-1000℃,则热电偶输出为20.6mV-41.32mV,毫伏变送器零点迁移后输出4mA-20mA范围电流。
这样,采用8位A/D转换器就可使量化温度达到1.96℃以内。
1.2接口电路接口电路采用MCS-51系列单片机8031,外围扩展并行接口8155,程序存储器EPROM2764,模数转换器ADC0809等芯片。
由图1可见,在P2.0=0和P2.1=0时,8155选中它内部的RAM工作;在P2.0=1和P2.1=0时,8155选中它内部的三个I/O端口工作。
相应的地址分配为:0000H - 00FFH 8155内部RAM0100H 命令/状态口0101H A 口0102H B 口0103H C 口0104H 定时器低8位口0105H 定时器高8位口8155用作键盘/LED显示器接口电路。
基于PT100的温度采集系统设计基于PT100的温度采集系统设计姓名:冯学号:专业班级:目录一、设计简介 (3)二、硬件设计 (3)1、单片机电路 (1)2、信号调理电路 (4)三、上位机程序设计 (7)四、总结 (8)一.设计简介本设计采用STC89C51单片机实现测温功能。
传感器为PT100热电阻,测温范围为0℃~300℃。
采集的温度由四位数码管显示,并将温度值传送给上位机显示。
可实现上限报警功能。
二.硬件设计1.单片机电路本设计的单片机电路由STC89C51单片机最小系统、电源部分、数码管显示部分、按键部分、ADC及串行通信接口部分组成。
1)单片机最小系统主函数部分代码:void main(void){uchar buff[4];TMOD = 0x20; //定时器1,在模式2SCON = 0x50; //8位串行口模式1,允许接收,REN=1 PCON=0x00;TH1 = 0xFD; //波特率为9600,晶体频率为11.059MHz TL1 = 0xFD; //波特率为9600,晶体频率为11.059MHz //ES = 1; //使能串行口中断TR1 = 1; //启动定时器1EA = 1; //使能全局中断while(1){wendu_chuli();beep=1;if(wendu>40)baojing();sprintf(buff,"%f",tem2);delay_ms(10);Send(buff);delay_ms(10);}}2)数码管显示电路数码显示部分代码:void write_74HC164(unsigned char mydata) { unsigned char i,byte,h;byte=mydata;i=8;h=0;while(i)VSCL=0;if((0x80 & mydata)==0x80){VSDA=1;}else{VSDA=0;}h=0;h=0;VSCL =1;h=0;h=0;mydata<<=1;i--;}}3)ADC转换电路AD转换代码:/**********************************************************/ unsigned int read_adc(void){unsigned int u=0;unsigned char i,j;cs=1;j=0;cs=0;for(i=0;i<10;i++){clk=0;u=(u<<1)|dout;clk=1;j=0;cs=1; //开始转换return(u); //返回ADC结果}4)串行通信接口部分串行通信部分代码:void Send(char *parr){do{SBUF=*parr++;while(!TI);TI=0;}while(*parr);}2.信号调理电路图中采用TL431稳压电路向PT100电桥供电。
武汉理工大学毕业设计(论文)基于单片机的数码管显示的K型热电偶温度计的设计与仿真学院(系): 信息工程学院专业班级: 信息工程xxxx班学生姓名: xx指导教师: xx学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包括任何其他个人或集体已经发表或撰写的成果作品。
本人完全意识到本声明的法律后果由本人承担。
作者签名:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保障、使用学位论文的规定,同意学校保留并向有关学位论文管理部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权省级优秀学士论文评选机构将本学位论文的全部或部分内容编入有关数据进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
本学位论文属于1、保密囗,在年解密后适用本授权书2、不保密囗。
作者签名:年月日导师签名:年月日摘要本文主要介绍了基于热电偶温度传感器的测温系统的设计。
利用转换芯片MAX6675和k型热电偶,将温度信号转换成数字信号,通过模拟SPI的串行通信方式输送数据,在通过单片机处理数据,最后由数码管显示数据。
本文采用了带有冷端补偿的温度转换芯片MAX6675、K型热电偶、89C51单片机、数码管等元器件设计了相应温度采集电路、温度转换电路、温度数码管显示电路。
结合硬件电路给出了相应的软件设计,测温精度可达到0.25℃。
本系统的工作流程是:首先热电偶采集温度,数据经过MAX6675内部电路的处理后送给单片机进行算法处理,最后通过数码管电路显示出测量温度。
本设计最后对系统进行了proteus的调试和仿真,实现了设计的要求。
关键词温度传感器热电偶热时间常数冷端补偿ABSTRACTThis design describes the thermocouple temperature sensor based on the rapid temperature measurement system.The temperature signal is converted into digital signals by useing conversion chip max6675 and k-type thermocouple, conveying data via serial communication simulation spi in processing the data through the microcontroller, the final data from the digital tube displayThis design uses a temperature conversion chip MAX6675,K-type thermocouple, 89C51microcontroller, LED and other components, design corresponding temperature acquisition circuit, temperature converter circuit, the LED display circuit. With the hardware give out The corresponding software design, temperature measurement accuracy up to 0.25 ℃.The system works is: first acquisition thermocouple temperature data through the Treatment of the of the MAX6675 internal circuit and be then sent to 89C51 Aim for rapid algorithm processing. Finally, the LED circuit shows the measurement temperature values. In the last, the design of the system was proteus debugging and simulation,achieve the design requirements.KEY WORDS Temperature sensor Thermocouple Thermal time constant Cold junction compensation目录摘要 (III)ABSTRACT (IV)第1章绪论 (1)第2章系统原理概述 (2)2.1 热电偶测温基本原理 (2)2.2 热电偶冷端补偿方案 (2)2.2.1 分立元气件冷端补偿方案 (2)2.2.2 集成电路温度补偿方案 (3)2.2.3 方案确定 (4)2.3硬件组成原理 (4)2.4软件系统工作流程 (4)第3章元件和软件介绍 (6)3.1 单片机选择及最小系统 (6)3.2 热电偶介绍 (7)3.2.1 K型热电偶概述 (7)3.3 数字温度转换芯片MAX6675简介 (7)3.3.1 冷端补偿专用芯片MAX6675性能特点 (8)3.3.2 冷端补偿专用芯片MAX6675温度变换 (9)3.4 KEIL软件仿真软件介绍 (9)3.5 PROTEUS硬件仿真软件介绍 (10)第4章程序设计及硬件仿真 (11)4.1 数据的采集 (11)4.2 数据传输部分 (11)4.3 数据处理部分 (14)4.3.1 数据转换 (15)4.3.2 进制转换 (17)4.4 显示部分程序及仿真 (19)第5章系统仿真 (23)结论 (25)参考文献 (26)附录 (27)致谢 (34)第1章绪论温度是反映物体冷热状态的物理参数,对温度的测量在冶金工业、化工生产、电力工程、机械制造和食品加工、国防、科研等领域中有广泛地应用。
编写S7-300 PLC 热电偶测温程序需要按照以下步骤进行:1. 确定程序功能,包括采集测量温度值,保存数据,检测异常情况等。
2. 准备硬件和软件资源,包括编写PLC硬件接线图、选用合适的模块以及配置STEP 7等编程环境。
3. 编写程序主体框架,包括开启数据采集口、读取电压变化、算法/卡尔曼滤波等算法处理、将结果存储到内存寄存器中。
4. 设置异常检测处理机制,包括在输入温度达到某个值后自动报警,并自动采取一些特定的行动(改变温度、关闭电路等)。
5. 设置数据存储,以便于对温度的实时或后续分析,包括存储到内部存储器、外存设备、或上传和处理到电脑端。
6. 测试和优化程序,进行模拟数据采集、边缘情况处理、性能调优等环节,使其更好地达到实际应用的效果。
下面是一份可供参考的S7-300热电偶测温PLC程序示例:```Program MainVAR/InputMeasurements: REAL; // 实时测量的温度MaxTemperature: INT; // 允许的最高温度设定值MinTemperature: INT; // 允许的最低温度设定值END_VARVAROffset: REAL; // 所有测量的偏移量Voltage: REAL; // 读取到的电压值Temperature: REAL; // 计算得到的温度值TemperatureFilter: REAL; // 经过滤波算法后得到的温度值Storage: ARRAY[0..50] OF REAL; // 存储最近50个温度值i,j: INT; // 用于计数END_VARVAR/OutputAlarm: BOOL; // 报警开关END_VAR// 初始偏移量设置Offset := 0.1;// 循环读取WHILE TRUE DOVoltage := ReadVoltage(); // 读取电压值Temperature := ConvertToTemperature(Voltage); // 计算出温度值// 卡尔曼滤波TemperatureFilter := KalmanFilter(Temperature, Offset, 0.03, 0.1, 0.1);// 存储最近50个温度值FOR i := 50 TO 1 BY -1 DOStorage[i] := Storage[i - 1];END_FORStorage[0] := TemperatureFilter;// 偏移量更新FOR j := 0 TO 50 DOOffset := Offset + ((Storage[j] - Offset) / (j + 1));END_FOR// 检查报警设置IF TemperatureFilter > MaxTemperature OR TemperatureFilter < MinTemperature THENAlarm := TRUE;// 可添加报警提示或关闭某些电路的执行代码ELSEAlarm := FALSE;END_IF// 定期保存数据到内存寄存器IF TIME() = T#10S THEN// 可选用任意合适的数据存储方式END_IFEND_WHILEEnd_Program```在以上示例程序中,采用了卡尔曼滤波算法来过滤电压变化和温度的偏移量,使得测温更加准确可靠。
基于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返回的温度数据。
基于单片机的电加热炉温度控制系统设计一、概述电加热炉温度控制系统是一种常见的自动化控制系统。
它通过控制加热元件的加热功率来维持加热炉内的温度,从而实现对加热过程的精确控制。
本文将介绍一种基于单片机的电加热炉温度控制系统的设计。
二、系统设计1. 硬件设计本系统采用单片机作为控制核心,传感器检测加热炉内的温度,并将数据反馈给单片机进行处理。
通过触摸屏交互界面,用户可以设定希望维持的温度值,单片机将控制加热元件的加热功率,以实现温度的稳定控制。
2. 软件设计单片机程序主要分为三个部分:(1)传感器数据采集和处理,通过定时器进行数据的采样,然后通过计算分析实现温度值的读取。
(2)温度控制,设定一个目标温度值后,单片机通过PID算法来控制加热元件的加热功率,保持温度的稳定。
(3)交互界面的设计,实现用户与系统的交互,包括设定目标温度值和实时温度显示等。
三、系统优势相对于传统的手动控制方式,本系统具有以下优势:(1)精度高,通过PID算法,可以实现对温度的精确控制,大大提高了生产效率。
(2)舒适度高,传统的手动控制方式需要人员长时间待在生产车间,而本系统的自动化控制方式,可以让人员远离高温环境。
(3)可靠性高,系统精度高,响应迅速,可以有效减少因为控制失误带来的损失。
四、结论本系统的设计基于单片机实现电加热炉温度的精确控制。
相对于传统的手动控制方式,具有精度高、舒适度高和可靠性高等优势。
在未来的生产过程中,随着物联网的发展,本系统也可以进行联网控制,实现对设备的远程控制和监控,提高设备的效率和安全性。
#include<reg52.h>#include<intrins.h> //为了使用这个头文件中的_nop_()延时函数sbit sda=P2^2; //DS18B20的数据总线sbit hc573_sg_le=P2^6; //对用于锁存段数据的573锁存LE端进行定义sbit hc573_bit_le=P2^7; //对用于锁存位选通数据的573锁存LE端进行定义sbit lcd_rs=P1^0; //数据/命令选择端,高电平执行数据操作,低电平执行命令操作sbit lcd_rw=P1^1; //读/写控制端高电平时读,低电平写sbit lcd_en=P2^5; //读写控制使能信号,它为高脉冲信号才可执行读写操作sbit sta7=P0^7; //1602忙信号检测位,为1则忙,需等待,为0表示空闲unsigned char code lcd_line1[]={"Temperature:"}; //定义第一行液晶显示的格式字符数组unsigned char code lcd_line2[]={" ."}; //定义第二行液晶显示的格式字符数组void lcd_busy_check(void) //1602忙信号检测,忙则等待{P0=0xff;do{lcd_rs=0; //读状态操作,为0lcd_rw=1; //读操作为1lcd_en=0;lcd_en=1; //读状态,需为高电平}while (sta7==1); //如果为1则忙,等待...直到为0lcd_en=0;}void lcd_write_cmd(unsigned char cmd) //液晶写命令函数{lcd_busy_check(); //每次操作之前都要进行忙信号检测lcd_rs=0; //执行命令操作,为0lcd_rw=0; //写操作,为0P0=cmd; //送指令到液晶数据端口P0,准备执行命令_nop_(); //这是一个延时函数,可延时一个机器周期,它在“intrins.h”中lcd_en=1; //高电平,指令送入液晶控制器_nop_(); //保持一会儿,使指令可靠地送入液晶控制器lcd_en=0; //低电平,执行命令}void lcd_write_data(unsigned char dat) //液晶写数据函数{lcd_busy_check(); //每次操作之前都要进行忙信号检测lcd_rs=1; //执行数据操作,为1lcd_rw=0; //写操作,为0P0=dat; //送数据到液晶数据端口P0,准备执行数据操作_nop_();lcd_en=1; //高电平,数据送入液晶液晶数据RAM_nop_(); //保持一会儿,使显示数据可靠地送入液晶数据RAM lcd_en=0; //低电平,显示数据}void lcd1602_init() //液晶显示初始化操作{P0=0xff;hc573_sg_le=0; //关闭HC573使数码管不显示hc573_bit_le=0;lcd_en=0; //为0,为实现高脉冲作准备lcd_write_cmd(0x38); //设置为5x7显示lcd_write_cmd(0x0c); // 打开显示-不显示示光标lcd_write_cmd(0x6); //地址加一,光标右移,整屏显示不移动lcd_write_cmd(0x01); //清屏}/*--毫秒级延时函数,参数为多少则延时多少毫秒--*/void delay_ms(unsigned int t){unsigned int a,b;for(a=0;a<t;a++){for(b=0;b<113;b++){;}}}void _nop5_() //5个机器周期的延时,延时5us多点{_nop_();_nop_();_nop_();_nop_();_nop_();}void _nop20_() //20个机器周期的延时,延时20us多点{_nop5_();_nop5_();_nop5_();_nop5_();}void _nop60_() //60个机器周期的延时,延时60us多点{_nop20_();_nop20_();_nop20_();}/*DS18B20的初始化函数每对DS18B20进行一次操作之前,都要初始化*/void ds18b20_init(){sda=0; //拉低delay_ms(1); //等待至少480us,(我们这里为1ms)sda=1; //单片机释放总线while(sda==1); //单片机等待DS18B20在总线发出存在信号(存在信号为低电平)while(~sda==1); //18B20发出存在信号后,单片机等待18B20释放总线delay_ms(1); //释放总线后,延时一段时间,最好大于480us(这里为1ms)}/*函数功能:单片机向ds18b20发送(写)一个字节的数据传递参数:要发送的字节数据返回数值:无*/void ds18b20_write_byte(unsigned char dat){unsigned char i;bit b; //定义一个位变量,用来判断本次的发送的位数据为1还是为0 for(i=8;i>0;i--) //重复8次才能将一个字节的数据逐位发送出去{b=dat&0x01; //发送的数据是由低位到高位顺序发送的,这里取最低位的位数据给bdat=dat>>1; //右移一位,使要发送的位数据永远放在最低位if(b==0) //如果本次要发送的数据为0,那么就按如下的操作发送0{sda=0; //总线拉低,开始新的写时序_nop60_(); //使总线拉低至少持续60us(这里为60多us),以使18b20可以采样到数据0sda=1; //60多us的时间过去,发送0完毕后,释放总线,为传输下一位数据作准备_nop_(); //写每位数据之间至少要有1us的恢复时间的间隔}else //如果本次要发送的数据为1,那么就按如下的操作发送1{sda=0; //总线拉低,开始新的写时序_nop_(); //拉低持续时间要大于1us,但一定要小于15us,否则18b20将错过本次采样sda=1; //发送入数据1到总线,18b20将采样到此数据_nop60_(); //发送一位数据的时序时间要大于60us} //写0时,本来整个时序就大于60us了,不用刻意延时了,但写1时,要刻意延时!}}/*函数功能:单片机从18b20读一个字节的数据传递参数:无返回数值:读到的一个字节数据*/unsigned char ds18b20_read_byte(){unsigned char i;unsigned char dat=0; //用于接收读到的数据for(i=8;i>0;i--) //重复8次才能从18b20读出一个字节的数据{sda=0; //总线拉低,开始新的读时序dat>>=1; //右移一位,用最高位接收新收到的位数据,(数据从最低位到最高位顺序接收)_nop_(); //拉低持续时间要大于1us,但要小于15us,否则18b20发送的位数据将可能会失效sda=1; //释放总线,准备接收位数据if(sda==1) //如果接受到的位数据为1dat=dat|0x80; //那么我就让dat的最高位为1,(如果位数据为0呢,那么最高位还是0,不用管)_nop60_(); //读一位数据的时序时间要大于60us }return dat; //8个循环的读取位数据操作结束了,这样就读到了一个字节数据,将它返回}/*函数功能:从18b20获取两个字节的温度数据,并将这两个温度数据整合成一个16位的数据,并将这个数据返回传递参数:无返回数值:为整合后的16位的数据*/unsigned int get_temp_data(){unsigned char data1,data2; //用于接收从18b20读到的两个字节的数据unsigned int temp_data=0; //用于将data1和data2整合成一个16位数据ds18b20_init(); //初始化ds18b20_write_byte(0xcc); //由于只有一个18b20,我们跳过ROM检查ds18b20_write_byte(0x44); //让18b20进行温度转换,18b20会将转换得到的两位数据保存在内部RAM中while(sda==0); //单片机等待18b20温度转换结束,(12位精度最长转换时间为750ms)ds18b20_init(); //再次初始化ds18b20_write_byte(0xcc); //跳过检查ds18b20_write_byte(0xbe); //读取18b20内部RAM数据(主要是读前两个字节的温度数据)data1=ds18b20_read_byte(); //读取温度数据的低8位data2=ds18b20_read_byte(); //读取温度数据的高8位temp_data=temp_data|data2; //整合成16位的数据,将高字节数据放到temp_data=(temp_data<<8)|data1; //高8位,将低字节数据放到低8位return temp_data;}/*函数功能:获得16位温度数据的小数部分传递参数:整合后的16位温度数据返回数值:为实际的小数值乘以1000后的整数值,以利于传递和处理*/unsigned int ds18B20_data0_convert(unsigned int temp_data){if((temp_data&0xf800)==0) //如果数据的高5位全为0,说明为正温度{temp_data=(temp_data>>1)&0x0007;//整体右移一位再提取低3位数据(小数部分)temp_data=temp_data*125; //11位的温度分辨率放大1000倍后,再乘以小数部分//这样做是为了方便数据的传输与处理(到时还原即可)return temp_data; //返回放大1000倍的温度值的小数部分的温度值}else{ //如果数据的高5位全为1,说明为负温度temp_data=~temp_data+1; //负温度数据是以补码形式存放的,要取反加1才能得到真实数据temp_data=(temp_data>>1)&0x0007;//整体右移一位再提取低3位数据(小数部分)temp_data=temp_data*125;return temp_data;}}/*函数功能: 获得16位温度数据的整数部分传递参数:整合后的16位温度数据返回数值:提取出的温度数据的整数部分。
目录一、实验任务与要求二、总体设计三、硬件模块介绍1.单片机模块介绍2.温度传感器3.数码管4.报警电路四程序设计1.温度传感器初始化程序2.温度测量3.数码管显示4.温度报警五、程序流程图六、实验调试七、实验总结一、实验任务与要求1.利用用单片机完成温度的测量并显示2.了解温度传感器的工作原理3.了解锁存器的工作原理4.理解数码管的显示原理二、总体设计利用单片机接收温度传感器传过来的温度值并经过数值处理以动态方式显示于数码管上,利用while函数循环检测温度值,当温度值高于设定值时启动报警电路,报警电路主要由蜂鸣器实现。
三、硬件模块介绍1.单片机模块介绍实验中采用的是89C52。
该单片机是INTEL公司MCS-51系列单片机中基本的产品,它采用ATMEL公司可靠的CMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。
它结合了CMOS的高速和高密度技术及CMOS的低功耗特征,它基于标准的MCS-51单片机体系结构和指令系统,属于89C51增强型单片机版本。
具有以下特点:·标准MCS-51内核和指令系统·片内8kROM(可扩充64kB外部存储器)· 32个双向I/O口· 256x8bit内部RAM(可扩充64kB外部存储器)· 3个16位可编程定时/计数器·时钟频率3.5-12/24/33MHz·向上或向下定时计数器·改进型快速编程脉冲算法· 6个中断源· 5.0V工作电压·全双工串行通信口·布尔处理器—帧错误侦测· 4层优先级中断结构—自动地址识别·兼容TTL和CMOS逻辑电平·空闲和掉电节省模式· PDIP(40)和PLCC(44)封装形式原理图如下:2.温度传感器1.概述温度传感器采用的是由美国Dallas 半导体公司生产的数字化温度传感器DS1820 。
#include "head\\includes.h"; void lcd1602_delay(uchar delaytime)RSEG ?PR?_lcd1602_delay?LCD1602_lcd1602_delay:USING 0; SOURCE LINE # 9;---- Variable 'delaytime?040' assigned to Register 'R7' ----; {; SOURCE LINE # 10?C0001:; while(delaytime)delaytime--;; SOURCE LINE # 11MOV A,R7JZ ?C0003DEC R7SJMP ?C0001; }; SOURCE LINE # 12?C0003:RET; END OF _lcd1602_delay; void write_lcd1602_command(uchar write_command) //写LCD命令RSEG ?PR?_write_lcd1602_command?LCD1602_write_lcd1602_command:USING 0; SOURCE LINE # 13;---- Variable 'write_command?141' assigned to Register 'R6' ---- MOV R6,AR7; {; SOURCE LINE # 14; lcd1602_delay(10);; SOURCE LINE # 15MOV R7,#0AHLCALL _lcd1602_delay; /*; LCD1602_RS=0;; LCD1602_RW=0;; LCD1602_EN=1;//*/; LCD1602_CWORD=0;; SOURCE LINE # 20CLR AMOV DPTR,#LCD1602_CWORDMOVX @DPTR,A; LCD1602_CWORD=LCD1602_CWORD&LCD1602_RS_CLR; //RS=0,RW=0,E=0 ; SOURCE LINE # 21MOVX @DPTR,A; LCD1602_CON_PORT=LCD1602_CWORD;; SOURCE LINE # 22MOVX A,@DPTRMOV R7,AMOV DPTR,#0FF90HMOVX @DPTR,A;; LCD1602_CWORD=LCD1602_CWORD|LCD1602_EN_SET;//rs=0,rw=0,e=1; SOURCE LINE # 24MOV A,R7ORL A,#04HMOV DPTR,#LCD1602_CWORDMOVX @DPTR,A; LCD1602_CON_PORT=LCD1602_CWORD;//*/; SOURCE LINE # 25MOVX A,@DPTRMOV R7,AMOV DPTR,#0FF90HMOVX @DPTR,A; //OUTPOT COMMAND; LCD1602_DAT_PORT=write_command;; SOURCE LINE # 27MOV DPTR,#0FF80HMOV A,R6MOVX @DPTR,A; _nop_(); //空指令占用一个指令周期,精确延时; SOURCE LINE # 28NOP; _nop_(); //空指令占用一个指令周期,精确延时; SOURCE LINE # 29NOP; // LCD1602_EN=0;; LCD1602_CWORD=LCD1602_CWORD&LCD1602_EN_CLR;; SOURCE LINE # 31MOV A,R7ANL A,#0FBHMOV DPTR,#LCD1602_CWORDMOVX @DPTR,A; LCD1602_CON_PORT=LCD1602_CWORD;//*/; SOURCE LINE # 32MOVX A,@DPTRMOV R7,AMOV DPTR,#0FF90HMOVX @DPTR,A; _nop_(); //空指令占用一个指令周期,精确延时; SOURCE LINE # 33NOP; _nop_(); //空指令占用一个指令周期,精确延时; SOURCE LINE # 34NOP; // LCD1602_RW=1;; LCD1602_CWORD=LCD1602_CWORD|LCD1602_RW_SET;; SOURCE LINE # 36MOV A,R7ORL A,#08HMOV DPTR,#LCD1602_CWORDMOVX @DPTR,A; LCD1602_CON_PORT=LCD1602_CWORD;//*/; SOURCE LINE # 37MOV DPTR,#0FF90HMOVX @DPTR,A;; }; SOURCE LINE # 39RET; .\OUT\lcd1602.SRC generated from: USER_C\lcd1602.c; COMPILER INVOKED BY:; C:\Keil\C51\BIN\C51.EXE USER_C\lcd1602.c LARGE DEBUG OBJECTEXTEND PRINT(.\LIST\lcd1602.lst) SRC(.\OUT\lcd1602.SRC)$NOMOD51NAME LCD1602CCF2 BIT 0D8H.2TB80 BIT 098H.3SPI0CKR DATA 09DHCCF3 BIT 0D8H.3P0 DA TA 080HSPIEN BIT 0F8H.0CCF4 BIT 0D8H.4SM00 BIT 098H.7P1 DA TA 090HAA BIT 0C0H.2SM10 BIT 098H.6 WDTCN DATA 0FFHP2 DA TA 0A0HSM20 BIT 098H.5ADC0CF DATA 0BCHP3 DA TA 0B0HAC BIT 0D0H.6ADC1CF DATA 0ABHP4 DA TA 084HEIE1 DATA 0E6HP5 DA TA 085HEA BIT 0A8H.7EIE2 DATA 0E7HP6 DA TA 086HP7 DA TA 096HPSCTL DATA 08FH MSTEN BIT 0F8H.1CF BIT 0D8H.7ADC0CN DATA 0E8H DAC0CN DATA 0D4H DAC1CN DATA 0D7H ADC1CN DATA 0AAH P0MDOUT DATA 0A4H P1MDOUT DATA 0A5H IE DA TA 0A8HP2MDOUT DATA 0A6H P3MDOUT DATA 0A7H TMR3RLH DATA 093H EIP1 DATA 0F6HEIP2 DATA 0F7H PCA0CPH0 DATA 0FAH PCA0CPH1 DATA 0FBH P3IF D A TA 0ADHTMR3RLL DATA 092H PCA0CPH2 DATA 0FCH CR BIT 0D8H.6PCA0CPH3 DATA 0FDH EXF2 BIT 0C8H.6REN0 BIT 098H.4PCA0CPH4 DATA 0FEH PCA0CPL0 DATA 0EAH EMI0CF DATA 0A3H PCA0CPL1 DATA 0EBHPCA0CPM0 DATA 0DAH PCA0MD DATA 0D9H PCA0CN DATA 0D8H PCA0CPL2 DATA 0ECH PCA0CPM1 DATA 0DBH PCA0CPL3 DATA 0EDH PCA0CPM2 DATA 0DCH IP DA TA 0B8HPCA0CPL4 DATA 0EEH PCA0CPM3 DATA 0DDH PCA0CPM4 DATA 0DEH TXBSY BIT 0F8H.3CY BIT 0D0H.7SI BIT 0C0H.3XBR0 DATA 0E1H SADEN0 DATA 0B9H XBR1 DATA 0E2HEMI0CN DATA 0AFH SADEN1 DATA 0AEH XBR2 DATA 0E3H REF0CN DATA 0D1H SADDR0 DATA 0A9H SADDR1 DATA 0F3H AMX0CF DATA 0BAH AD0INT BIT 0E8H.5RCAP2H DATA 0CBHPS BIT 0B8H.4SP DA TA 081HRCAP4H DATA 0E5HEMI0TC DATA 0A1HOV BIT 0D0H.2SMB0CN DATA 0C0H RCAP2L DATA 0CAH MODF BIT 0F8H.5RCAP4L DATA 0E4H SMB0CR D ATA 0CFH CPT0CN DATA 09EHP1MDIN DATA 0BDH CPT1CN DATA 09FHSPI0CN DATA 0F8H PRT0CF DATA 0A4H PCON DATA 087H SPIF BIT 0F8H.7P74OUT DATA 0B5HTMOD DATA 089H TCON DATA 088H WCOL BIT 0F8H.6P16 BIT 090H.6AMX0SL DATA 0BBH P17 BIT 090H.7AMX1SL DATA 0ACH TMR3CN DATA 091H IE0 BIT 088H.1IE1 BIT 088H.3B DA TA 0F0HDAC0H DATA 0D3H ADC0H DATA 0BFH OSCICN DATA 0B2H DAC1H DATA 0D6H SMBFTE BIT 0C0H.1BUSY BIT 0C0H.7DAC0L DATA 0D2H ADC0L DATA 0BEH DAC1L DATA 0D5H ACC DATA 0E0HES0 BIT 0A8H.4AD0EN BIT 0E8H.7CT2 BIT 0C8H.1ET0 BIT 0A8H.1ET1 BIT 0A8H.3TF0 BIT 088H.5ET2 BIT 0A8H.5RI0 BIT 098H.0TF1 BIT 088H.7TF2 BIT 0C8H.7SMBTOE BIT 0C0H.0 TH0 DA TA 08CHEX0 BIT 0A8H.0TI0 BIT 098H.1IT0 BIT 088H.0PCA0H DATA 0F9HTH1 DA TA 08DHEX1 BIT 0A8H.2IT1 BIT 088H.2TH2 DA TA 0CDHP BIT 0D0H.0TH4 DA TA 0F5H OSCXCN DATA 0B1HTL0 DA TA 08AHPCA0L DATA 0E9HTL1 DA TA 08BHTL2 DA TA 0CCHPT0 BIT 0B8H.1TL4 DA TA 0F4HRS0 BIT 0D0H.3PT1 BIT 0B8H.3RS1 BIT 0D0H.4PT2 BIT 0B8H.5TR0 BIT 088H.4AD0TM BIT 0E8H.6TR1 BIT 088H.6TR2 BIT 0C8H.2PX0 BIT 0B8H.0PX1 BIT 0B8H.2SLVSEL BIT 0F8H.2DPH DATA 083H RCLK0 BIT 0C8H.5ADC0GTH DATA 0C5H TCLK0 BIT 0C8H.4DPL DA TA 082HADC0GTL DATA 0C4H SBUF0 DATA 099H SBUF1 DATA 0F2H ADC0LTH DATA 0C7H EXEN2 BIT 0C8H.3 RSTSRC DATA 0EFH FLACL DATA 0B7H CPRL2 BIT 0C8H.0 SCON0 DATA 098H SCON1 DATA 0F1H ADC0LTL DATA 0C6H T2CON DATA 0C8H STA BIT 0C0H.5T4CON DATA 0C9H SMB0ADR DATA 0C3H SMB0DAT DATA 0C2H SPI0CFG DATA 09AH TMR3H DATA 095H CKCON DATA 08EH RXOVRN BIT 0F8H.4 TMR3L DATA 094HAD0LJST BIT 0E8H.0F0 BIT 0D0H.5FLSCL DATA 0B6HAD0CM0 BIT 0E8H.2F1 BIT 0D0H.1STO BIT 0C0H.4ENSMB BIT 0C0H.6AD0CM1 BIT 0E8H.3SPI0DAT DATA 09BHADC0 DATA 0BEHAD0WINT BIT 0E8H.1ADC1 DATA 09CHAD0BUSY BIT 0E8H.4PSW DATA 0D0HCCF0 BIT 0D8H.0RB80 BIT 098H.2SMB0STA DATA 0C1HCCF1 BIT 0D8H.1?PR?_lcd1602_delay?LCD1602 SEGMENT CODE ?PR?_write_lcd1602_command?LCD1602 SEGMENT CODE ?PR?_write_lcd1602_data?LCD1602 SEGMENT CODE ?PR?read1602_cursor_addr?LCD1602 SEGMENT CODE ?PR?_LCD1602_write_dat?LCD1602 SEGMENT CODE ?PR?_LCD1602_write_char?LCD1602 SEGMENT CODE ?PR?_LCD1602_write_string?LCD1602 SEGMENT CODE ?PR?initial_lcd1602?LCD1602 SEGMENT CODE?XD?LCD1602 SEGMENT XDATAPUBLIC LCD1602_CWORDPUBLIC initial_lcd1602PUBLIC _LCD1602_write_stringPUBLIC _LCD1602_write_charPUBLIC _LCD1602_write_datPUBLIC read1602_cursor_addrPUBLIC _write_lcd1602_dataPUBLIC _write_lcd1602_commandPUBLIC _lcd1602_delayRSEG ?XD?LCD1602LCD1602_CWORD: DS 1lcd1602_cousor_addr: DS 1; #define uint unsigned int; #define ulint unsigned long int; #define uchar unsigned char; uchar LCD1602_CWORD;。