单片机课程设计数字温度计.doc

上传人:文库蛋蛋多 文档编号:4147481 上传时间:2023-04-07 格式:DOC 页数:32 大小:115.50KB
返回 下载 相关 举报
单片机课程设计数字温度计.doc_第1页
第1页 / 共32页
单片机课程设计数字温度计.doc_第2页
第2页 / 共32页
单片机课程设计数字温度计.doc_第3页
第3页 / 共32页
单片机课程设计数字温度计.doc_第4页
第4页 / 共32页
单片机课程设计数字温度计.doc_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《单片机课程设计数字温度计.doc》由会员分享,可在线阅读,更多相关《单片机课程设计数字温度计.doc(32页珍藏版)》请在三一办公上搜索。

1、单片机课程设计课题: 数字温度计系 别: 专 业 姓 名: 学 号: 河南城建学院2012年12月28日成绩评定一、指导教师评语(根据学生设计报告质量、答辩情况及其平时表现综合评定)。二、评分评分项目设计报告评分答辩评分平时表现评分合 计 (100分)任务完成情 况(20分)课程设计报告质量(40分)表达情况(10分)回答问题情 况(10分)工作态度与纪律(10分)独立工作能力(10分)得分课程设计成绩评定班级 姓名 学号成绩: 分(折合等级 )指导教师签字 年 月 日一、设计目的及要求 1、基本范围为50110; 2、精度误差小于0.5; 3、LED数码管直读显示; 扩展功能 : 1、可以任

2、意设定温度上的上下限报警功能; 2、实现语音报数。二、总体设计(一)、系统硬件设计方案根据系统功能要求,构造如下图所示的系统原理结构框图。DS18B20温度数据采集STC89CS52RC初始化LG3641BH显示温度图1 系统原理结构框图 单片机的选择STC89C52RC是新一代超强抗干扰/高速/低功耗的单片机,指令代码完全兼容传统8051单片机,12时钟/机械周期和6时钟/机械周期可以任意选择,其内核与AT51系列单片机一样,但是其造价较之更低,功能更强。AT51单片机小系统的电路图如下所示。图1:单片机小系统电路1)、引脚说明stc89c52的内核和AT51系列单片机一样,故引脚也相同:1

3、8:I/OP1口(P1.0P1.7);9: 复位脚(RST/Vpd);1017:I/OP3口(P3.0=RXD,P3.1=TXD,P3.2=-INT0,P3.3=-INT1,P3.4=T0,P3.5=T1,P3.6=-WR,P3.7=-RD);18、19:晶振(18=XTAL2,19=XTAL1);20: 地(Vss);2128:I/OP2口(P2.0P2.7); 29:-PSEN;30:ALE/-PROG;31:-EA/Vpp3239:I/OP0口(P0.7P0.0);40:+5V电源。注:引脚功能前加“-”,说明其是低电平有效。如P3.2=-INT0。2)、内部功能1. I/O 口:输入/

4、 输出口经过特殊处理,很多干扰是从I/O 进去的,每个I/O 均有对VCC/ 对GND二级管箝位保护。2. 电源:单片机内部的电源供电系统经过特殊处理,很多干扰是从电源进去的3. 时钟单片机内部的时钟电路经过特殊处理,很多干扰是从时钟部分进去的4 . 空闲模式:典型功耗 2mA5.正常工作模式:典型功耗 4mA - 7mA单片机内部的时钟电路经过特殊处理,很多干扰是从时钟部分进去的6. 复位电路单片机内部的复位电路经过特殊处理,很多干扰是从复位电路部分进去的,STC89C51RC/RD+系列单片机为高电平复位。推荐外置复位电路为MAX810/STC810,STC6344,STC6345,813

5、L,706P;也可用R/C 复位,10uF 电容/10k 电阻,22uF/8.2k 等。6.宽电压,不怕电源抖动5V: 6v - 3.4v 3V: 4v - 1.9v2、温度传感器介绍DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现位的数字值读数方式。DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20可以程序设定912位的分辨率,精度为0.5C。可选更小的封装方式,更宽的电压适用范围。分

