资源预览内容
第1页 / 共32页
第2页 / 共32页
第3页 / 共32页
第4页 / 共32页
第5页 / 共32页
第6页 / 共32页
第7页 / 共32页
第8页 / 共32页
第9页 / 共32页
第10页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
数字显示温度计论文学校: 华侨大学学院: 信息科学与工程学院 班级:10级 集成电路设计与集成系统组别: 自控06组组员:* * * 目 录摘要.3第一章 总体设计方案31.1 系统功能概述 31.2设计思路 31.3总体设计框图 5第二章 硬件设计52.1主电路原理图 52.2 DS18B20温度传感器52.3 DS1302时钟电路 62.4 声光报警电路 62.5 LCD1602显示电路 7第三章 软件设计73.1 系统整体流程图.7第四章 总结与体会8摘要随着现代化信息技术的飞速发展,单片机技术已经十分普及,在实时检测和自动控制的单片机应用系统中,单片机往往是作为核心部件来使用。本论文介绍了一种以单片机AT89C52为主要控制器件,以DS18B20为温度传感器通过LCD液晶屏传送数据,实现温度显示的新型数字温度计。该数字温度计的测量范围为0100,显示分辨率为0.1。高、低两路限温控制点可在0100 0C范围内独立设置,当温度达到高、低限温控制点发出声光报警。由于采用了温度传感器DS18B20作为检测元件,与传统的温度计相比,本文设计的数字温度计减少了外部的硬件电路,具有读数方便,测温范围广,测温精确,数字显示,适用范围宽等特点。DS18B20温度计还可以在高温报警、远距离多点测温控制等方面进行应用开发。该系统结构简单,抗干扰能力强,适合于各种环境下进行现场温度测量,可广泛应用于工业控温系统、温度计、消费产品以及其它温度测控系统。关键词:单片机AT89C52;温度传感器DS18B20;数字温度计;LCD1602液晶屏显示 第一章 总体设计方案1.1系统功能概述 该系统运用了时钟芯片和温度传感器的相结合,并采用液晶屏显示,能够同时显示日历。时间以及多路温度。可以通过按键来调时 调整预设温度的上下限,并设有声光报警,但温度低于最小值或高于最高值时,会提示报警。能过按时保存温度,通过按键能够把保存的温度调取出来。 1.2设计思路:1)、单片机的选择方案1:采用传统的STC89C52RC作为电机的控制核心。单片机算术运算功能强,软件编程灵活、自由度大,可用软件编程实现各种算法和逻辑控制,并且由于其功耗低、体积小、技术成熟和成本低等优点,使其在各个领域应用广泛。方案2:采用STM32F103ZET6微控制器(ARM cortexM3内核),还带有非易失性512k Flash程序存储器。它是一种高性能、低功耗的32位CMOS微处理芯片,市场应用最多。其主要特点如下:512KB Flash ROM,72M的主频,片内集成AD、DA, 以及具有DMA、SPI总线。由于本系统对CPU运算速度要求不高,不需要执行很复杂的运算,加上成本上和队员各自的技术特点考虑,综合起来选STC89C52RC较适合本系统的要求。2)、温度传感器的选择方案1:温度传感器DS18B20是一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,能直接读出被测温度,并且可根据实际要求通过简单的编程实现912位的数字值读数方式。DS18B20具有独特的单线接口,仅需一个端口引脚进行通信,并且多个DS18B20可并联在惟一的三线上,实现多点组网功能;用户还可根据需要定义报警设置,十分方便。方案2:采用热敏电阻和AD转换电路来实现温度的测量综合考虑成本和转换效率以及转换精度等问题我们选用结构简单功能强大的DS18B20型温度传感器3)、时钟电路的选择方案1:DS1302是一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.55.5V。采用三线接口与单片机进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个318的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源和后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。 方案2:STC89C52有3个内部定时器中断,因此我们可以直接采用单片机内部定时器来实现年月日时分秒的计时的功能 综合考虑以上两种方案,由于DS1302的高性能低功耗且内部自带RAM,可以对年、月、日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽,编程简单,有后备电源。所以我们选用DS1302作为时钟芯片。4)、温度的显示可以采用LED数码管来显示,LED亮度高、醒目,但是电路复杂,占用资源多且信息量小。而采用液晶显示器有明显的优点:工作电流比LED小几个数量级,故其功耗低;尺寸小,厚度约为LED的1/3;字迹清晰、美观,寿命长,使用方便,故本设计采用LCD1602来显示温度。选用LCD1602字符型液晶显示器,因LCD1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,当显示是LCD从单片机得到此代码,并把它存储到显示数据RAM(DDRAM)中。LCD的字符发生器根据此代码可产生所需显示信息的5*7点阵图形。字符在LCD显示屏上的位置地址可通过数据总线,由单片机送至LCD指令寄存器。5)、报警电路采用红、黄、绿三个led作为光报警信号,同时增加了一个蜂鸣器作为声报警信号1.3总体设计框图:第二章 硬件设计:2.1、主电路原理图2.2、DS18B20温度传感器原理图2.2 、DS1302原理图2.4、声光报警电路2.5、LCD1602显示电路第三章 软件设计3.1 系统整体流程图是否是开始系统初始化是否有按键按下调时 调温读取温度按时保存温度判断温度是否过高过低显示声光报警第四章 总结与体会作为一名大二学生,在本次设计实践中,深深地体会到“工欲善其事,必先利其器”的道理,生活中无论做什么事都应该事前有充分的准备,做到心中有数,才能更好的完成任务。经过不断的学习和反复的实践,辛勤努力有了回报,终于做出了一个简单的系统,虽然这个系统的功能非常的简单,而且在实际的运用中,也许还有些不足。从这次的设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单片机更应该这样,程序只有在经常地写与读的过程中才能提高,这就是我在这次设计中的最大收获。源代码:#include#define uint unsigned int#define uchar unsigned charsbit rs=P20; /1602sbit rw=P21; /1602sbit en=P22; /1602sbit DQ=P23; /ds18b20sbit T_IO=P34;/ds1302-6sbit T_RST=P35;/ds1302-5sbit T_CLK=P36;/ds1302-7sbit menu=P30;/选择调整位sbit add=P31; /调整+sbit dec=P32; /调整-sbit H_LED=P10;/大于上限温度sbit L_LED=P12; /低于下限温度sbit light=P17; /LED报警sbit sound=P17; /蜂鸣器报警sbit ACC0=ACC0;sbit ACC7=ACC7;/累加器A 51单片机原理中有介绍uchar seconde,minite,hour,day,month,year;/秒,分,时 ,日,月,年uint tvalue1,tvalue2;/温度uchar read_Memory=0;/读温度时被标志位1int H1=310,L1=270,H2=310,L2=270;/温度上下限uchar count=0; /对选择调整位进行计数,0正常显示,1调整秒,2分,3时,4日,5月,6年uchar counter0=0,counter1=0,counter2=0;/对定时器0,1进行计数,没250ms加1,满40(10秒)稳定存储一次uchar P31=1,P32=1,P30=1,flag=1; /配合调整+,配合调整-,配合选择调整位,标志位uchar clk_time7=0,disdata4=0; /秒,分,时寄存器初始值,温度百位,十位,个位,十分位char number=0,number1=0; /number表示数组的序号,number1用于调用温度时,保存当前组号uchar Memory_seconde6=0;/此数组用于记录定点测温时间秒uchar Memory_minite6=0;/此数组用于记录定点测温时间分uchar Memory_hour6=0;/此数组用于记录定点测温时间时uchar Memory_day6=0;/此数组用于记录定点测温时间日uchar Memory_month6=0;/此数组用于记录定点测温时间月uchar Memory_year6=0;/此数组用于记录定点测温时间日int Memory_tvalue16=0;/此数组用于记录定点测温1602第二行温度uint Memory_tvalue26=0;/此数组用于记录定点测温1602第一行温度 uchar code str2=0x28,0x1A,0x6D,0x83,0x03,0x00,0x00,0xC2;/ROM1 对应1602第二行uchar code str1=0x28,0x16,0x4F,0xA5,0x03,0x00,0x00,0xBD;/ROM2 对应1602第一行uchar code table= - - 26.5C;uchar code table2= : : 28.5C;void delay(uint ms) /一毫秒延时 uint i,j; for(j=0;jms;j+) for(i=0;i0;i-) T_IO=ACC0; T_CLK=0; T_CLK=1; ACC=ACC1; /*DS1302:读取操作(下降沿)*/uchar read_byte(void) uchar i; for(i=0;i1; T_CLK = 1; T_CLK = 0; ACC7 = T_IO; return(ACC);/*DS1302:写入数据(先送地址,再写数据)*/ void write_1302(uchar addr,uchar date) T_RST=0; /停止工作 T_CLK=0; T_RST=1; /重新工作 write_byte(addr); /写入地址 write_byte(date); T_RST=0; T_CLK=1; /*DS1302:读取数据(先送地址,再读数据)*/uchar read_1302(uchar addr) uchar temp; T_RST=0; /停止工作 T_CLK=0; T_RST=1; /重新工作 write_byte(addr); /写入地址 temp=read_byte(); T_RST=0; T_CLK=1; /停止工作 return(temp);/*DS18b20初始化程序*/void set_18b20() /初始化 DQ=1;delay1us(4); DQ=0; delay1us(500); DQ=1; delay1us(40); /*DS18b20写数据*/void write_18b20(uchar date)/写数据 uchar i; for(i=8;i0;i-) DQ=0; DQ=date&0x01; delay1us(10); DQ=1; date=date1; /*DS18b20读数据*/uchar read_18b20() /读数据 uchar i,tempx; for(i=8;i0;i-) DQ=0; tempx=tempx1; DQ=1; if(DQ) tempx=tempx|0x80; delay1us(10); return (tempx); /*DS18b20匹配ROM*/void Matchrom_18b20(uchar a) /匹配ROMchar j;write_18b20(0x55); /发送匹配ROM命令if(a=1) for(j=0;j8;j+) write_18b20(str1j);/发送18B20的序列号,先发送低字节 if(a=2) for(j=0;j8;j+) write_18b20(str2j);/发送18B20的序列号,先发送低字节 /*DS18b20读取温度值(多(2)个ds18b20)*/void get_temper() /读取温度值 uint tempk; uchar templ,temph; set_18b20();/开始读取第一个温度tvalue1 Matchrom_18b20(1); write_18b20(0x44); set_18b20(); Matchrom_18b20(1); write_18b20(0xbe); templ=read_18b20(); temph=read_18b20(); tempk=temph; tempk=tempk8; tempk=tempk|templ; tvalue1=tempk*0.625; /第一个温度tvalue1读取结束 delay(10); set_18b20(); /开始读取第二个温度tvalue2 Matchrom_18b20(2); write_18b20(0x44); set_18b20(); Matchrom_18b20(2); write_18b20(0xbe); templ=read_18b20(); temph=read_18b20(); tempk=temph; tempk=tempk8; tempk=tempk|templ; tvalue2=tempk*0.625; /第二个温度tvalue2读取结束/*DS18b20读取温度值(单个ds18b20)*/ /*uint get_temper() /读取温度值 uint tempk; uchar templ,temph; set_18b20(); write_18b20(0xcc); write_18b20(0x44); set_18b20(); write_18b20(0xcc); write_18b20(0xbe); templ=read_18b20(); temph=read_18b20(); tempk=temph; tempk=tempkH1)/对应1602第二行温度值 write_com(0x80+0x40+9); delay(1); write_data(H); delay(1); if(counter2%2)=0)/counter为偶数时声光报警 H_LED=0; / 达到报警要求时,指示灯常亮 sound=0; / 达到报警要求时,报警灯闪烁 light=0; else H_LED=0; sound=1; light=1; if(counter2%10)=0) /防干扰 L_LED=1; if(tvalue2H2)/对应1602第一行温度值 write_com(0x80+9); delay(1); write_data(H); delay(1); if(counter2%2)=0)/counter为偶数时声光报警 H_LED=0; / 达到报警要求时,指示灯常亮 sound=0; / 达到报警要求时,报警灯闪烁 light=0; else H_LED=0; sound=1; light=1; if(counter2%10)=0) /防干扰 L_LED=1; if(tvalue1L1) write_com(0x80+0x40+9); delay(1); write_data(L); delay(1); if(counter2%2)=0)/counter为偶数时声光报警 L_LED=0; / 达到报警要求时,指示灯常亮 sound=0; / 达到报警要求时,报警灯闪烁 light=0; else L_LED=0; sound=1; light=1; if(counter2%10)=0) /防干扰 H_LED=1; if(tvalue2L1)&(tvalue1L2)&(tvalue2H2) write_com(0x80+9); delay(1); write_data( ); delay(1); H_LED=1; L_LED=1; sound=0; light=0; /*温度存储函数*/void Memory_temp( ) Memory_secondenumber=seconde;/此数组用于记录定点测温时间秒 Memory_minitenumber=minite;/此数组用于记录定点测温时间分 Memory_hournumber=hour;/此数组用于记录定点测温时间时 Memory_daynumber=day;/此数组用于记录定点测温时间日 Memory_monthnumber=month;/此数组用于记录定点测温时间月 Memory_yearnumber=year;/此数组用于记录定点测温时间日 Memory_tvalue1number=tvalue1;/此数组用于记录定点测温1602第二行温度 Memory_tvalue2number=tvalue2;/此数组用于记录定点测温1602第一行温度 /*DS18b20温度值显示函数*/void ds18b20disp(uint t,uchar n)/温度值显示 disdata0=(t/1000)+0x30;/百位数 disdata1=(t%1000)/100+0x30;/十位数 disdata2=(t%100)/10+0x30;/个位数 disdata3=(t%10)+0x30;/小数位 if(disdata0=0x30) disdata0=0x20;/如果百位为0,不显示(显示空格) if(disdata1=0x30) disdata1=0x20;/如果百位为0,十位为0也不显示(显示空格) if(n=1) write_com(0x80+0x40+10); /显示百位delay(1);write_data(disdata0); delay(1); write_com(0x80+0x40+11); /显示十位delay(1);write_data(disdata1);delay(1);write_com(0x80+0x40+12); /显示个位delay(1);write_data(disdata2);delay(1);write_com(0x80+0x40+14); /显示小数位delay(1);write_data(disdata3); if(n=2) write_com(0x80+10); /显示百位delay(1);write_data(disdata0); delay(1); write_com(0x80+11); /显示十位delay(1);write_data(disdata1);delay(1);write_com(0x80+12); /显示个位delay(1);write_data(disdata2);delay(1);write_com(0x80+14); /显示小数位delay(1);write_data(disdata3); /*读时间程序*/void read_time_temp( ) uchar i,addr; addr=0x81;/读的初始地址 for(i=0;i7;i+)/分别把秒分时数据读出分3次读好一次地址加2 temp+=2; clk_timei=read_1302(addr); addr=addr+2; hour=(clk_time2/16)*10+clk_time2%16;/ds1302读出的时间是BCD,需转化成十进制数 minite=(clk_time1/16)*10+clk_time1%16;/ds1302读出的时间是BCD,需转化成十进制数 seconde=(clk_time0/16)*10+clk_time0%16;/ds1302读出的时间是BCD,需转化成十进制数 year=(clk_time6/16)*10+clk_time6%16;/ds1302读出的时间是BCD,需转化成十进制数 month=(clk_time4/16)*10+clk_time4%16;/ds1302读出的时间是BCD,需转化成十进制数 day=(clk_time3/16)*10+clk_time3%16;/ds1302读出的时间是BCD,需转化成十进制数/*DS1302时间值显示函数*/void ds1302disp( )/温度值显示 write_sfm(0x40,hour); delay(1); write_sfm(0x40+3,minite); delay(1); write_sfm(0x40+6,seconde); delay(1); write_sfm(0,year); delay(1); write_sfm(3,month); delay(1); write_sfm(6,day);/*调整复位函数*/void RST( ) count=0; flag=1; read_Memory=0; /读数组时被标志为1 TR0=1; /开启定时器0 write_com(0x38);/设置显示模式 delay(2); write_com(0x0c); delay(2); write_com(0x06); delay(2); write_com(0x80+0x40+9); delay(1);write_data( );delay(1);/正常工作,不显示H,L write_com(0x80+9); delay(1);write_data( );delay(1);/正常工作,不显示H,L write_1302(0x8e,0x00); /写保护,允许写入 delay(1); write_1302(0x80,(seconde/10)4)|(seconde%10); /将新数据写入寄存器 delay(1); write_1302(0x82,(minite/10)4)|(minite%10); /将新数据写入寄存器 delay(1); write_1302(0x84,(hour/10)4)|(hour%10); /将新数据写入寄存器 delay(1); write_1302(0x86,(day/10)4)|(day%10); /将新数据写入寄存器 delay(1); write_1302(0x88,(month/10)4)|(month%10); /将新数据写入寄存器 delay(1); write_1302(0x8c,(year/10)990) H1=990; /对应1602第二行温度值 ds18b20disp(H1,1); break; case 8: L1+;if(L1990) L1=990; /对应1602第二行温度值 ds18b20disp(L1,1); break; case 9: H2+;if(H2990) H2=990; /对应1602第一行温度值 ds18b20disp(H2,2); break; case 10: L2+;if(L2990) L2=990; /对应1602第一行温度值 ds18b20disp(L2,2); break; default:break; else switch(count2) case 7: H1-;if(H10) H1=0; /对应1602第二行温度值 ds18b20disp(H1,1); break; case 8: L1-;if(L10) L1=0; /对应1602第二行温度值 ds18b20disp(L1,1); break; case 9: H2-;if(H20) H2=0; /对应1602第一行温度值 ds18b20disp(H2,2); break;case 10: L2-;if(L259) time_date=0; write_sfm(0x40+6,time_date);delay(1);seconde=time_date; /液晶屏写秒 break; case 2: if(time_date59) time_date=0; write_sfm(0x40+3,time_date);delay(1);minite=time_date; /液晶屏写分 break; case 3: if(time_date23) time_date=0; write_sfm(0x40,time_date);delay(1); hour=time_date;/液晶屏写时 break; case 4: if(time_date31) time_date=1; write_sfm(6,time_date); delay(1);day=time_date;/液晶屏写日 break; case 5: if(time_date12) time_date=1; write_sfm(3,time_date); delay(1);month=time_date;/液晶屏写月 break; case 6: if(time_date59) time_date=0; write_sfm(0,time_date);delay(1);year=time_date; /液晶屏写年 break; default:break; else time_date-; switch(count1) case 1: if(time_date0) time_date=59; write_sfm(0x40+6,time_date);delay(1);seconde=time_date; /液晶屏写秒 break; case 2: if(time_date0) time_date=59; write_sfm(0x40+3,time_date);delay(1);minite=time_date; /液晶屏写分 break; case 3: if(time_date0) time_date=23; write_sfm(0x40,time_date);delay(1);hour=time_date; /液晶屏写时 break; case 4: if(time_date=0) time_date=31; write_sfm(6,time_date); delay(1);day=time_date;/液晶屏写日 break; case 5: if(time_date=0) time_date=12; write_sfm(3,time_date); delay(1);month=time_date;/液晶屏写月 break; case 6: if(time_date=0) time_date=59; write_sfm(0,time_date); delay(1);year=time_date; /液晶屏写年 break; default:break; write_1302(0x8e,0x00); /写保护,允许写入delay(1); write_1302(addr-1),(time_date/10)4)|(time_date%10); /将新数据写入寄存器delay(1); write_1302(0x8e,0x80);/写保护,禁止写入 /*按键扫描*/void key_scan( )uchar i;if(menu!=P30)/选择调整模式 delay(5); if(menu=0) TR0=0; count+; write_com(0x0f); flag=0; if(count=11) RST( );/调用调整复位函数,正常工作 P30=menu; switch(count) case 1: write_com(0x80+0x40+7); if(add!=P31)/秒调整+ delay(5); if(add=0) turn_val(1,1,0x81); P31=add; if(dec!=P32)/秒调整- delay(5); if(dec=0) turn_val(1,0,0x81); P32=dec; break; case 2: write_com(0x80+0x40+4); if(add!=P31)/分调整+ delay(5); if(add=0) turn_val(2,1,0x83); P31=add; if(dec!=P32)/分调整- delay(5); if(dec=0) turn_val(2,0,0x83); P32=dec; break; case 3: write_com(0x80+0x40+1); if(add!=P31)/时调整+ delay(5); if(add=0) turn_val(3,1,0x85); P31=add; if(dec!=P32)/时调整- delay(5); if(dec=0) turn_val(3,0,0x85); P32=dec; break; case 4: write_com(0x80+7); if(add!=P31)/日调整+ delay(5); if(add=0) turn_val(4,1,0x87); P31=add; if(dec!=P32)/日调整- delay(5); if(dec=0) turn_val(4,0,0x87); P32=dec; break; case 5: write_com(0x80+4); if(add!=P31)/月调整+ delay(5); if(add=0) turn_val(5,1,0x89); P31=add; if(dec!=P32)/月调整- delay(5); if(dec=0) turn_val(5,0,0x89); P32=dec; break; case 6: write_com(0x80+1); if(add!=P31)/年调整+ delay(5); if(add=0) turn_val(6,1,0x8d); P31=add; if(dec!=P32)/年调整- delay(5); if(dec=0) turn_val(6,0,0x8d); P32=dec; break; case 7: write_com(0x80+0x40+9); delay(1);write_data(H);delay(1); ds18b20disp(H1,1); write_com(0x80+0x40+14);/1602第二行上限温度设置 if(add!=P31) /上限温度+ delay(5); if(add=0) turn_temp(7,1); P31=add; if(dec!=P32) /上限温度- delay(5); if(dec=0) turn_temp(7,0); P32=dec; break; case 8: write_com(0x80+0x40+9); delay(1);write_data(L);delay(1); ds18b20disp(L1,1); write_com(0x80+0x40+14);/1602第二行下限温度设置 if(add!=P31) /下限温度+ delay(5); if(add=0) turn_temp(8,1); P31=add; if(dec!=P32) /下限温度- delay(5); if(dec=0) turn_temp(8,0); P32=dec; break; case 9: write_com(0x80+0x40+9); delay(1);write_data( );delay(1);/正常工作,不显示H,L write_com(0x80+9); delay(1);write_data(H); ds18b20disp(H2,2); write_com(0x80+14);/1602第一行上限温度设置 if(add!=P31) /上限温度+ delay(5); if(add=0) turn_temp(9,1); P31=add; if(dec!=P32) /上限温度- delay(5); if(dec=0) turn_temp(9,0); P32=dec; break; case 10: write_com(0x80+9); delay(1);write_data(L);delay(1); ds18b20disp(L2,2); write_com(0x80+14); /1602第一行下限温度设置 if(add!=P31) /下限温度+ delay(5); if(add=0) turn_temp(10,1); P31=add; if(dec!=P32) /下限温度- delay(5); if(dec=0) turn_temp(10,0); P32=dec; break; default: break; if(count=0)&(add!=P31)/调用数组 delay(5); if(add=0) flag=0; /查看保存的温度值时液晶屏不更新时间,温度值 read_Memory=1; / 读数组时被标志为1 TR0=0; /关定时器1 number=number-1; if(number0) number=number1; write_sfm(0x40,Memory_hournumber); delay(1); write_sfm(0x40+3,Memory_minitenumber); delay(1); write_sfm(0x40+6,Memory_secondenumber); delay(1); write_sfm(0,Memory_yearnumber); delay(1); write_sfm(3,Memory_monthnumber); delay(1); write_sfm(6,Memory_daynumber); delay(1); ds18b20disp(Memory_tvalue1number,1); /显示温度值 delay(1); ds18b20disp(Memory_tvalue2number,2); /显示温度值 delay(1); write_com(0x06); delay(1);/不显示光标 P31=add; if(count=0)&(dec!=P32) delay(5); if(dec=0) RST( ); /清零时复位显示,正常更新温度,时间 number=0; /数组清零 number1=0; for(i=0;i4)/mstcnt满5即为250ms counter0+; mstcnt0=0; /对计数单元的清零,重新开始计数 if(counter040) /定时10s,没10s温度保存一次 Memory_temp( ); number1=number; /将当前组号存储,便于下次从该出继续存储 number+; if(number=6) number=0; counter0=0; void timer1(void) interrupt 3 /定时器1,中断3,0.05s中断一次 uchar mstcnt1; TH1=0x3c; /手动加载计数初值 TL1=0xb0; TMOD=0x11; /使用16位定时器 mstcnt1+; /用于计算时间,每隔50ms加1 if(menu=1) counter1=0; if(mstcnt11)/mstcnt满5即为250ms counter2+; if(menu=0) counter1+; mstcnt1=0; /对计数单元的清零,重新开始计数 if(counter110) /定时1s counter1=0; RST( ); /长按菜单键1秒,显示正常温度,时间 if(counter2200) /定时1s counter2=0; void init()/初始化函数 uchar i;rw=0; TMOD=0x11; /time0为定时器,方式1 TH0=0x3c; TL0=0xb0; /预置计数初值,50ms TH1=0x3c; TL1=0xb0; /预置计数初值,50ms EA=1; /总中断开 ET0=1; /允许定时器0中断 TR0=1; /开启定时器0 ET1=1; /允许定时器1中断 TR1=1; /开启定时器1 delay(5); write_com(0x38);/设置显示模式 delay(2); write_com(0x0c); delay(2); write_com(0x06); delay(2); write_com(0x01); /清零 delay(2); for(i=0;isizeof(table)-1;i+) write_data(tablei); delay(2); write_com(0x80+0x40); delay(15); for(i=0;isizeof(table2)-1;i+) write_data(table2i); delay(5); write_1302(0x8e,0x00);/写保护,允许写入 write_1302(0x80,0x35); /写秒 write_1302(0x82,0x59);/写分 write_1302(0x84,0x23); /写时 write_1302(0x86,0x31); /写日 write_1302(0x88,0x07); /写月 write_1302(0x8c,0x12);/写年 write_1302(0x8e,0x80); /写保护,禁止写入 void main() init(); while(1) if(flag=1) read_time_temp( );/读时间 ds1302disp( ) ;/显示时间if(counter2%5)=0) get_temper(); /读温度值 ds18b20disp(tvalue1,1); /显示温度值tvalue1ds18b20disp(tvalue2,2); /显示温度值tvalue2 Sound_Light( ); /声光报警 if(read_Memory=1) read_time_temp( );/读时间if(counter2%5)=0) get_temper(); /读温度值 key_scan( ); / 按键扫描 32
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号