基于STC89C52和LCD1602DS1302的数字温度计绝对正确赋源代码.docx
- 文档编号:27028161
- 上传时间:2023-06-25
- 格式:DOCX
- 页数:47
- 大小:201.94KB
基于STC89C52和LCD1602DS1302的数字温度计绝对正确赋源代码.docx
《基于STC89C52和LCD1602DS1302的数字温度计绝对正确赋源代码.docx》由会员分享,可在线阅读,更多相关《基于STC89C52和LCD1602DS1302的数字温度计绝对正确赋源代码.docx(47页珍藏版)》请在冰豆网上搜索。
基于STC89C52和LCD1602DS1302的数字温度计绝对正确赋源代码
《数字显示温度计》论文
学校:
华侨大学
学院:
信息科学与工程学院
班级:
10级集成电路设计与集成系统
组别:
自控06组
组员:
********
摘要..............................................3
3.1系统整体流程图…………………………………………………………………………….7
第五章总结与体会…………………………………………………………………8
第六章源代码……………………………………………………………………..8
摘要
随着现代化信息技术的飞速发展,单片机技术已经十分普及,在实时检测和自动控制的单片机应用系统中,单片机往往是作为核心部件来使用。
本论文介绍了一种以单片机AT89C52为主要控制器件,以DS18B20为温度传感器通过LCD液晶屏传送数据,实现温度显示的新型数字温度计。
该数字温度计的测量范围为0~100℃,显示分辨率为0.1℃。
高、低两路限温控制点可在0~1000C范围内独立设置,当温度达到高、低限温控制点发出声光报警。
由于采用了温度传感器DS18B20作为检测元件,与传统的温度计相比,本文设计的数字温度计减少了外部的硬件电路,具有读数方便,测温范围广,测温精确,数字显示,适用范围宽等特点。
DS18B20温度计还可以在高温报警、远距离多点测温控制等方面进行应用开发。
该系统结构简单,抗干扰能力强,适合于各种环境下进行现场温度测量,可广泛应用于工业控温系统、温度计、消费产品以及其它温度测控系统。
关键词:
单片机AT89C52;温度传感器DS18B20;数字温度计;LCD1602液晶屏显示
第一章总体设计方案
1.1设计思路:
1)、单片机的选择
方案1:
采用传统的STC89C52RC作为电机的控制核心。
单片机算术运算功能强,软件编程灵活、自由度大,可用软件编程实现各种算法和逻辑控制,并且由于其功耗低、体积小、技术成熟和成本低等优点,使其在各个领域应用广泛。
方案2:
采用STM32F103ZET6微控制器(ARMcortexM3内核),还带有非易失性512kFlash程序存储器。
它是一种高性能、低功耗的32位CMOS微处理芯片,市场应用最多。
其主要特点如下:
512KBFlashROM,72M的主频,片内集成AD、DA,以及具有DMA、SPI总线。
由于本系统对CPU运算速度要求不高,不需要执行很复杂的运算,加上成本上和队员各自的技术特点考虑,综合起来选STC89C52RC较适合本系统的要求。
2)、温度传感器的选择
方案1:
温度传感器DS18B20是一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20具有独特的单线接口,仅需一个端口引脚进行通信,并且多个DS18B20可并联在惟一的三线上,实现多点组网功能;用户还可根据需要定义报警设置,十分方便。
方案2:
采用热敏电阻和AD转换电路来实现温度的测量
综合考虑成本和转换效率以及转换精度等问题我们选用结构简单功能强大的DS18B20型温度传感器
3)、时钟电路的选择
方案1:
DS1302是一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.5~5.5V。
采用三线接口与单片机进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的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.2总体设计框图:
第三章硬件设计:
2.1、主电路原理图
2.2、DS18B20温度传感器原理图
2.2、DS1302原理图
2.4、声光报警电路
2.5、LCD1602显示电路
第四章软件设计
3.1系统整体流程图
第五章总结与体会
作为一名大二学生,在本次设计实践中,深深地体会到“工欲善其事,必先利其器”的道理,生活中无论做什么事都应该事前有充分的准备,做到心中有数,才能更好的完成任务。
经过不断的学习和反复的实践,辛勤努力有了回报,终于做出了一个简单的系统,虽然这个系统的功能非常的简单,而且在实际的运用中,也许还有些不足。
从这次的设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单片机更应该这样,程序只有在经常地写与读的过程中才能提高,这就是我在这次设计中的最大收获。
第六章源代码
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitrs=P2^0;//1602
sbitrw=P2^1;//1602
sbiten=P2^2;//1602
sbitDQ=P2^3;//ds18b20
sbitT_IO=P3^4;//ds1302-6
sbitT_RST=P3^5;//ds1302-5
sbitT_CLK=P3^6;//ds1302-7
sbitmenu=P3^0;//选择调整位
sbitadd=P3^1;//调整+
sbitdec=P3^2;//调整-
sbitH_LED=P1^0;//大于上限温度
sbitL_LED=P1^2;//低于下限温度
sbitlight=P1^7;//LED报警
sbitsound=P1^7;//蜂鸣器报警
sbitACC0=ACC^0;
sbitACC7=ACC^7;//累加器A51单片机原理中有介绍
ucharseconde,minite,hour,day,month,year;//秒,分,时,日,月,年
uinttvalue1,tvalue2;//温度
ucharread_Memory=0;//读温度时被标志位1
intH1=310,L1=270,H2=310,L2=270;//温度上下限
ucharcount=0;//对选择调整位进行计数,0正常显示,1调整秒,2分,3时,4日,5月,6年
ucharcounter0=0,counter1=0,counter2=0;//对定时器0,1进行计数,没250ms加1,满40(10秒)稳定存储一次
ucharP31=1,P32=1,P30=1,flag=1;//配合调整+,配合调整-,配合选择调整位,标志位
ucharclk_time[7]={0},disdata[4]={0};//秒,分,时寄存器初始值,温度百位,十位,个位,十分位
charnumber=0,number1=0;//number表示数组的序号,number1用于调用温度时,保存当前组号
ucharMemory_seconde[6]={0};//此数组用于记录定点测温时间秒
ucharMemory_minite[6]={0};//此数组用于记录定点测温时间分
ucharMemory_hour[6]={0};//此数组用于记录定点测温时间时
ucharMemory_day[6]={0};//此数组用于记录定点测温时间日
ucharMemory_month[6]={0};//此数组用于记录定点测温时间月
ucharMemory_year[6]={0};//此数组用于记录定点测温时间日
intMemory_tvalue1[6]={0};//此数组用于记录定点测温1602第二行温度
uintMemory_tvalue2[6]={0};//此数组用于记录定点测温1602第一行温度
ucharcodestr2[]={0x28,0x1A,0x6D,0x83,0x03,0x00,0x00,0xC2};//ROM1对应1602第二行
ucharcodestr1[]={0x28,0x16,0x4F,0xA5,0x03,0x00,0x00,0xBD};//ROM2对应1602第一行
ucharcodetable[]={"--26.5C"};
ucharcodetable2[]={":
:
28.5C"};
voiddelay(uintms)//一毫秒延时
{
uinti,j;
for(j=0;j for(i=0;i<120;i++); } voiddelay1us(uintus)//1us延时 { while(us--); } voidwrite_com(ucharcom)//写指令 { rs=0; P0=com; en=1; en=0; } voidwrite_data(uchardata0)//写数据 { rs=1; P0=data0; en=1; en=0; delay (2); } voidwrite_sfm(ucharadd,uchardate) { ucharshi,ge; shi=date/10; ge=date%10; write_com(0x80+add); delay (2); write_data(0x30+shi); delay (2); write_data(0x30+ge); delay (2); } /******************DS1302: 写入操作(上升沿)*********************/ voidwrite_byte(ucharda) { uchari; ACC=da; for(i=8;i>0;i--) { T_IO=ACC0; T_CLK=0; T_CLK=1; ACC=ACC>>1; } } /******************DS1302: 读取操作(下降沿)*****************/ ucharread_byte(void) { uchari; for(i=0;i<8;i++) { ACC=ACC>>1; T_CLK=1; T_CLK=0; ACC7=T_IO; } return(ACC); } /******************DS1302: 写入数据(先送地址,再写数据)***************************/ voidwrite_1302(ucharaddr,uchardate) { T_RST=0;//停止工作 T_CLK=0; T_RST=1;//重新工作 write_byte(addr);//写入地址 write_byte(date); T_RST=0; T_CLK=1; } /******************DS1302: 读取数据(先送地址,再读数据)**************************/ ucharread_1302(ucharaddr) { uchartemp; T_RST=0;//停止工作 T_CLK=0; T_RST=1;//重新工作 write_byte(addr);//写入地址 temp=read_byte(); T_RST=0; T_CLK=1;//停止工作 return(temp); } /*****************DS18b20初始化程序**************/ voidset_18b20()//初始化 { DQ=1; delay1us(4); DQ=0; delay1us(500); DQ=1; delay1us(40); } /*****************DS18b20写数据**************/ voidwrite_18b20(uchardate)//写数据 { uchari; for(i=8;i>0;i--) { DQ=0; DQ=date&0x01; delay1us(10); DQ=1; date=date>>1; } } /*****************DS18b20读数据**************/ ucharread_18b20()//读数据 { uchari,tempx; for(i=8;i>0;i--) { DQ=0; tempx=tempx>>1; DQ=1; if(DQ) tempx=tempx|0x80; delay1us(10); } return(tempx); } /*****************DS18b20匹配ROM**************/ voidMatchrom_18b20(uchara)//匹配ROM { charj; write_18b20(0x55);//发送匹配ROM命令 if(a==1) { for(j=0;j<8;j++) {write_18b20(str1[j]);}//发送18B20的序列号,先发送低字节 } if(a==2) { for(j=0;j<8;j++) {write_18b20(str2[j]);}//发送18B20的序列号,先发送低字节 } } /*****************DS18b20读取温度值(多 (2)个ds18b20)**************/ voidget_temper()//读取温度值 { uinttempk; uchartempl,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=tempk<<8; 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=tempk<<8; tempk=tempk|templ; tvalue2=tempk*0.625;//第二个温度tvalue2读取结束 } /*****************DS18b20读取温度值(单个ds18b20)**************/ /*uintget_temper()//读取温度值 { uinttempk; uchartempl,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=tempk<<8; tempk=tempk|templ; tvalue1=tempk*0.625; return(tvalue1); }*/ /*****************声光报警**************/ voidSound_Light() { if(tvalue1>H1)//对应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(tvalue2>H2)//对应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(tvalue1 { 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(tvalue2 { write_com(0x80+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((tvalue1>L1)&&(tvalue1 { write_com(0x80+0x40+9); delay (1); write_data(''); delay (1); H_LED=1; L_LED=1; sound=0; light=0; } if((tvalue2>L2)&&(tvalue2 { write_com(0x80+9); delay (1); write_data(''); delay (1); H_LED=1; L_LED=1; sound=0; light=0; } } //******************温度存储函数************************// voidMemory_temp() { Memory_seconde[number]=seconde;//此数组用于记录定点测温时间秒 Memory_minite[number]=minite;//此数组用于记录定点测温时间分 Memory_hour[number]=hour;//此数组用于记录定点测温时间时 Memory_day[number]=day;//此数组用于记录定点测温时间日 Memory_month[number]=month;//此数组用于记录定点测温时间月 Memory_year[number]=year;//此数组用于记录定点测温时间日 Memory_tvalue1[number]=tvalue1;//此数组用于记录定点测温1602第二行温度 Memory_tvalue2[number]=tvalue2;//此数组用于记录定点测温1602第一行温度 } /*****************DS18b20温度值显示函数**************/ voidds18b20disp(uintt,ucharn)//温度值显示 { disdata[0]=(t/1000)+0x30;//百位数 disdata[1]=(t%1000)/100+0x30;//十位数 disdata[2]=(t%100)/10+0x30;//个位数 disdata[3]=(t%10)+0x30;//小数位 if(disdata[0]==0x30) { disdata[0]=0x20;//如果百位为0,不显示(显示空格) if(disdata[1]==0x30) { disdata[1]=0x20;//如果百位为0,十位为0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STC89C52 LCD1602DS1302 数字 温度计 绝对 正确 源代码
![提示](https://static.bdocx.com/images/bang_tan.gif)