温度计-通信1班-唐健-20102553课题报告

上传人:ji****n 文档编号:45149433 上传时间:2018-06-15 格式:DOC 页数:13 大小:1.27MB
返回 下载 相关 举报
温度计-通信1班-唐健-20102553课题报告_第1页
第1页 / 共13页
温度计-通信1班-唐健-20102553课题报告_第2页
第2页 / 共13页
温度计-通信1班-唐健-20102553课题报告_第3页
第3页 / 共13页
温度计-通信1班-唐健-20102553课题报告_第4页
第4页 / 共13页
温度计-通信1班-唐健-20102553课题报告_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《温度计-通信1班-唐健-20102553课题报告》由会员分享,可在线阅读,更多相关《温度计-通信1班-唐健-20102553课题报告(13页珍藏版)》请在金锄头文库上搜索。

1、数字温度计实验报告1、实验目的实验目的1、设计一个可以测定温度并显示温度的数字温度计,并具有要求的功能;2、用仿真软件设计出数字温度计的电路图,用相应的软件编写出代码,并用仿真软件仿真,在单片机板上用电路元件连接出设计的电路图,并将代码写入硬件并使之成功运行。2、实验要求实验要求1、能够实时显示环境温度。2、能够保存使用时间内的最大值和最小值,能够查阅。3、有温度报警功能,能够设置报警温度。用绿灯表示正常温度,红灯表示报警同时发 声。4、自由发挥其他功能.5、要求有单片机硬件系统框图,电路原理图,软件流程图。三、实验原理三、实验原理利用 DS18B20 的实时测定温度的功能对环境温度进行测定。

2、因为 DS18B20利用的是单行通信,所有只有一根数据线,这里命名为 DQ。通过 DQ,将实时测得的温度在数码管上 显示出来。数码管显示数字是利用通过对每位数码管的依次扫描,使对应数码管亮,同时向该数码管送对应的字码,使其显示数字。由于数码管扫描周期很短以及人眼的视 觉暂留效应,使数码管看起来总是亮的,从而实现了数字的动态显示。关于最大值与最小值的记录,设置两个变量,将第一次读取的温度值存入,然后每一次读取的温度值都会与其进行比较,较大或较小的值会覆盖原来的值,最值的显示也是通过段选和位选的数据线来控制显示。当程序没有检查到 DS18B20 或读取温度在设置范围以外时,程序会报警并不可操作。这

3、是通过从键盘输入设置温度,然后通过 DQ写入 DS18B20,在代码 中要求程序在温度不在合理范围内时报警来实现的。四、元器件清单四、元器件清单名称数量AT89C52 单片机1 排阻1 LED 灯2(红色绿色各一)4*3 小键盘1 8 位数码管1 蜂鸣器1DS18B2015 5、硬件系统框图硬件系统框图六、电路原理图六、电路原理图输入部分单片机报警部分显示部分7 7、软件流程图软件流程图判断是否 初始化成 功?主程序开始运行按 2?下一次循环按 1? 程序进入死循环, 亮红灯,蜂鸣是否最值判断和处 理报警判 断?显示温度将读取的数据 转化成十进制读取温度数据并 进行负数处理否读温度准备程序报错

4、,等 待查明原因灯与蜂鸣器信 号的初始化最值显示函数是否设置报警温度否是是按“#”?是8、代码分析代码分析1、延迟函数:起到时间延迟的作用。void delay(unsigned int time) while(time-); 2、DS18B20 初始化函数:检测 DS18B20 是否正常连接,若是,则初始化;反之则报错,程序进入死循环,等待查明原因并改正。bit Init_DS18B20(void) bit flag; /记录 DS18B20 数据传输是否正常 DQ = 1; delay(8); DQ = 0; delay(90); DQ = 1; delay(8); flag=DQ; /让