6、辨率设定存储在EPROM中,掉电后依然保存。而在此,我们设定12为分辨率,即温度分辨率0.0625。DS18B20的性能特点如下:独特的单线接口仅需要一个端口引脚进行通信;多个DS18B20可以并联在惟一的三线上,实现多点组网功能;无须外部器件;可通过数据线供电,电压范围为3.05.5;零待机功耗;温度以或位数字;用户可定义报警设置;报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作; DS18B20采用脚PR35封装或脚SOIC封装,其内部结构框图如下图所示。C64 位ROM和单线接口高速缓存存储器与控制逻辑温度传

7、感器高温触发器TH低温触发器TL配置寄存器8位CRC发生器Vdd 图2DS18B20内部结构根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:(1).初始化(2) 执行某个ROM指令(3) 执行RAM内存指令(4) 数据传输复位要求主CPU将数据线下拉480微秒,然后释放,DS18B20收到信号后等待1660微秒左右,后发出60240微秒的存在低脉冲,主CPU收到此信号表示复位成功。图3DS18B20与单片机的接口电路3、液晶显示LG364BH液晶显示模块是12864 点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置国标GB2312 码简体中文字库(16X1

8、6 点阵)、128 个字符(8X16 点阵)及64X256 点阵显示RAM(GDRAM)。可与CPU 直接接口,提供两种界面来连接微处理机:8-位并行及串行两种连接方式。 三、总体设计(一)、整体思路根据要求,我们将整个程序分为三大部分。主要包括主程序,温度传感程序,LG3641BH液晶显示程序。(二)、程序流图1、 DS18B20温度计程序DS18B20温度计程序包括读出温度子程序,温度转换命令子程序,计算温度子程序。主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量温度值,温度测量每0.5s进行一次。读出温度子程序的主要功能是读出RAM中的字节。温度转换命令子程序主要是发

9、温度转换开始命令,采用12位分辩率为0.065,在本程序设计中采用0.5s显示程序延时法等待转换的完成。 DS18B20温度计程序流程图如下:开始DS18B20的初始化启动温度转换读取温度寄存器DS18B20的初始化复位 图4DS18B20温度计程序流程图 (三)、总体设计框图温度计电路设计总体设计方框图如图1所示,控制器采用单片机AT89S51,A/D转换器采用0809传输,温度传感器采用DS18B20,用3位LED数码管以串口传送数据实现温度显示,并用蜂鸣报警器来监视温度的值不超过量程范围。 温度上下限设置LED显示STC89C52单片机温度加一温度减一温度传感器图5总体设计方框图 四、整

10、体电路图 图6整体电路图五、结论在这一学期的单片机课程中,李老师给我们讲了许多单片机的内部结构,编译语言,一直在朦朦胧胧的学习,模模糊糊的接受,即使到了考试的时候,我甚至感觉自己对单片机还是那么陌生。一周的课程实习,不长不短,但是又不可或缺,它似乎是对一学期的课程的润色,把抽象变为形象,让我们突然跳出理论,开始实践,当然是理论结合实践,真正在做得时候,才发现之前学的那么少,进行课程实习的时候,我看了很多关于单片机,温度传感器,液晶显示器的资料和相应的程序代码,越看越不懂,但是越看就越想看,就感觉看到一个不懂的,去找答案,于是就刹不住车了,一个套着一个,但是虽然模糊,但是却越想看,又一次,我看的

11、最晚的一次是从下午一直到晚上3点多,一直没有看表也没有注意时间,那次我才发现知识那么可贵,不能说自己看懂,但是那种被知识灌输的感觉让我很舒服。对于此次的课程实习,我也总结了很多我认为适合我们,起码适合我自己的一些方法。一、 要对硬件功能了解,要熟悉相应程序代码和功能实现,二、 设计程序要有思路,根据思路才能有效进行三、 编写程序要有所根据,出现错误很正常,要一步步的排查错误,一定要细心耐心四、 要懂得听取正确意见,多和人交流,集思广益,合作的力量是无穷大的。五、 向别人讲解程序时,流程图是最好的展示。而我们小组正是在不断的合作中在两次的课题中都顺利完成。当然在此感谢各位指导老师这几周里对我们的

