热电偶测温仪

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

内蒙古科技大学
智能仪表综合训练设计说明书
题目:热电偶测温仪
学生姓名:
学号:
专业:测控技术与仪器
班级:2010-1
指导教师:
本设计简要介绍了热电偶测温仪的测温原理、所用的硬器件结构与工作原理,并对其进行了硬件设计和软件设计,然后对其最终显示做了试验。

该热电偶测温仪的软件用C语言编写,采用模块化结构设计。

通过测定,验证测温仪的误差大小,以便可以工程使用。

该测温仪是以STC89C52RC单片机为核心,由K型热电偶测量温度,由MAX6675模块对数据进行冷端补偿、A/D转换、信号放大,采用LCD显示屏显示。

热电偶传感器是目前接触式测温中应用最广的热电式传感器,在工业用温度传感器中占有及其重要的地位,它结构简单、制造方便、测温范围宽、热惯性小、准确度高、输出信号便于远传,该热电偶采用K型镍铬-镍硅热电偶,测量范围在0—800℃之间,使用+5V电源。

关键词:热电偶测温仪;MAX6675;STC89C52RC单片机;热电偶
摘要 (I)
第一章设计方案 (1)
1.1 热电偶测温原理 (1)
1.2 热电偶测温仪系统 (1)
第二章硬件选型及设计 (3)
2.1 K型热电偶 (3)
2.2 MAX6675模块 (3)
2.3 STC89C52RC单片机 (8)
2.4 LCD液晶显示器 (12)
2.5硬件电路设计 (12)
第三章软件程序设计 (13)
3.1 主程序设计 (13)
3.2 数据读取程序设计 (13)
总结 (15)
参考文献 (16)
附录A 设计电路图 (17)
附录B 源程序 (18)
第一章设计方案
1.1 热电偶测温原理
热电偶传感器是目前接触式测温中应用最广的热电式传感器,在工业用温度传感器中占有及其重要的地位。

它结构简单、制造方便、测温范围宽、热惯性小、准确度高、输出信号便于远传。

热电偶传感器是一种将温度变化转化为电势变化的传感器,它是由两种不同的金属A和B构成一个闭合回路,当两个接触端温度不同,即T>T0时,回路中会产生热电势EAB(T,T0),如图1所示。

其中,T称为热端,T0称为冷端,A和B称为热电极。

热电势EAB(T,T0)的大小是由两种材料的接触电势和单一材料的温差电势所决定的。

EAB(T,T0)= E(T,Tn)+ E(Tn,T0)其中Tn是参考温度,T0零温。

图1.1 热电偶原理图
1.2 热电偶测温仪系统
基于热电偶的温度检测框图如图1.2,温度由K型热电偶检测,并经
MAX6675模块进行信号处理(信号放大、A/D转换、冷端补偿)。

STC89C52RC 单片机读取转换的数字信号并进行必要的处理后,将数据传给LCD1602显示器显示。

其中温度传感器选用的是K型热电偶(镍铬-镍硅热电偶),测温范围选用0—800度。

因为采用MAX6675模块,所以减轻了系统设计的很多难题,MAX6675是一个复杂的热电偶数字转换器,带有一个内置的12位模拟数字转换器模数转换
器(ADC)。

MAX6675还包含了冷结补偿传感和校正,数字控制器,一个SPI 兼容接口,以及相关的控制逻辑。

在MAX6675的目的是一起工作的外部微控制器或其他情报,恒温,过程控制,或监测应用。

热电偶
MAX6675STC89C52RC LCD1602(0-800℃)
图1.2热电偶测温仪方框图
第二章硬件选型及设计
本设计使用的硬件主要有K型热电偶、MAX6675模块、STC89C52RC单片机、1602LCD显示器。

下文将对所有器件进行说明。

2.1 K型热电偶
K型热电偶材料主要采用的是镍铬-镍硅合金构成,它是一种能测量较高温度的性价比很高的热电偶,是工业自动化控制中最常用的一种热电偶。

由于镍铬-镍硅合金具有较好的高温抗氧化性,可适用于氧化性或中性介质中。