5、单片机检测是否输出了存在脉冲(DQ=0 表示存在) delay(100); DQ=1;return (flag); /返回 flag 3、向 DS18B20 写入数据的函数:每次调用即向 DS18B20 中写入一 个字节的数据。unsigned char ReadOneChar(void) unsigned char i=0; /循环变量 unsigned char dat; /储存要写入的数据 for (i=0;i=1; /右移一位 DQ = 1; nop_(); /代表一个机器周期 nop_(); if(DQ=1) dat|=0x80; /若是 1,即存入 1;若是 0,即存入 0 els

6、e dat|=0x00; delay(30); DQ = 1; return(dat); 4、向 DS18B20 写入数据的函数:每次调用向 DS18B20 中写入一个字节的数据。 void WriteOneChar(unsigned char dat) unsigned char i=0; for (i=0; i=1; /将 dat 中的各二进制位数据右移 1 位 5、读温度准备函数:在读取温度之前做好初始化等工作。void ReadyReadTemp(void) Init_DS18B20(); /将 DS18B20 初始化 WriteOneChar(0xCC); / 跳过读序号列号的操作

7、WriteOneChar(0x44); / 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); /跳过读序号列号的操作 WriteOneChar(0xBE); /读取温度寄存器,前两个分别是温度的低位和高位 6、负数处理函数:对读取到的温度数据是否是负值进行判断,若 是负数,进行相应的处理。void minus() if(TH TL=TL+1; if(TL=0) TH+; /若 TL 为 0,则向 TH 进一 is_minus=1; /若为负数,记为 1 else is_minus=0; /若为正数,记为 0 7、扫描函数:对键盘是否有键按下进行判断,并返回键

8、值。char keyscan() unsigned char key; P1=0xfd; /第一列 if(P1 if(key /松手检测switch(key) case 0xed: return 11; case 0xdd: return 9; case 0xbd: return 6; case 0x7d: return 3; P1=0xfb; /第二列 if(P1 if(key switch(key) case 0xeb: return 0; case 0xdb: return 8; case 0xbb: return 5; case 0x7b: return 2; P1=0xf7; /第三

9、列 if(P1 if(key switch(key) case 0xe7: return 10; case 0xd7: return 7; case 0xb7: return 4; case 0x77: return 1; return -1; /没有键按下时返回-1 8、显示函数:将需要显示的温度值显示在数码管上。void display(int a,int b) unsigned char flag=4; /用来记录负号位置的变量 P0=wei0; P2=0x39; delay(200); /显示 H,代表高值 P0=wei1; P2=0x63; delay(200); /显示 L,代表低

10、值 if(a/100!=0) /若百位不为 0 P0=wei5; P2=duana/100; delay(200); P0=wei4; P2=duana%100/10; flag=6; /负号位置置于百位前一位 delay(200); else if(a/10!=0) /若百位为 0 且十位不为 0 P0=wei4; P2=duana/10;delay(200); flag=5; /符号位置置于十位前一位 P0=wei3; P2=duana%10|0x80; delay(200); P0=wei2; P2=duanb; delay(200); /显示个位和小数 if(is_minus=1) /

11、若为负数 P0=weiflag; P2=0x40; delay(200); /显示负号 9、设置函数:设置报警温度的上限值和下限值,并写入 DS18B20。void set() unsigned char i=0,j=0,t=-1; /i,j 为循环变量,t 记录键盘扫描值 unsigned char temp14,temp24; /两个数组分别记录两个设置温度的数值 P0=0; P2=0; while(1) P0=wei7; P2=0x76; delay(150); t=keyscan(); if(t!=-1) /若有键按下 temp1i=t; i+; /将键值记录进数组 for(j=1;j

12、alert_max) /判断是否需要报警 p30=1; p31=0; /绿灯灭,红灯亮 p32=!p32; /输出脉冲使蜂鸣器蜂鸣 /delay(150); display(ETN,ETD); /显示报警温度 11、保存最值函数:判断当前温度是否是从程序开始运行至今所读取到的温度的最大值和最小值,若是,覆盖旧值。void save() float temp; temp=ETN+ETD/10; /读取当前温度值 if(P2=0x40) temp=-temp; /若是负数,取相反数 if(label=0) max=temp; min=temp; label=1; /第一次显示温度时,只有一个温度,

13、既是最大值,也 是最小值 if(tempmax) max=temp; if(temp=0) is_minus=0;display(int)max,(max-(int)max)*10); else is_minus=1; display(int)(-max),(-max)-(int)(-max)*10); /判断,给予正确的负号状态值,并显示最大值 P0=wei7; P2=0x76; delay(200); /显示 H t=keyscan(); if(t=11) /扫描,若按下“#” ,退出本模式 is_minus=n; /还原 is_minus return 0; while(t=1) /同上,给予正确负号状态值,显示最小值 if(min=0) is_minus=0; display(int)min,(min-(int)min)*10); else is_minus=1; display(int)(-min),(-min)-(int)(-min)*10); P0=wei7; P2=0x38; delay(200); m=keyscan(); if(m=11) is_minus=n;return 0; 13、错

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号