12、帮助和指导。参考文献1杨恢先,黄辉先.单片机原理及应用(第一版) M.北京:人民邮电出版社,2006:214-221.2马忠梅.单片机C语言程序设计 M.北京:北航出版社,2007:36-48.3 田立,田清,代方震. 51单片机C语言程序设计快速入门(第一版) M.北京:人民邮电出版社,2007:35-40.附件1:#include #define uchar unsigned char#define schar signed char#define uint unsigned int#define JDQ P2_2 /继电器输出#define LEDPort P0 /LED控制口#defi

13、ne LEDOneC P3_3 /LED DS1控制(百位)#define LEDTwoC P3_2 /LED DS2控制(十位)#define LEDThreeC P3_1 /LED DS3控制(个位)#define LEDFourC P3_0 /固定显示摄氏度符号#define DQ P2_0 /DS1820 DataPort#define KEY_IO P1 /按键所连的IO口#define NO_KEY_VALUE 0x0f /当按键没有被按下时IO口的值#define KEY_WOBBLE_TIME 8 /去抖动时间(待定)#define KEY_OVER_TIME 50 /等待进入

14、连击时间(待定),该常数要比正常按键时间要长,防止非目的性进入连击模式#define KEY_QUICK_TIME 8 /等待按键抬起的连击时间(待定)uchar TLV,THV,KeyV,Sign,SetTF,NUM,BZ,CQBZ;uint cs,css;schar TMV,TMHRomV,TMLRomV,TMHSetV,TMLSetV,LED_One,LED_Two,LED_Three,LED_Four;unsigned char code LEDDis=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF,0x46; /

15、0-9的LED笔划,0xFF为空,0xF7为负号,0x46为摄氏度符号/*11us延时函数*/void delay(unsigned int time) while(time-);/void delay_ms(unsigned int i) unsigned int j; while(i-) for(j = 0; j 0; i-)/按位循环 DQ = 0;/使总线为低电平 DQ = dat&0x01;/将发送字节的最低位送到总线 delay(5);/延时一段时间(30us),等待ds18b20取走总线数据 DQ = 1;/将总线拉高 dat=1;/将待发送的字节右移后继续发送 delay(4)

16、;/*DS18B20读1字节函数*/unsigned char Read_18b20_Byte(void)unsigned char i=0; /位循环变量unsigned char dat = 0; /暂存变量for (i=8;i0;i-) /读位循环 DQ = 0; / 使总线电平为低电平 dat=1;/暂存变量右移 DQ = 1; / 给脉冲信号,使总线电平为高电平后执行如下的读操作 if(DQ) /如果ds18b20的输出为高电平(总线电平为1) dat|=0x80; /将暂存变量的最高位置1 delay(4);/延时一段时间 return(dat); /将暂存变量返回调用程序/=/配

17、置18b20,设置上下温度,及灵敏度/=void Config18b20() Init_DS18B20(); Write_18b20_Byte(0xcc); / 跳过读序号列号的操作 Write_18b20_Byte(0x4e); /写 EEPROM Write_18b20_Byte(TMHSetV); /写入上限温度 Write_18b20_Byte(TMLSetV); /下限温度 Init_DS18B20(); Write_18b20_Byte(0xcc); / 跳过读序号列号的操作 Write_18b20_Byte(0x48); /保存上面所设定值 Init_DS18B20(); Wri

18、te_18b20_Byte(0xcc); / 跳过读序号列号的操作 Write_18b20_Byte(0xb8); /回调设定值,将rom的内容重调到RAM中void Read_18b20_first(void)unsigned int t=0;Init_DS18B20();Write_18b20_Byte(0xCC); / 跳过读序号列号的操作Write_18b20_Byte(0x44); / 启动温度转换delay_ms(700);Init_DS18B20();Write_18b20_Byte(0xCC); /跳过读序号列号的操作 Write_18b20_Byte(0xBE); /读取温度

