系统调试及结果 
六、总结 通过本次课设,了解了好多知识,首先,对于思路上来说,首先要确定方案,这次课设从起初选择DS18B20不能够精确地测量人体体温,听从老师的建议后,改用热敏电阻,经过查资料后,选择了几种方案,一个是利用桥式电路测输出电压,还有就是用串联分压进行测量。因为桥式电路没有很好的测量出,所以本系统使用串联分压式。其次,做课设要靠自己的努力去完成,不能靠其他人,或者走捷径。本人就是通过查找资料自己确定一个方向,通过同学的指导,完成了软件部分的编程。最后,经过自己的努力以及别人的帮助,我成功地做出了数字体温计的实物,并用它测出了人体指尖的温度,误差也在允许的范围之内。 总之,这次的单片机课程的设计,在一次一次地查找资料过程中让我再一次了解单片机的工作原理,增加了自己的知识面,对今后的学习生活有很大的帮助。 附录一: 电路图 
附录二 实物图  引言
随着以知识经济为特征的信息化时代的到来人们对仪器仪表的认识更加深入,温度作为一个重要的物理量,是工业生产过程中最普遍,最重要的工艺参数之一。随着工业的不断发展,对温度的测量的要求也越来越高,而且测量的范围也越来越广,对温度的检测技术的要求也越来越高,因此,温度测量及其测量技术的研究也是一个很重要的课题。
目录
方案的选择1
1.1方案一1
1.2方案二1
硬件电路简介2
2.1AT89C51简介2
ADC0809简介5
2.3 LCD1602简介8
软件设计11
3.1 主程序流程图11
3.2 部分程序11
四、硬件电路图12
4.1 温度检测原理12
4.2 A/D转换部分硬件电路图13
4.3 显示部分硬件电路图14
五、系统调试及结果14
六、总结15
附录一16
附录二17
附录三17
一、方案的选择
1.1方案一
本方案主要是在温度检测部分利用了一款新型的温度检测芯片DS18B20,这个芯片大大简化了温度检测模块的设计,它无需A/D转换,可直接将测得的温度值以二进制形式输出。该方案的原理框图如图1.1和所示:
图1.1 方案(一)系统结构框图
DS18B20是美国达拉斯半导体公司生产的新型温度检测器件,它是单片结构,无需外加A/D即可输出数字量,通讯采用单线制,同时该通讯线还可兼作电源线,即具有寄生电源模式。它具有体积小、精度易保证、无需标定等特点,特别适合与单片机合用构成智能温度检测及控制系统。
1.2 方案二
温度检测部分采用传统的热敏电阻,热敏电阻的阻值随环境温度变化而变化,经A/D转换器ADC0809将其转换为单片机可识别得二进制数字量,单片机主要控制LCD显示器显示正确的温度值,LCD显示器实现显示功能。原理框图如图1.2所示
图1.2 方案二系统结构图
方案(二)与方案(一)相比,它最大的特点就是它能检测的温度范围很大,热敏电阻的性能决定了整个设计的所能检测的温度范围。方案(一)的温度检测范围已经由系统中的DS18B20的特性所决定,它能检测的温度范围为-55℃到120℃,且误差在0.5℃,其温度检测范围很宽,已能足够满足一般测量需要,从整体上来看方案(二)比方案(一)更具有实际的锻炼意义,因为我们方案(一)是利用现有的智能温度传感芯片DS18B20,他无需A/D转换,直接输出数字量,所以本设计中所使用的温度测量电路是方案(二)的电路。
2.2 ADC0809介绍 ADC0809是8位逐次逼近式ADC转换器,它能分时地对8路模拟量信号进行AD转换,结果为8位二进制数据。 ADC0809的主要功能如下: - 分辨率为8位
- 总的不可调误差在±1/2LSB和1LSB范围内
- 典型转换时间为100μs
- 具有锁存控制的8路多路开关
- 具有三态缓冲输出控制
- 单一+5V供电,此时输入范围为0~+5V
- 输出与TTL兼容
- 工作温度范围-40~85℃
ADC0809的引脚功能: 引脚图如图2.2 (1)8路模拟电压输入线(共8根):IN7~IN0:用于输入被转换的模拟电压。 (2)地址输入和控制线(共4根):C、B、A:3根地址线,与ALE配合使用可控制8路模拟开关工作,达到选择模拟量输入通道的作用。 ALE:地址锁存允许输入线,高电平有效。当ALE线为高电平时,C、B、A这三条地址线上的地址信号得以锁存。 (3)数字量输出及控制线(共11根):START:“启动脉冲”输入线,该线上的正脉冲由CPU送来,宽度应大于100ns,上升沿清零SAR,下降沿启动ADC工作。 EOC:转换结束输出线,该线上的高电平表示AD转换已经结束,数字量已锁入“三态输出锁存器”。 D7~D0:数字量输出线,共8根。D7为最高位。 OE:“输出允许”线,高电平时能使用D7~D0引脚上输出转换后的数字量。 (4)电源线及其他(5根):CLOCK:时钟输入线,用于为ADC0809提供逐次比较所需640kHz时钟脉冲序列。 Vcc:+5V正电源电压输入线。 GND:地线。
图2.2 ADC0809引脚图 ADC0809真值表如表1: 表1 ADC0809真值表 2.3 LCD1602简介 LCD1602是一种专门用来显示字母、数字、符号等的点阵型液晶模块,每行显示16个字符,一共可显示两行。它的温度范围很窄,通常为0~+55℃,存储范围为-22~+60℃。引脚图如图2.3 
图2.3 LCD1602引脚图 显示容量:16×2个字符。 工作电压:4.5~5.5V。 模块最佳工作电压:5.0V。 字符尺寸:2.95㎜×4.35㎜(W×H)。 (2)引脚功能 1脚:Vss,电源地。 2脚:Vᴅᴅ,电源正极。 3脚:Vᴇᴇ,液晶显示器对比度调整端,接正电源时,对比度最弱,接地时对比度最高。对比度过高会会产生“鬼影”,使用时,可通过一个10kΩ的电位器调整度。 4脚:RS,数据/命令选择端,高电平时选择数据寄存器,低电平时,选择指令寄存器。 5脚:R/ ,读写信号线。高电平时进行读操作,低电平时进行写操作。4、5脚合作完成的功能如表2: 表2 4、5引脚合作功能表 | R/ (5) | | | | | | | | | | | | | |
6脚:E,使能端。当E端为下降沿(高电平变成低电平)时,液晶模块写指令或写数据;当E为高电平时,为读状态或读数据。4~6脚共同合作实现的功能如表3: 表3 4~6引脚合作功能表 | R/ (5) | | | | | | | | | | | | | | | | | | |
7~14脚:DB0~DB7,8位双向数据线。 15脚:背光源正极。 16脚:背光源负极。 (3)RAM和ROM以及地址映射 DDRAM就是显示数据RAM,用来寄存待显示的字符代码,共80个字节,这80个字节的地址为00H~27H和40H~67H,每一个地址内可以装载一个待显示的字符代码。 DDRAM中80个字节地址与屏幕的对应关系如下: DDRAM字节地址与1602液晶屏幕的对应关系如下: 三、软件设计 3.1 主程序流程图
四、硬件电路图 4.1 温度检测原理 
本系统温度部分硬件电路部分采用串联分压式电路,由图可知所需测得温度为25℃至45℃,在温度为25℃时,热敏电阻的阻值是100k,串联一个50k的普通电阻进行分压,可知 
由上式可知,当温度变化时,阻值减小,输出电压Vo也会变化,所以A/D转换后的值也会有所不同,利用查表法进行显示,显示出准确的温度值。 可以根据热敏电阻阻值和温度的关系以及Vo和阻值的关系,事先制作一张Vo(V)~t(℃)的关系表,存入单片机内部ROM中,以便通过查表的方式根据电压值得到温度值。 
4.3显示部分硬件电路图 
单片机源程序如下:
- ;********************************************************************
- ; 基于AT89C51的数字体温计
- ;********************************************************************
- SHIWEI EQU 32H;
- GEWEI EQU 33H;
- HUANCUN EQU 36H;
- CLOCK BIT P2.4;
- ST BIT P3.2;
- EOC BIT P3.1;
- D_A BIT P2.3;
- D_B BIT P2.2;
- D_C BIT P2.1;
- E BIT P2.7;
- RW BIT P2.5;
- RS BIT P2.6;
- ORG 0000H;
- LJMP START;
- ORG 000BH;
- LJMP INT_T0;
- ORG 0100H;
- ;***********主程序开始******************************************************
- START: LCALL LCDINIT;调用液晶显示屏初始化程序
- LCALL TISHI1;
- LCALL TISHI2;
- ;*********************************************************************************
- ; 温度部分
- ;*******************************************************************************
- BEGIN: MOV TMOD,#02H;
- MOV TH0,#236; 定时钟频位50khz
- MOV TL0,#236;
- MOV IE,#82H; 开T0中断
- SETB TR0; 启动定时器
- CLR D_A; AD0809选择IN0通道
- CLR D_B;
- CLR D_C;
- WEN:
- CLR ST;
- SETB ST;
- CLR ST;启动AD转换
- JNB EOC,$; 等待转换结束
- LCALL DELAY1S;
- ;*********查表法得到转换值*********************************
- MOV HUANCUN,P1;
- MOV DPTR,#TAB1
- MOV A,HUANCUN
- MOVC A,@A+DPTR
- ;*********将查表得到的值转换成BCD码**********************
- MOV B,#10
- DIV AB
- MOV SHIWEI,A
- MOV GEWEI,B
- ;*********显示整数部分的温度值**************************
- XIANSHI: MOV A,#0C5H;
- LCALL WRC;
- NOP
- MOV R0,#32H; 显示温度的十位、个位
- WDA1: MOV A,@R0
- ADD A,#30H; 转换成ASCII码
- LCALL WRD; 写数据
- INC R0;
- CJNE R0,#34H,WDA1; 判断温度是否显示完
- ;*********显示小数点***********************************************************
- DIAN: MOV A,#0C7H; 显示小数点
- LCALL WRC;
- MOV A,#2EH;
- LCALL WRD;
- ;*********查表得小数部分得温度值********************************************
- MOV DPTR,#TAB2
- MOV A,HUANCUN
- MOVC A,@A+DPTR
- ;*********将小数部分的值转换成BCD码**********************************************************************
- MOV B,#10
- DIV AB
- MOV SHIWEI,A
- MOV GEWEI,B
- ;**********显示小数子程序********************
- XIANSHI1: MOV A,#0C8H;
- LCALL WRC;
- MOV R0,#32H; 显示温度的十位、个位
- WDA12: MOV A,@R0
- ADD A,#30H; 转换成ASCII码
- LCALL WRD; 写数据
- INC R0;
- CJNE R0,#34H,WDA12; 判断温度是否显示完
- ;*********显示温度符号*************************************************************************
- MOV A,#0CAH; 显示温度符号,设定显示位置
- LCALL WRC; 写入命令
- MOV A,#0DFH; “。”的 ASCII码
- LCALL WRD; 写数据
- MOV A,#43H; “C"的ASCII码
- LCALL WRD; 写数据
-
- LCALL DELAY1S;
- LCALL DELAY1S;
- LCALL DELAY1S;
- LCALL DELAY1S
- AJMP WEN
-
-
- ;*********温度提示字符显示**************************************************************
- TISHI2: MOV DPTR,#M_2; 指针指到显示消息
- LINE12: MOV A,#0C0H; 设置LCD的第一行地址
- LCALL WRC; 写入命令
- FILL12: CLR A; 输入字符
- MOVC A,@A+DPTR; 由消息区取出字符
- CJNE A,#0,LC12; 判断是否为结束码
- JMP RET_END2 ;子程序返回
- LC12: LCALL WRD; 写入数据
- INC DPTR; 指针加1
- JMP FILL1; 继续填入字符
- RET_END2: RET
-
- TISHI1: MOV DPTR,#M_1; 指针指到显示消息
- LINE11: MOV A,#80H; 设置LCD的第一行地址
- LCALL WRC; 写入命令
- FILL1: CLR A; 输入字符
- MOVC A,@A+DPTR; 由消息区取出字符
- CJNE A,#0,LC11; 判断是否为结束码
- JMP RET_END1 ;子程序返回
- LC11: LCALL WRD; 写入数据
- INC DPTR; 指针加1
- JMP FILL1; 继续填入字符
- RET_END1: RET
- M_2: DB "Temp:",0;
- M_1: DB "He Xing (^_^)",0;
- ;********液晶初始化子程序***************************
- LCDINIT: MOV A,#01H; 清屏
- LCALL WRC; 调用写入命令子程序
- MOV A,#38H; 8位数据,2行,5*8点阵
- LCALL WRC;
- MOV A,#0CH; 开显示和光标,字符不闪烁
- LCALL WRC;
- MOV A,#06H; 字符不动,光标自动右移1格
- LCALL WRC;
- RET;
- ;********忙检查子程序************************
- CBUSY: PUSH ACC; 将A的值暂存于堆栈
- PUSH DPH; 将DPH的值暂存于堆栈
- PUSH DPL; 将DPL的值暂存于堆栈
- PUSH PSW; 将PSW的值暂存于堆栈
- WEIT:
- CLR RS; RS=0,选择指令寄存器
- SETB RW; RW=1,选择读模式
- CLR E; E=0,禁止读/写LCD
- SETB E; E=1,允许读/写LCD
- NOP
- MOV A,P0; 读操作
- CLR E; E=0,禁止读/写LCD
- JB ACC.7,WEIT; 忙碌循环等待
- POP PSW; 从堆栈中取回PSW的值
- POP DPL; 从堆栈中取回DPL的值
- POP DPH; 从堆栈中取回DPH的值
- POP ACC; 从堆栈中取回ACC的值
- LCALL DELAY; 延时
- RET;
- ;********写子程序**************************
- WRC: LCALL CBUSY; 写入命令子程序
- CLR E; E=0,禁止读/写LCD
- CLR RS; RS=0,选择指令寄存器
- CLR RW; RW=0,选择写模
- SETB E; E=1,允许读/写LCD
- MOV P0,A; 写操作
- CLR E; E=0,禁止读/写LCD
- LCALL DELAY; 延时
- RET
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载(word格式完整设计报告与源程序):
http://www.51hei.com/bbs/dpj-104106-1.html
|