因此这种K型热电偶可长期测量1000度的高温,短期可测到1200度。

但是,它不能用于还原性介质中,否则,很快腐蚀损坏,在此情况下只能用于500度以下的测量。

它比S型热偶要便宜很多,它的重复性很好,产生的热电势大,因而灵敏度很高,而且它的线性很好。

虽然其测量精度略低,但完全能满足工业测温要求,所以它是工业上最常用的热电偶。

总结起来K型热电偶主要有三方面优点:1.热电动势之直线性良好;
2.1000℃以下耐氧化性良好;
3.在溅金属热电偶中安定性属良好。

K型热电偶存在着以下三方面的缺点:1.不适用于还元性气体环境,特别是一氧化碳、二氧化硫、硫化氢等气体;2.热电动势与贵金属热电偶相比较时变化较大;3.受Greem rot之影响会产生误差。

2.2 MAX6675模块
热电偶作为一种主要的测温元件,具有结构简单。

制造容易。

使用方便。

测温范围宽。

测温精度高等特点。

但是将热电偶应用在基于单片机的嵌入式系统领域时,却存在着以下几方面的问题。

①非线性:热电偶输出热电势与温度之间的关系为非线性关系,因此在应用时必须进行线性化处理。

②冷补偿:热电偶输出的热电势为冷端保持为0℃时与测量端的电势差值,而在实际应用中冷端的温度是随着环境温度而变化的,故需进行冷端补偿。

③数字化输出:与嵌入式系统接口必然要采用数字化输出及数字化接口,而作为模拟小信号测温元件的热电偶显然法直接满足这个要求。

因此,若将热电偶应用于嵌入式系统时,须进行复杂的信号放大、A/D转换、数据线性化、温度补偿及数字化输出接口等软硬件设计。

如果能将上述的功能集成到一个集成电路芯片中,即采用单芯片来完成信号放
大、冷端补偿、线性化及数字化输出功能,则将大大简化热电偶在嵌入式领域的应用设计。

Maxim公司推出的MAX6675即是一个集成了热电偶放大器、冷端补偿、A/D 转换器及SPI串口的热电偶放大器与数字转换器。

MAX6675是一个复杂的热电偶数字转换器,带有一个内置的12位模拟数字转换器模数转换器(ADC)。

MAX6675还包含了冷端补偿传感和校正,数字控制器,一个SPI兼容接口,以及相关的控制逻辑。

图2.1典型电路连线图
【1】性能特点
MAX6675的主要特性如下
1、简单的SPI串行口温度值输出
2、0℃~ 1024℃的测温范围
3、片内冷端补偿
4、高阻抗差动输入
5、热电偶断线检测
6、单一 5V的电源电压
7、低功耗特性
8、工作温度范围-20℃~ 85℃
9、2000V的ESD信号
表2.1 MAX6675引脚功能
引脚名称功能
1 GND 接地端
2 T- K型热电偶负极
3 T+ K型热电偶正极
4 VCC 正电源端
5 SCK 串行时钟输入
6 CS 片选端,CS为低时、启动串行接口
7 SO 串行数据输出
8 NC 空引脚
【2】工作原理
该器件是一复杂的单片热电偶数字转换器,内部具有信号调节放大器、12位的模拟/数字化热电偶转换器、冷端补偿传感和校正、数字控制器、1个SPI 兼容接口和1个相关的逻辑控制。

图2.2 MAX6675内部结构框图
(1)温度变换
MAX6675内部具有将热电偶信号转换为与ADC输入通道兼容电压的信号调节放大器,T和T-输入端连接到低噪声放大器A1,以保证检测输入的高精度,同时使热电偶连接导线与干扰源隔离。

热电偶输出的热电势经低噪声放大器A1放大,再经过A2电压跟随器缓冲后,被送至ADC的输入端。

在将温度电压值转换为相等价的温度值之前,它需要对热电偶的冷端温度进行补偿,冷端温度即是MAX6675周围温度与0℃实际参考值之间的差值。

对于K型热电偶,电压变化率为41μV/℃,电压可由线性公式Vout=(41μV/℃)×(tR-tAMB)来近似热电偶的特性。