19、寄存器等(共可读9个寄存器) 前两个就是温度,依次读取TLV=Read_18b20_Byte();/ 温度值低位字节(其中低4位为二进制的“小数”部分最小0.0625量)THV=Read_18b20_Byte();/ 高位值高位字节(其中高5位为符号位)TMHRomV=Read_18b20_Byte();/ 读取温度设定上限值TMLRomV=Read_18b20_Byte();/ 读取温度设定下限值void Read_18b20_Temprature(void)unsigned int t=0;Init_DS18B20();Write_18b20_Byte(0xCC); / 跳过读序号列号的操

20、作Write_18b20_Byte(0x44); / 启动温度转换delay(200);Init_DS18B20();Write_18b20_Byte(0xCC); /跳过读序号列号的操作 Write_18b20_Byte(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度,依次读取TLV=Read_18b20_Byte();/ 温度值低位字节(其中低4位为二进制的“小数”部分最小0.0625量)THV=Read_18b20_Byte();/ 高位值高位字节(其中高5位为符号位)TMHRomV=Read_18b20_Byte();/ 读取温度设定上限值TMLRomV=Read

21、_18b20_Byte();/ 读取温度设定下限值void display_wendu(void)/数值转换 TLV = TLV 4; /将温度低四位移除,及去掉小数部分 THV = THV 7; /将设置温度值左移七位取最高位符号 else /如果不在设置状态 Sign = TMV 7; /就将当前温度值左移7位取出符号位if (Sign) /如果sign为1,表示最高位符号位为1,即表示负数 if (SetTF) /如果在设置状态,显示设定值,将负数变成正数方便处理,因为18B20的负温度是用补码表示的,即 负数=正数+1,那么倒推过来,正数=(负数-1) LED_One = (TMLSe

22、tV-1) / 100; /第一位数码管显示设定时的百位 LED_Two = (TMLSetV-1) - LED_One * 100)/10; /第二位数码管显示设定时的十位 LED_Three = (TMLSetV-1) - LED_One * 100 - LED_Two * 10; /第三位数码管显示设定时的个位 else /如果不在设定状态就显示当前采集的温度值 LED_One = (TMV-1) / 100; /第一位数码管显示正常时的百位 LED_Two = (TMV-1) - LED_One * 100)/10; /第二位数码管显示正常时的十位LED_Three = (TMV-1)

23、 - LED_One * 100 - LED_Two * 10; /第三位数码管显示正常时的个位else /否则sign为0,表示最高位符号位为0,即表示正数,一下一段注释同上 if (SetTF) LED_One = (TMLSetV) / 100; LED_Two = (TMLSetV - LED_One * 100)/10; LED_Three = TMLSetV - LED_One * 100 - LED_Two * 10; else LED_One = (TMV) / 100; LED_Two = (TMV - LED_One * 100)/10; LED_Three = TMV -

24、 LED_One * 100 - LED_Two * 10; /将以上数据处理的值转换为LED字段if (LED_One) /如果第一位数码管显示为1,即百位显示1,超过了一百LED_Two = LEDDisLED_Two; /十位就显示十位的值else /如果没有超过一百,即只有两位时,也有两种情况LED_Two = LEDDisLED_Two;/显示十位if (Sign) /如果为负数时LED_One = LEDDis11;/第一位数码管,即百位显示“负号”else /如果不为负数时if (LED_One = 0) /百位为0时,百位不显示LED_One = LEDDis10;else /

25、否则显示百位LED_One = LEDDisLED_One;LED_Three = LEDDisLED_Three; /各位始终就显示个位的值LED_Four = LEDDis12;void init (void) JDQ=1; LEDPort=0xff;/*/文 件 名:key.c/功 能:短击连击/调用方法:unsigned char keyValue = ReadKey();/说 明:该程序不适用于阵列键盘./ 该程序不需要使用定时器./ 调用处要加入switch语句来判断相应按键按下并执行相应动作./ 如需要在按键松开后执行动作,则调用函数需要定义一个bit标志位,在default语句

26、里判断标志位状态./ KEY_WOBBLE_TIME 指程序程序执行次数.实际应用中要根据程序的长短来调整成合适的数值./ /备 注:程序思路是当按键被按下时开始计算程序的执行次数,如小于KEY_WOBBLE_TIME,则认为按键没有被按下./ 引用自 / KEIL编译时会提示WARNING C291: not every exit path returns a value.不影响使用. /*/uchar ReadKey() /判断哪个键被按下static uchar lastKey = NO_KEY_VALUE ;static uint keyCount = 0;static uint ke

