多路温度采集系统毕业实习.doc
毕业实习报告题目:多路温度采集系统学 院 电子与信息工程专 业 电子信息工程班级学号 0910910114姓 名 指导教师 完成时间 2013-3-6 成 绩2013年 3 月一、摘要:本次设计介绍了基于单片机AT89C51控制DS18B20的智能温度显示,给出了该显示仪的硬件电路及详细说明,重点介绍了DS18B20与单片机的接口设计以及数字温度计的软件的主程序、DS18B20读写程序和显示程序,并给出了基于PROTEUS软件的电路仿真图。该仪表具有简单、稳定、实用、精度高等优点二、实习的内容、安排本次实习分5次实验室时间第一次:查阅资料,为确定方案建立基础。第二次:整理资料,确立方案。第三次:画原理图,写仿真。最后两次:查漏补缺,完善成果。三、实习的具体实现本系统中温度传感器获取较高精确度的温度值并将其传至单片机中处理并能将测得的温度在数码管中显示。还从键盘上输入需要设定的温度范围。当高与上限温度时定时触发蜂鸣器报警。需用户手动停止报警或者当温度回落至用户设定的上下限温度范围内时能自动停止报警。根据系统的设计要求,当温度传感器DS18B20把所测得的温度发送到AT89C51单片机上,经AT89C51处理,将把温度在显示电路上显示。当开机后,显示屏和计时器进行初始化设置。 利用AT89C51芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度。 系统框图如下图: 图1.1 系统框图 选择DS18B20作为本系统的温度传感器,选择单片机AT89C51为测控系统的核心来完成数据采集、处理、显示、报警等功能。选用数字温度传感器DS18B20,输出信号全数字化。便于单片机处理及控制,省去传统的测温方法的很多外围电路,省却了采样保持电路、运放、数模转换电路以及进行长距离传输时的串并转换电路,简化了电路,缩短了系统的工作时间,降低了系统的硬件成本。 当LCD液晶显示器接收到来自AT89C51单片机传送来的温度信息后,分别显示了当前的温度 词系统采用数码管显示,是考虑到其简单易实现,单片机选择89c51.电路连接图与仿真图如下。五、附录单片机(at89c51),数码管,温度传感器18b20 (12个),键盘(2),蜂鸣器1个锁存器(2个)六、 心得体会本次课程设计中,本人就采用了这种已经相当普及的方法设计了一个基于单片机和温度传感器的多路温度采集系统,并通过了软件仿真,最后得出了设计结果的可行性,设计过程中,首先,要对DS18B20做一个详细的了解,作为设计中一个重要的元件,要知道它的一般流程:初始化ROM操作指令存储器操作指令数据传输。然后必须掌握它的每个端口的作用,并用单片机通过高低电平来控制它的工作过程,不一样的模块它的工作时序是不同,这里要通过软件正确的编写出读写时序,才能确保在测量温度的环节中不出问题。一个完整的系统同样也需要一个人机界面才能便于使用者读出数据,所以这里用到了lcd1602液晶屏,这个液晶屏的优点在于自带字库,且易于控制显示位置,基本上达到了设计的要求。 同时,在做整个课程论文的过程中,也遇到了诸多问题: 第一,不能灵活自如的运用C51语言。 第二,对某些硬件的功能不太熟悉。 第三,缺乏一定的理论基础。 但是,通过老师和同学们的帮助,最终还是取得了一个令人满意的结果,再次对帮助过我的老师和同学们表示感谢,我也会在以后的学习工作中,逐步弥补自己的不足。七 程序代码#include "lcd1602.h"#include "ds18b20.h"#include <stdio.h>unsigned char temp5;extern char xiaoshu_temp5,zhen_temp4;extern bit flag;extern bit dot_dis;/uchar ds18b20_num18=0x25,0x00,0x00,0x00,0xb8,0xc5,0x45,0x28;code uchar ds18b20_num18=0xfd,0x00,0x00,0x00,0xb8,0xc5,0x45,0x28;code uchar ds18b20_num28=0x8e,0x00,0x00,0x00,0xb8,0xc5,0x30,0x28;code uchar ds18b20_num38=0xb9,0x00,0x00,0x00,0xb8,0xc5,0x31,0x28;code uchar ds18b20_num48=0xe0,0x00,0x00,0x00,0xb8,0xc5,0x32,0x28;code uchar ds18b20_num58=0xd7,0x00,0x00,0x00,0xb8,0xc5,0x33,0x28;code uchar ds18b20_num68=0x52,0x00,0x00,0x00,0xb8,0xc5,0x34,0x28;code uchar ds18b20_num78=0x65,0x00,0x00,0x00,0xb8,0xc5,0x35,0x28; code uchar ds18b20_num88=0x3c,0x00,0x00,0x00,0xb8,0xc5,0x36,0x28; uchar my_temp9;void get1_ds18b20(void);void get2_ds18b20(void);void get3_ds18b20(void);void get4_ds18b20(void);void get5_ds18b20(void);void get6_ds18b20(void);void get7_ds18b20(void);void get8_ds18b20(void);void es_isr (void) ; uchar i; / uchar *ds18b20_rom; char *str1="1:"char *str2="2:"char *str3="3:" char *str4="4:"char *str5="5:"char *str6="6:"char *str7="7:"char *str8="8:"void delay(unsigned int time)unsigned int i,j;for(i=0;i<time;i+)for(j=0;j<200;j+);void main(void) SCON = 0x50; /串口方式1,允许接收TMOD = 0x20; /定时器1定时方式2 PCON=0x00;TH1 = 0xFD; /11.0592MHz 4800波特率TL1 = 0xFD;ET1=0;ES=1;EA=1; /4800*2=9600波特率TR1 = 1; /* while(1)SBUF=1;while(!TI);TI=0;delay(1000); */serial_set(); Lcd_Init(); ClrScreen();/GotoXY(0,0); /dot_dis=1;/ds18b20_rom=read_rom(); /读序列号/for(i=0;i<8;i+) /ds18b20_num2i=*ds18b20_rom;/ds18b20_rom+;/GotoXY(0,1);/for(i=0;i<8;i+) /显示序列号/print_char(ds18b20_num2i/16);/print_char(ds18b20_num2i%16);/while(1)get1_ds18b20();get2_ds18b20(); get3_ds18b20(); get4_ds18b20(); delay(1000); ClrScreen(); get5_ds18b20(); get6_ds18b20();get7_ds18b20();get8_ds18b20();delay(1000); ClrScreen(); void get1_ds18b20(void)ds18b20_init(); ds18b20_writecommand(0xcc); ds18b20_writecommand(0x44); /转换delay(500);match_rom(ds18b20_num1); /匹配第一路 ds18b20_writecommand(0xbe); /读 for(i=0;i<2;i+) tempi=ds18b20_readdata(); my_temp1= (temp1&0x7)*0x10+(temp0&0xf0)/0x10;temperature_process(temp0,temp1);Screen_home();Print(str1);if(!flag) /正Print(zhen_temp);if(dot_dis)Print(".");Print(xiaoshu_temp);else /负Print("-");Print(zhen_temp);if(dot_dis)Print(".");Print(xiaoshu_temp); Print(" ");void get2_ds18b20(void)ds18b20_init(); ds18b20_writecommand(0xcc); ds18b20_writecommand(0x44); /转换delay(500);match_rom(ds18b20_num2); /匹配第二路 ds18b20_writecommand(0xbe); /读 for(i=0;i<2;i+) tempi=ds18b20_readdata(); my_temp2= (temp1&0x7)*0x10+(temp0&0xf0)/0x10;temperature_process(temp0,temp1);GotoXY(9,0);Print(str2);if(!flag) /正Print(zhen_temp);if(dot_dis)Print(".");Print(xiaoshu_temp);else /负Print("-");Print(zhen_temp);if(dot_dis)Print(".");Print(xiaoshu_temp);Print(" ");void get3_ds18b20(void)ds18b20_init(); ds18b20_writecommand(0xcc); ds18b20_writecommand(0x44); /转换delay(500);match_rom(ds18b20_num3); /匹配第三路 ds18b20_writecommand(0xbe); /读for(i=0;i<2;i+) tempi=ds18b20_readdata(); my_temp3= (temp1&0x7)*0x10+(temp0&0xf0)/0x10;temperature_process(temp0,temp1);GotoXY(0,1);Print(str3);if(!flag) /正Print(zhen_temp);if(dot_dis)Print(".");Print(xiaoshu_temp);else /负Print("-");Print(zhen_temp);if(dot_dis)Print(".");Print(xiaoshu_temp); Print(" ");void get4_ds18b20(void)ds18b20_init(); ds18b20_writecommand(0xcc); ds18b20_writecommand(0x44); /转换delay(500);match_rom(ds18b20_num4); /匹配第四路 ds18b20_writecommand(0xbe); /读for(i=0;i<2;i+) tempi=ds18b20_readdata(); my_temp4= (temp1&0x7)*0x10+(temp0&0xf0)/0x10; temperature_process(temp0,temp1);GotoXY(9,1);Print(str4);if(!flag) /正Print(zhen_temp);if(dot_dis)Print(".");Print(xiaoshu_temp);else /负Print("-");Print(zhen_temp);if(dot_dis)Print(".");Print(xiaoshu_temp);Print(" ");void get5_ds18b20(void)ds18b20_init(); ds18b20_writecommand(0xcc); ds18b20_writecommand(0x44); /转换delay(500);match_rom(ds18b20_num5); /匹配第五路 ds18b20_writecommand(0xbe); /读 for(i=0;i<2;i+) tempi=ds18b20_readdata(); my_temp5= (temp1&0x7)*0x10+(temp0&0xf0)/0x10; temperature_process(temp0,temp1);Screen_home();Print(str5);if(!flag) /正Print(zhen_temp);if(dot_dis)Print(".");Print(xiaoshu_temp);else /负Print("-");Print(zhen_temp);if(dot_dis)Print(".");Print(xiaoshu_temp); Print(" ");void get6_ds18b20(void)ds18b20_init(); ds18b20_writecommand(0xcc); ds18b20_writecommand(0x44); /转换delay(500);match_rom(ds18b20_num6); /匹配第六路 ds18b20_writecommand(0xbe); /读 for(i=0;i<2;i+) tempi=ds18b20_readdata(); my_temp6= (temp1&0x7)*0x10+(temp0&0xf0)/0x10; temperature_process(temp0,temp1);GotoXY(9,0);Print(str6);if(!flag) /正Print(zhen_temp);if(dot_dis)Print(".");Print(xiaoshu_temp);待添加的隐藏文字内容2else /负Print("-");Print(zhen_temp);if(dot_dis)Print(".");Print(xiaoshu_temp); Print(" ");void get7_ds18b20(void)ds18b20_init(); ds18b20_writecommand(0xcc); ds18b20_writecommand(0x44); /转换delay(500);match_rom(ds18b20_num7); /匹配第七路 ds18b20_writecommand(0xbe); /读 for(i=0;i<2;i+) tempi=ds18b20_readdata(); my_temp7= (temp1&0x7)*0x10+(temp0&0xf0)/0x10; temperature_process(temp0,temp1);GotoXY(0,1);Print(str7);if(!flag) /正Print(zhen_temp);if(dot_dis)Print(".");Print(xiaoshu_temp);else /负Print("-");Print(zhen_temp);if(dot_dis)Print(".");Print(xiaoshu_temp); Print(" ");void get8_ds18b20(void)ds18b20_init(); ds18b20_writecommand(0xcc); ds18b20_writecommand(0x44); /转换delay(500);match_rom(ds18b20_num8); /匹配第八路 ds18b20_writecommand(0xbe); /读for(i=0;i<2;i+) tempi=ds18b20_readdata(); my_temp8= (temp1&0x7)*0x10+(temp0&0xf0)/0x10;temperature_process(temp0,temp1);GotoXY(9,1);Print(str8);if(!flag) /正Print(zhen_temp);if(dot_dis)Print(".");Print(xiaoshu_temp);else /负Print("-");Print(zhen_temp);if(dot_dis)Print(".");Print(xiaoshu_temp); Print(" ");void es_isr (void) interrupt 4 /通信中断服务函数 uchar temp;uchar x4;uchar i;EA=0;if(RI)temp=SBUF; RI=0;/if(temp=ip) /temp=0xbb;SBUF=temp;hand_flag=1;while(!TI);TI=0;/if(temp=0xcc)&&hand_flag ) /if(temp= 01)for(i=1;i<5;i+)SBUF=my_tempi;while(!TI);TI=0; / hand_flag=0; / else for(i=5;i<9;i+)SBUF=my_tempi;while(!TI);TI=0; EA=1;