上式中,Vout为热电偶输出电压(mV),tR是测量点温度;tAMB是周围温度。

(2)冷端补偿
热电偶的功能是检测热冷两端温度的差值,热电偶热节点温度可在0℃~1023.75℃范围变化。

冷端即安装MAX6675的电路板周围温度,温度在-20℃~85℃范围内变化。

当冷端温度波动时,MAX6675仍能精确检测热端的温度变化。

MAX6675是通过冷端补偿检测和校正周围温度变化的。

该器件可将周围温度通过内部的温度检测二极管转换为温度补偿电压,为了产生实际热电偶温度测量值,MAX6675从热电偶的输出和检测二极管的输出测量电压。

该器件内部电路将二极管电压和热电偶电压送到ADC中转换,以计算热电偶的热端温度。

当热电偶的冷端与芯片温度相等时,MAX6675可获得最佳的测量精度。

因此在实际测温应用时,应尽量避免在MAX6675附近放置发热器件或元件,因为这样会造成冷端误差。

(3)热补偿
在测温应用中,芯片自热将降低MAX6675温度测量精度,误大小依赖于MAX6675封装的热传导性。

安装技术和通风效果。

为降低芯片自热引起的测量误差,可在布线时使用大面积接地技术提高MAX6675温度测量精度。

(4)噪声补偿
MAX6675的测量精度对电源耦合噪声较敏感。

为降低电源噪声影响,可在MAX6675的电源引脚附近接入1只0.1μF陶瓷旁路电容。

(5)测量精度的提高
热电偶系统的测量精度可通过以下预防措施来提高:①尽量采用不能从测量
区域散热的大截面导线;②如必须用小截面导线,则只能应用在测量区域,并且在无温度变化率区域用扩展导线;③避免受能拉紧导线的机械挤压和振动;④当热电偶距离较远时,应采用双绞线作热电偶连线;⑤在温度额定值范围内使用热电偶导线;⑥避免急剧温度变化;⑦在严劣环境中,使用合适的保护套以保证热电偶导线;⑧仅在低温和小变化率区域使用扩展导线;⑨保持热电偶电阻的事件记录和连续记录。

(6)SPI串行接口
MAX6675采用标准的SPI串行外设总线与MCU接口,且MAX6675只能作为从设备。

MAX6675 SO端输出温度数据的格式如图2.5所示,MAX6675 SPI接口时序如图2.4所示。

MAX6675从SPI串行接口输出数据的过程如下:MCU使CS变低并提供时钟信号给SCK,由SO读取测量结果。

CS变低将停止任何转换过程;CS变高将启动一个新的转换过程。

一个完整串行接口读操作需16个时钟周期,在时钟的下降沿读16个输出位,第1位和第15位是一伪标志位,并总为0;第14位到第3位为以MSB到LSB顺序排列的转换温度值;第2位平时为低,当热电偶输入开放时为高,开放热电偶检测电路完全由MAX6675实现,为开放热电偶检测器操作,T-必须接地,并使能地点尽可能接近GND脚;第1位为低以提供MAX6675器件身份码,第0位为三态。

图2.3 串行接口时序
图2.4 SO端输出数据的格式
2.3 STC89C52RC单片机
(1)主要特性
1. 增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051。

2. 工作电压:5.5V~
3.3V(5V单片机)/3.8V~2.0V(3V单片机)。

3. 工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz。

4. 用户应用程序空间为8K字节
5. 片上集成512字节RAM
6. 通用I/O口(32个),复位后为:P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。

7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片。

8. 具有EEPROM功能
9. 具有看门狗功能
10. 共3个16位定时器/计数器,即定时器T0、T1、T2。

11. 外部中断4路,下降沿中断或低电平触发电路,Power Down模式可由外部中断低电平触发中断方式唤醒。

12. 通用异步串行口(UART),还可用定时器软件实现多个UART。

13. 工作温度范围:-40~+85℃(工业级)/0~75℃(商业级)。