27、yOverTime = KEY_OVER_TIME;uchar keyTemp = NO_KEY_VALUE ;keyTemp = KEY_IO & NO_KEY_VALUE ; /读取键值if(keyTemp = NO_KEY_VALUE ) /无按键按下时keyCount = 0; keyOverTime = KEY_OVER_TIME; BZ=0;return NO_KEY_VALUE ;else /有按键按下时 if(keyTemp=lastKey) if(+keyCount = KEY_WOBBLE_TIME) /不是第1次按下判断抖动是否结束 return keyTemp; /去抖

28、结束,返回键值 /短按时,将标志置0,说明在短按,闪烁 else if(keyCountkeyOverTime) keyCount = 0; keyOverTime = KEY_QUICK_TIME;BZ=1;/长按将标志置1,不闪烁 return NO_KEY_VALUE ; else /是第1次按下则保存键值,下次执行此函数时与读到的键值作比较 lastKey = keyTemp ; /保存第1次读到的键值 keyCount = 0; /延时计数器清零 keyOverTime = KEY_OVER_TIME ; return NO_KEY_VALUE ; /void main() init

29、();Read_18b20_first(); /先读一次温度,避开85度TMHSetV=TMHRomV; TMLSetV=TMLRomV; Config18b20(); SetTF=0; while(1) NUM+;if(NUM=40)NUM=0;KeyV=ReadKey();if(KeyV=0x0e)SetTF=SetTF;cs=0;if(SetTF)if(KeyV=0x0d)cs=0;TMLSetV=TMLSetV+1;TMHSetV=TMLSetV+2;if(KeyV=0x0b)cs=0;TMLSetV=TMLSetV-1;TMHSetV=TMLSetV+2;if(TMLSetV=60)

30、TMLSetV=60; if(TMLSetV200)cs=0;SetTF=0;Config18b20(); Read_18b20_Temprature();/读出温度高低位THV、TLV及温度限制TMRomV display_wendu();if(SetTF)if(!BZ) /短按下闪烁if(NUM20)LEDPort=0xff;else if(20NUM40) LEDPort = LED_One; LEDOneC = 0; delay(300); LEDOneC = 1; /显示百位数 LEDPort = LED_Two; LEDTwoC = 0; delay(300); LEDTwoC =

31、 1; /显示十位数 LEDPort = LED_Three; LEDThreeC = 0; delay(300); LEDThreeC = 1; /显示个位数LEDPort = LED_Four;LEDFourC=0;delay(300);LEDFourC=1; else /长按不闪烁 LEDPort = LED_One; LEDOneC = 0; delay(300); LEDOneC = 1; /显示百位数 LEDPort = LED_Two; LEDTwoC = 0; delay(300); LEDTwoC = 1; /显示十位数 LEDPort = LED_Three; LEDThr

32、eeC = 0; delay(300); LEDThreeC = 1; /显示个位数LEDPort = LED_Four;LEDFourC=0;delay(300);LEDFourC=1; if(!SetTF) LEDPort = LED_One; LEDOneC = 0; delay(300); LEDOneC = 1; /显示百位数 LEDPort = LED_Two; LEDTwoC = 0; delay(300); LEDTwoC = 1; /显示十位数 LEDPort = LED_Three; LEDThreeC = 0; delay(300); LEDThreeC = 1; /显示个位数LEDPort = LED_Four;LEDFourC=0;delay(300);LEDFourC=1; if(!SetTF) if (TMV = TMLSetV) /根据采集到的温度值控制继电器 JDQ = 1; /压缩机停止CQBZ = 1; /重启标志位置1 if(TMLSetV TMV TMHSetV)&(CQBZ = 1)JDQ = 1; /压缩机保持if(TMLSetV TMV = TMHSetV) /根据采集到的温度值控制继电器 JDQ = 0; /压缩机停止CQBZ = 0; /重启标志位置1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号