《温度检测系统设计报告(共21页).doc》由会员分享,可在线阅读,更多相关《温度检测系统设计报告(共21页).doc(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上计算机硬件(嵌入式)综合实践设计报告温度检测系统设计与制作 一 系统概述1. 设计内容本设计主要从硬件和软件部分介绍了单片机温度控制系统的设计思路,简单说明如何实现对温度的控制,并对硬件原理图和程序框图作了简洁的描述。还介绍了在单片机控制系统的软硬件设计中的一些主要技术关键环节,该系统主要以AT89S52单片机为核心, 同时利用DS18B20温度传感器采集温度,采用4位LED显示管实施信息显示。AT89S52单片机设计的温度检测电路是本次设计的主要内容,是整个单片机温度控制系统设计中不可缺少的一部分,该系统对温度进行实时采集与检测。本设计介绍的单片机自动控制系统的主要
2、内容包括:系统概述、元器件选择、系统理论分析、硬件设计、部分软件设计及主要技术性能参数。2. 元器件选择 单片机AT89S52:1个 22uF电容:2个4.7K电阻:1个 万能板:1个 杜邦线:若干 单排排针:若干 DS18B20温度传感器:2个 4位LED显示管:1个二 软件功能设计及程序代码1.总体系统设计思想框图如下:2. 主程序流程图3. DS18B20数据采集流程图4.程序代码、温度记录仪#include#include#include#include#include#includebit rec_flag=0;/记录温度标志uchar autobac_tim=0;/自动跳转延时uc
3、har code logos=*NT MUSIC*;uchar incmin=0;/计分钟数bit overflag=0;/数据溢出标志位uchar mode=1;/系统运行模式uchar tempmode;/模式缓存void init() lcd_init(); eeprom_init();/*开机效果*/ display(l1, Starting NT,1); longdelay(10); display(l2, Ver 3.0.1,1); longdelay(20); write_cmd(0x01);/清屏/*/ sys_init();void comms() /模式公共进程 time2
4、times(); /时间格式转换 avtemp=gettemp();/获取温度 avtemp2avtemps();/温度格式转换 date_counter();/获取当前日期 date2dates();/日期格式转换 display(l2+1,times,0); display(l2+11,avtemps,0);void progs(uint i,uint k)/进度条 uint j; write_cmd(0xc0); for(j=0;j(i*16/k);j+) write_lcddata(0xff); void normal_run() /无记录运行模式 comms(); if(time2%
5、105) display(l1,logos,1); else display(l1,*,0);display(l1+13,*,0);display(l1+3,dates,0); incmin=0; void recding_run() /记录模式运行模式 uint WDTPT;/临时写地址指针变量存放 comms(); recfrq2recfrqs(); if(time2%1050) display(l1, ,0); else display(l1,R,0); display(l1+1,-NUM,0); display(l1+5,datcounts,0);display(l1+9,*EV,0)
6、;display(l1+13,recfrqs,0); else display(l1,*,0);display(l1+13,*,0);display(l1+3,dates,0); /*定时记录*/ if(incmin=recfrq)/触发记录功能 incmin=0;/1清除进入记录标志 if(WDTP10240) /20个扇区 overflag=1; if(overflag=0)/如果数据尚未溢出 if(date_recf=1) /记录年-月-日(格式:z+年+月+日)为十制数值 date_recf=0;/清除记录日期标志 write_isp(WDTP,z);/日期起始标志 write_isp
7、(WDTP,date0); write_isp(WDTP,date1); write_isp(WDTP,date2);/记录年、月、日 /*记录时间*/ write_isp(WDTP,time0); write_isp(WDTP,time1);/记录时分 /*记录温度*/ write_isp(WDTP,avtemp/100); write_isp(WDTP,avtemp%100);/*记录加一*/datcount+;/*写回数据指针*/WDTPT=WDTP;if(FDTP=512)del_isp(0);/清空记录表FDTP=0;write_isp(FDTP,WDTPT/256);write_i
8、sp(WDTP,WDTPT%256);write_isp(WDTP,datcount/256);write_isp(WDTP,datcount%256);FDTP=WDTP;WDTP=WDTPT;/交互完成 if(overflag=1)/如果数据溢出 display(l1,Error!,1); display(l2,Data Overflow!,1); autobac_tim=0; while(autobac_tim!=3); display(l2, ,1); void data_run() /查看记录模式 uchar i=0; bit bacf=0; uint cou_t=0;/计数缓存变量
9、 uchar temp=0;/临时数据缓存 uint cd=0;/进度条统计数据 autobac_tim=0; while(bacf=0) if(autobac_tim10)bacf=1; display(l1,Ready for Export,1); display(l2,D-Date T-Temp L!,1); if(RI=1) autobac_tim=0; RI=0;ser_rec=SBUF;switch(ser_rec) case L: /格式化 display(l1,Format?,1); display(l2, Y-Yes N-No,1); while(1) if(RI=1) RI
10、=0;ser_rec=SBUF;autobac_tim=0; if(ser_rec=Y)/确定格式化 display(l1,Formatting.,1); display(l2, ,1); eeprom_format(); display(l1,Format Successed,1); longdelay(3); break; if(ser_rec=N) break; if(autobac_tim10) break; autobac_tim=0; break; case D:/输出日期时间 display(l1,Exporting Date.,1); display(l2, ,1); RDTP
11、=512;/将读指针放到首位 cou_t=datcount; cd=0; while(cou_t!=0) if(RI=1) RI=0; if(SBUF=B) display(l1,Export stopped,1); cd=0; longdelay(3); break; temp=read_isp(RDTP);/ 预读判断 RDTP-; if(temp=z) RDTP+; prf_date();/输出年月日 prf_time();/输出时间 RDTP=RDTP+2; cou_t-; cd+; progs(cd,datcount); if(datcount=0) display(l1,No Da
12、ta!,1); longdelay(3); autobac_tim=0; break; case T:/温度输出 display(l1,Exporting Temp.,1); display(l2, ,1); RDTP=516;/将读指针放到首位cd=0;cou_t=datcount; while(cou_t!=0) if(RI=1) RI=0; if(SBUF=B) display(l1,Export stopped,1); cd=0; longdelay(3); break; temp=read_isp(RDTP);/ 预读判断 RDTP-; if(temp=z) RDTP=RDTP+6;
13、 else RDTP=RDTP+2; prf_temp(); cou_t-; cd+; progs(cd,datcount); if(datcount=0) display(l1,No Data!,1); longdelay(3); autobac_tim=0; break; case B:bacf=1;break;ser_rec=0; mode=tempmode; display(l2, ,1);void adj_settings()/设置模式 uchar i=0;/Counter bit endadj=0;/调整完毕标志 uchar ser_temp=0;/接收缓存 write_cmd(0
14、x01);/清屏 times5=:;/恢复数点 display(l1,Set time- ,1); display(l1+11,hour,0); display(l2+11, ,0); display(l2+1,times,0); display(l2+12,recfrqs,0); write_cmd(0xC1+i); write_cmd(0x0f);/显示闪烁光标 autobac_tim=0;/初始化自动返回时间常数 while(!endadj) if(RI=1) /接收到数据 RI=0; autobac_tim=0;/自动返回清零 ser_temp=SBUF; if(ser_temp47)
15、&(ser_temp58)/进行数值判断 if(i8&i=14) datesi-13=ser_temp; i+;if(ser_temp=F) i+;/往前一步if(ser_temp=B) endadj=1;/退出调整 switch(i)/显示处理 case 2:i+;display(l1+11,min ,0);break; case 5:i+;display(l1+11,sec ,0);break; case 8:i=i+3;display(l1+11,frq ,0);break; case 14:i+;display(l1+4,date year ,0); display(l2, ,1);
16、break; case 17:i+;display(l1+11,moun,0);break; case 20:i+;display(l1+11,day ,0);break; case 23:endadj=1;break; if(i10) endadj=1; display(l2, ,1); write_cmd(0x0c);/正常显示void main() init(); while(1) switch(mode) case 1:normal_run();break; case 2:recding_run();break; case 3:data_run();break; if(RI=1) RI
17、=0; ser_rec=SBUF; switch(ser_rec) case A:adj_settings();break;case R:mode=2;break;case N:mode=1;break;case H:tempmode=mode;mode=3;break;case D:ser_sents(dates);break;case T:times5=:;ser_sents(times);break;case W:ser_sents(avtemps);break;case C:ser_sents(datcounts);break;case F:ser_sents(recfrqs);bre
18、ak; ser_rec=0; void miao() interrupt 1 /秒产生中断 TH0=(65535-9200)/256; TL0=(65535-9200)%256; mss+; if(mss=100) mss=0;time2+;autobac_tim+; if(autobac_tim=255) autobac_tim=244;/保持溢出 if(time2=60) time2=0;time1+;incmin+; if(time1=60) time1=0;time0+; if(time0=24) time0=0;dayincf=1;/天自增标志置位 date_recf=1;/日期需要
19、记录 /*将返回时间时分秒*/、system.h/*系统I/O*/*LCD I/O*/sbit RS=P12;sbit LCDEN=P11;/*DS18B20*/sbit DS=P10;#define uchar unsigned char#define uint unsigned intuchar code num=0,1,2,3,4,5,6,7,8,9;/*时间相关变量*/uchar time=23,28,00;/时分秒(10进制数)uchar times=15:37:00;/时分秒(ASCII码)uchar mss=0;uchar date=11,11,11;/年月日(10进制数)uch
20、ar dates=2011-10-29;/年月日(ASCII码)bit dayincf=0;bit date_recf=0;/日期记录标志/*记录频率变量*/uchar recfrq=2;/记录频率(10进制数)uchar recfrqs=001; /记录频率(ASCII码)uint datcount=0;/记录总数uchar datcounts=0000;/*串口接收变量*/uchar ser_rec;/*温度相关变量*/uint avtemp=0;uchar avtemps=00.0;void delay(uchar z)uchar x,y;for(x=z;x0;x-)for(y=110;
21、y0;y-);void longdelay(uchar z) for(z;z0;z-) delay(255);void ser_sent(uchar sendata) /串口发送 单字节 SBUF=sendata; while(TI!=1); TI=0; delay(1);void ser_sents(uchar strings) /串口发送字符串 uchar i=0; while(stringsi!=0) ser_sent(stringsi); delay(20); i+; ser_sent(n);void date_counter()/日期转变 uchar n;/月天数暂存 uint ye
22、ar=2000+date0;/将年转换为标准年 if(dayincf=1) dayincf=0; switch(date1)/根据月份制定月天数 case 1:n=31;break; case 2:if(year%4=0|year%400=0)n=29; else n=28;break; case 3:n=31;break; case 4:n=30;break; case 5:n=31;break; case 6:n=30;break; case 7:n=31;break; case 8:n=31;break; case 9:n=30;break; case 10:n=31;break; ca
23、se 11:n=30;break; case 12:n=31;break; date2+;if(date2n) date2=1; date1+; if(date112) date1=1;date0+; void sys_init()/系统初始化 EA=1;TMOD=0x21;TR1=1;REN=1;SM0=0;SM1=1; TH1=0xfA; TL1=0xfA; ET0=1;/允许定时器中断0 TH0=(65535-9200)/256; TL0=(65535-9200)%256;/定时器中断0初值 TR0=1;/开中断(秒) ES=0;void recfrq2recfrqs() /10进制记录
24、频率转字符串 recfrqs0=numrecfrq/100;recfrqs1=numrecfrq%100/10; recfrqs2=numrecfrq%100%10; datcounts0=numdatcount/1000; datcounts1=numdatcount%1000/100; datcounts2=numdatcount%1000%100/10; datcounts3=numdatcount%1000%100%10; void time2times()/10进制时间转字符串 times0=numtime0/10;times1=numtime0%10; times3=numtime
25、1/10;times4=numtime1%10; if(mss50) times5=:;else times5= ; times6=numtime2/10;times7=numtime2%10;void date2dates()/10进制日期转字符串 dates2=numdate0/10;dates3=numdate0%10; dates5=numdate1/10;dates6=numdate1%10; dates8=numdate2/10;dates9=numdate2%10; void avtemp2avtemps()/10进制温度转字符串 avtemps0=numavtemp/100;a
26、vtemps1=numavtemp%100/10; avtemps3=numavtemp%100%10;、LED1602.H#define l1 0x80#define l2 0xc0void write_cmd(uchar con) LCDEN=0; RS=0; P2=con; delay(2); LCDEN=1; delay(2); LCDEN=0;void write_lcddata(uchar dat) LCDEN=0; RS=1; P2=dat; delay(2); LCDEN=1; delay(2); LCDEN=0; void display(uchar line,uchar t
27、tb,bit sign) uchar i=0; write_cmd(line);/第一行数据起始位 while(ttbi!=0) write_lcddata(ttbi);i+; if(sign=1)/覆盖所有空白 for(i;iNew 或快捷键 Ctrl+N 来实现,然后编写程序。File-Save 或快捷键 Ctrl+S 进行保存。首先第一个程序命名为asd.c,鼠标放在屏幕左侧的 Source Group1 文件夹图标上右击弹出菜单, 在这里可以做在项目中增加减少文件等操作。 我们选” Add File to Group Source Group 1 ”弹出文件窗口,选择刚刚保存的文件,按
28、 ADD 按钮,关闭文件窗,程序文件已加到项目中了。这时在 Source Group1 文件夹图标左边出现了一个小+号说明,文件组中有了文件,点击它可以展开查看。 C 程序文件已被加到了项目中了,下面就开始编译运行了,默认情况下,还不能产生我们需要的 asd.hex,我们还需要修改一下相关参数。在 proteus 软件中测试一下,运行 PROTEUS 模拟仿真软件,打开已绘制好的仿真电路原理图,选中单片机 AT89C58RD,右键点击 AT89C58RD,出现对应的对话框,在 Program File 中找到编译好的“*.HEX”文件,然后点击“OK”就可以进行仿真了。五 设计总结 经过将近两
29、个星期的全小组成员的共同努力,终于完成了大学四年最后一个小组课程设计,在此也感谢闫老师的悉心指导。 本次课程设计主要是对单片机中定时器/计数器,延时以及硬件连线,焊接等知识的综合应用。通过这次的课程设计进一步加深了我们对控制理论与单片机控制技术的理解,其实践过程令我们受益匪浅,因为平时学到的大部分都是理论知识,而课程设计就是将我们的理论应用到实践的过程,很好的锻炼了我们的动手实践能力,加强了将理论知识转化为工作实践的技能。 在本次实践中,主要的是我们要将所学的知识理解透,一定要有个整体的规划,这样才能实现编程;在编程的阶段,要先有了整体的规划,如设计哪些功能,如何实现,采集温度与湿度,如何显示温度与湿度,以及应急情况下如何复位等功能。总体来说,这次课程设计我们基本实现两点(多点)温度监测显示系统的基本功能,不仅加强了我们对于编程的学习应用,同时也巩固在单片机课上所学的知识,加深对单片机中中断,软件设计等问题认识和理解。 总之,通过这次实践,加深了我们对单片机课程的深刻理解,尤其是在通过对系统的软硬件设计和调试过程,积累了不少实践经验,开拓了创新思维,培养了良好的团队意识,细心严谨的工作态度,积极向上的精神,这为今后计算机硬件方面的学习以及日后的工作打下了较为坚实的基础。专心-专注-专业
限制150内