14. PDIP封装
(2)STC89C52RC单片机的工作模式
● 掉电模式:典型功耗<0.1μA,可由外部中断唤醒,中断返回后,继续执行原
程序。

● 空闲模式:典型功耗2mA
● 正常工作模式:典型功耗4Ma~7mA
● 掉电模式可由外部中断唤醒,适用于水表、气表等电池供电系统及便携设备。

图2.5 STC89C52RC硬件电路图
(3)STC89C52RC引脚功能
VCC(40引脚):电源电压
VSS(20引脚):接地
P0端口(P0.0~P0.7,39~32引脚):P0口是一个漏极开路的8位双向I/O 口,作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。

在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线,此时,P0口内部上拉电阻有效。

在Flash ROM编程时,P0端口接收指令字节;而在校验程序时,则输出指令字节。

验证时,要求外接上拉电阻。

P1端口(P1.0~P1.7,1~8引脚):P1口是一个带内部上拉电阻的8位双向I/O口。

P1的输出缓冲器可驱动(吸收或者输出电流方式)4个TTL输入。

对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。

P1口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电流()。

此外,P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),具体参见下表:
在对Flash ROM编程和程序校验时,P1接收低8位地址。

表2.2 P1.0和P1.1引脚复用功能
引脚号功能特性
P1.0 T2(定时器/计数器2外部计数输入),时钟输出
P1.1 T2EX(定时器/计数器2捕获/重装触发和方向控制)
P2端口(P2.0~P2.7,21~28引脚):P2口是一个带内部上拉电阻的8位双向I/O端口。

P2的输出缓冲器可以驱动(吸收或输出电流方式)4个TTL输入。

对端口写入1时,通过内部的上拉电阻把端口拉到高电平,这时可用作输入口。

P2作为输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流()。

在访问外部程序存储器和16位地址的外部数据存储器(如执行“MOVX @DPTR”指令)时,P2送出高8位地址。

在访问8位地址的外部数据存储器(如执行“MOVX @R1”指令)时,P2口引脚上的内容(就是专用寄存器(SFR)区中的P2寄存器的内容),在整个访问期间不会改变。

在对Flash ROM编程和程序校验期间,P2也接收高位地址和一些控制信号。

P3端口(P3.0~P3.7,10~17引脚):P3是一个带内部上拉电阻的8位双向I/O端口。

P3的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。

对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。

P3做输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输入一个电流()。

在对Flash ROM编程或程序校验时,P3还接收一些控制信号。

P3口除作为一般I/O口外,还有其他一些复用功能,如下表所示:
表2.3 P3口引脚复用功能
引脚号复用功能
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2
(外部中断0)
P3.3
(外部中断1)
P3.4 T0(定时器0的外部输入)
P3.5 T1(定时器1的外部输入)
P3.6
(外部数据存储器写选通)
P3.7
(外部数据存储器读选通)
RST(9引脚):复位输入。

当输入连续两个机器周期以上高电平时为有效,用来完成单片机单片机的复位初始化操作。

看门狗计时完成后,RST引脚输出96个晶振周期的高电平。

特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。

DISRTO默认状态下,复位高电平有效。

ALE/(30引脚):地址锁存控制信号(ALE)是访问外部程序存储器时,
锁存低8位地址的输出脉冲。

在Flash编程时,此引脚()也用作编程输入脉冲。

在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。

然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。

如果需要,通过将地址位8EH的SFR的第0位置“1”,ALE操作将无效。

这一位置“1”,ALE仅在执行MOVX或MOV指令时有效。

否则,ALE将被微弱拉高。

这个ALE使能标志位(地址位8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。

(29引脚):外部程序存储器选通信号()是外部程序存储器选通信号。

当AT89C51RC从外部程序存储器执行外部代码时,在每个机器周期被激活两次,而访问外部数据存储器时,将不被激活。

/VPP(31引脚):访问外部程序存储器控制信号。

为使能从0000H到FFFFH 的外部程序存储器读取指令,必须接GND。

注意加密方式1时,将内部锁定位RESET。

为了执行内部程序指令,应该接VCC。

在Flash编程期间,也
接收12伏VPP电压。

XTAL1(19引脚):振荡器反相放大器和内部时钟发生电路的输入端。

XTAL2(18引脚):振荡器反相放大器的输入端。

2.4 LCD液晶显示器
1602LCD 分为带背光和不带背光两种,基控制器大部分为 HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别。

(1)1602LCD 主要技术参数:
显示容量:16×2 个字符
芯片工作电压:4.5—5.5V
工作电流:2.0mA(5.0V)
模块最佳工作电压:5.0V
字符尺寸:2.95×4.35(W×H)mm
(2)引脚功能说明
1602LCD 采用标准的 14脚(无背光)或 16脚(带背光)接口,各引脚接口说明如表2.4
表2.4 引脚接口说明
编号符号引脚说明编号符号引脚说明
1 VS 电源地9 D
2 数据
2 VDD 电源正极10 D
3 数据
3 VL 液晶显示偏压11 D
4 数据
4 RS 数据/命令选择12 D
5 数据
5 R/W 读/写选择13 D
6 数据
6 E 使能信号14 D
7 数据
7 D0 数据15 BLA 背光源正极
8 D1 数据16 BLA 背光源正极2.5硬件电路设计
本设计是以STC89C52RC单片机为核心,K型热电偶采集数据,由MAX6675模块对数据进行处理,并最终由LCD显示器显示。

则其具体硬件连线应参考第2章有关内容,在PROTEUS 软件中查找器件并进行初步设计,经检查无误后最终确定硬件接线图如附录A设计电路图接线所示。

第三章软件程序设计
本热电偶测温仪的软件程序用C语言编写,采用模块化结构设计,设计源程序见附录B。

3.1 主程序设计
本设计以89C52RC单片机为核心,以K型热电偶和MAX6675作为测温电路,1062LCD显示器显示,因此程序设计框图如下:
开始
初始化
读MAX6675串行数据
故障显示
热电偶开路


数据处理
调用显示子程序
图3.1 程序设计流程图
3.2 数据读取程序设计
系统软件设计主要指数据采集设计,数据采集设计重点在测量电路MAX6675 测温数据的读取,MAX6675与单片机通讯。

在测温时,通过89C52RC 单片机的
P2 口向译码器输人端输入信号来选择热电偶通道。

MAX6675的工作时序如图2.3所示,当CS引脚由高电平变为低电平时,MAX6675停止任何信号的转换并在时钟SCK的作用下向外输出已转换的数据;当CS 从低电平变回到高电平时,M
AX6675 将进行新一轮转换。

数据的读取在SCK 的下降沿进行,一个完整的数据读取需要 l6 个时钟周期。

MAX6675 的输出数据为l6位,输出时高位在前,低位在后。

第一位D15为
无用位;第 D14一 D3 为热电偶模拟输出电势转换的12位数字量;D2位为热电偶断线检测位,当D2位为1时表明热电偶断线;D1位为MAX6675标识符;DO 为三态。

读取MAX6675数据流程如下:
开始
初始化
读D15
读高四位:D14-
D11

计数器=0?

读低八位:D10-D3

计数器=0?

读断偶标志位D2
返回
图3.2 读取MAX6675数据流程图
总结
本热电偶测温仪设计以89C52单片机为核心,采用K型热电偶和MAX6675 作为温度测量电路,简化了冷端补偿和A/D转换及信号放大线性化处理等电路,使硬件电路具有结构简单、体积小、控制方便、可靠性高等优点,又提高了系统可靠性和抗干扰性;同时还可以针对不同热电偶、不同测温要求,可以通过更改程序部分改变该测温仪的测温范围;采用1602LCD显示器显示,可以显示多位有效数据。

本次智能仪表课程设计是第一次要求实物设计的课设,给我带来了不小的挑战。

从思路整理、资料搜集到硬件选型、程序编写调试,每一个环节都给我带来了不小的压力。

设计过程中不仅要查阅关于MAX667等模块资料,还要学习Altium designer、protues等软件的使用。

虽然遇到的困难不少,但是在每周两次的答疑中,孙老师细心耐心地指导,同时给我的设计指出很多不足之处,在此非常感谢孙老师的指导。

回顾起此次课程设计,至今我仍感慨颇多,的确,从选题到定稿,从理论到实践,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

参考文献
[1] 李文涛,余福兵.基于STM32单片机的电阻炉智能温度控制器的设计.内蒙古科技大学信息工程学院,2011.
[2] 闶继明,江世明.传感技术与应用[M].长沙:中南大学出版社,2006.
[3] 韩玉杰,蒋云飞,张榆.基于MAX6675 的烘炉温度追踪仪的研究及设计.自动化仪表,2006,27(5):59—61.
[4] 永雄.新编单片机原理与应用[M].西安:西安电子科技大学出版社,2003.
[5] 刘洪恩.(淮安信息技术学院,江苏淮安)利用热电偶转换器的单片机温度测控系统.
[6] 乔和,陈彬.基于ARM的智能温控系统设计[J].辽宁工程技术大学学报(自然学版),2009,28(5):792 ~797.
[7] 霍振宇.基于模糊PID的加热炉炉温控制系统[J].化工自动化及仪表,2011,38(9):1136 ~1137.
[8] 郭焕刚,侯力,李东占.电阻炉温度控制系统总体设计[J].机械设计与制造,2009,(6):52 ~54.
[9] 孙立红,杜劲松.多路温度测控系统的设计[J].沈阳建筑大学学报,2005,21(3):264-267.
[10] 祖一康.基于K型热电偶与MAX6675多路温度采集系统.江西理工大学机电工程学院,2007.
[11] 方建淳,复东培.带基准点补偿功能的热电偶放大器及其应用.1994.
[12] 沈建华,杨艳琴,翟晓曙.MSP430系列16位超低功耗单片机原理与应用[M].北京:清华大学出版社,2004,21(8):105-139.
[13] 李彬,王朝阳,卜涛,于学伟.基于MSP430F149的最小系统设计[J].中国科技核心期刊,2009,28(12):74-76.
[14] 高海涛.基于C8051F350单片机的智能温度变送器[P].传感器世界,2010,33(3):33-35.
[15] 胡紫英,谭立志,周维龙.基于FPGA 的智能温度变送器的设计[DB].微计算机信息,2010,26(42):98-123.
附录A 设计电路图
XTAL2
18
XTAL1
19
ALE 30EA
31PSEN 29RST
9
P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD7
32
P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78
P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD
17
P3.6/WR 16P3.5/T115P2.7/A15
28
P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427T-2
T+3
SO 7SCK 5CS
6U2
MAX6675
R1
10k
C2
1nF
X1CRYSTAL
C1
1nF
C3
1nF
101.00
+
-
CJ
TC1
TCB
D7
14
D613D512D411D310D29D18D07E
6
R W 5RS 4VSS 1VDD 2VEE
3
LCD1
LM016L
附录B 源程序
#include <reg51.h>
#include<intrins.h>
#define LINE1 0
#define LINE2 1
#define LINE1_HEAD 0x80
#define LINE2_HEAD 0xC0
#define LCD_DELAY_TIME 40
#define DATA_MODE 0x38
#define OPEN_SCREEN 0x0C
#define DISPLAY_ADDRESS 0x80
#define CLEARSCREEN LCD_en_command(0x01)
#define HIGH 1
#define LOW 0
#define TRUE 1
#define FALSE 0
#define ZERO 0
#define MSB 0x80
#define LSB 0x01
#define LCDIO P0
sbit LCD1602_RS=P1^0;
sbit LCD1602_RW=P1^1;
sbit LCD1602_EN=P1^2;
sbit MAX6675_SO=P2^2;
sbit MAX6675_SCK=P2^0;
sbit MAX6675_CS=P2^1;
unsigned char data disdata[5];
unsigned int Value;
void LCD_delay(void);
void LCD_en_command(unsigned char command);
void LCD_en_dat(unsigned char temp);
void LCD_set_xy( unsigned char x, unsigned char y );
void LCD_write_char( unsigned x,unsigned char y,unsigned char dat); void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s); void LCD_init(void);
void delay_nms(unsigned int n);
unsigned int ReadMAX6675()
{
unsigned char count;
MAX6675_CS=1;
MAX6675_CS=0;
MAX6675_SCK=1;
Value=0;
for(count=16;count>0;count--)
{
MAX6675_SCK=0;
Value=Value<<1;
if(MAX6675_SO==1)
Value|=0x0001;
else
Value&=0xffff;
MAX6675_SCK=1;
}
MAX6675_CS=1;
return Value;
}
void tempdisp()
{
unsigned int temp;
unsigned int TempValue;
unsigned int testD2;
unsigned int xiaoshu;
TempValue=ReadMAX6675(); TempValue=TempValue<<1;
TempValue=TempValue>>4;
xiaoshu=TempValue*10;
TempValue=TempValue/4;
xiaoshu=xiaoshu/4;
if(TempValue>=1024)
{TempValue=1024;}
disdata[0]=(TempValue/1000)%10+0x30; disdata[1]=(TempValue/100)%10+0x30; disdata[2]=(TempValue/10)%10+0x30; disdata[3]=(TempValue)%10+0x30; disdata[4]=xiaoshu%10+0x30;
if(disdata[0]==0x30)
{
LCD_write_char(4,LINE2,0x20);
if(disdata[1]==0x30)
{ LCD_write_char(5,LINE2,0x20);
if(disdata[2]==0x30)
LCD_write_char(6,LINE2,0x20);
else LCD_write_char(6,LINE2,disdata[2]); }
else
{ LCD_write_char(5,LINE2,disdata[1]); LCD_write_char(6,LINE2,disdata[2]);
}
}
else
{
LCD_write_char(4,LINE2,disdata[0]);
LCD_write_char(5,LINE2,disdata[1]);
LCD_write_char(6,LINE2,disdata[2]);
}
LCD_write_char(6,LINE2,disdata[2]);
LCD_write_char(7,LINE2,disdata[3]);
LCD_write_char( 8,LINE2,0X2e);
LCD_write_char(9,LINE2,disdata[4]);
LCD_write_char( 10,LINE2,0XDF);
LCD_write_char( 11,LINE2,0X43);
}
void main(void)
{
LCD_init();
CLEARSCREEN;
delay_nms(10);
LCD_write_string(0,LINE1,"temperature TEST"); while(TRUE )
{
tempdisp();
delay_nms(220); }}
void LCD_delay(void)
{
unsigned char i;
for(i=LCD_DELAY_TIME;i>ZERO;i--)
}
void LCD_en_command(unsigned char command) {
LCD_delay();
LCD1602_RS=LOW;
LCD1602_RW=LOW;
LCD1602_EN=HIGH;
LCDIO=command;
LCD1602_EN=LOW;
}
void LCD_en_dat(unsigned char dat)
{
LCD_delay();
LCD1602_RS=HIGH;
LCD1602_RW=LOW;
LCD1602_EN=HIGH;
LCDIO=dat;
LCD1602_EN=LOW;
}
void LCD_set_xy( unsigned char x, unsigned char y )
{
unsigned char address;
if (y == LINE1)
address = LINE1_HEAD + x;
else
address = LINE2_HEAD + x;
LCD_en_command(address);
}void LCD_write_char( unsigned x,unsigned char y,unsigned char dat) {
LCD_set_xy( x, y );
LCD_en_dat(dat);
}
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) {
LCD_set_xy( X, Y );
while (*s)
{
LCDIO=*s;
LCD_en_dat(*s); s ++; }}
void LCD_init(void)
{ CLEARSCREEN;//clear screen
LCD_en_command(DATA_MODE);
LCD_en_command(DATA_MODE);
LCD_en_command(DATA_MODE);
LCD_en_command(DATA_MODE);
LCD_en_command(OPEN_SCREEN);
LCD_en_command(DISPLAY_ADDRESS);/
CLEARSCREEN;}
void delay_nms(unsigned int n)
{
unsigned int i=0,j=0;
for (i=n;i>0;i--)
for (j=0;j<1140;j++);
}。

相关文档
最新文档