单片机温度计DSB_第1页
单片机温度计DSB_第2页
单片机温度计DSB_第3页
单片机温度计DSB_第4页
单片机温度计DSB_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机课程设计论文

基于18B20温度检测系统设计引言温度是工农业生产中最常见的参数之一,与产品的质量、生产效率、安全生产等密切相关,因此在生产过程中需对温度进行检测和监控。然而,传统的测温系统多以二极管、Pt100及AD590作为温度检测单元,通过信号处理电路将待测温度的变化转换为电信号的变化,从而实现温度的测量.伴随着微电子技术的发展,利用单线总线实现信号双向传输的数字温度传感器的出现,改变了传统测量温度的方法。该设计系统主要由STC89C52单片机、数字温度传感器DS18B20及液晶显示器12864三大部分组成。在此系统中,DS18B20是美国生产的低功耗、高性能、抗干扰能力强的单总线数字温度传感器芯片,具有可编程的温度转换分辨率,可根据应用需要在9~12bit之间选取,且测温范围为:-55~125℃.作为温度采集单元的DS18B20,采用外部电源供电方式,与STC89C2单片机进行双向通信,无需A/D,就可以直接将被测温度转换为数字信号供单片机进行处理,最终将换算得到的测量温度值显示在液晶显示器上。实验器材电源+5V、万用表、电烙铁器件名称大小(型号)数量器件名称大小(型号)数量DS18B201STC89C52140脚锁紧插座1LCD128641电位器10K1杜邦线、排座若干、硬件电路1、数字温度传感器18b20与单片机硬件连线DSDS18b20与89C52连线VDD接外部电源,DQ(I/O)口与单片机P1.1串口连接,同时接4.7K上拉电阻接电源,GND接地.下图为所用DS18B20的封装,它是独特的单线接口方式,在与89c52连接时仅需要一条口线即可实现双向通讯,无需外部元件。电压范围为3。0V至5。5V,无需备用电源,测量温度范围为-55℃至+125℃.温度传感器可编程的分辨率为9~12位,温度转换为12位数字格式,最大值为750毫秒.DS18B20内部结构主要由四部分组成:64位光刻ROM,温度报警触发器,温度传感器以及高速缓存器。此外,DS18B20内部还包括寄生电源、电源检测、存储控制逻辑、8位循环冗余码生成器(CRC)等部分.内部结构为:若是要使采集的数据分辨率越高,则所需要的温度数据转换时间越长.因此,在实际应用中要将分辨率和转换时间权衡考虑。DS18B20的测温原理如下图所示:减法计数器1斜坡累加器减法计数器1斜坡累加器减到0减法计数器2预置低温度系数振荡器高温度系数振荡器计数比较器预置温度寄存器减到0加1LCD12864与单片机的硬件连线LCD16824液晶1脚VSS接地,2脚VDD接电源,3脚V0接10K滑动变阻器调节对比度,4脚RS接单片机P1.4口,5脚RW脚接单片机P1.3口,6脚EN接单片机P1。2口,7~14脚DB口接单片机P2口,15脚PSB接高电平,默认为并行串口方式,16~18脚NC\RST\VOUT悬空默认低电平,19脚A默认高电平,接高电平,液晶背景光为亮,20脚K接地。带中文字库的12864是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面.它每屏最多可实现4行*8=32个中文字符或64个ASCII码字符的显示,内部提供128×2字节的字符显示RAM缓冲区(DDRAM),字符显示是通过将字符显示编码写入该字符显示RAM实现的。根据写入内容的不同,可分别在液晶屏上显示CGROM(中文字库)、HCGROM(ASCII码字库)及CGRAM(自定义字形)的内容。同时它可以先设垂直地址再设水平地址方式显示图形,功能比1602更好。3、单片机复位和振荡电路连线A、复位是单片机的初始化操作,其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键重新启动。除PC之外,复位操作还对其他一些寄存器有影响,它们的复位状态如表一所示。表一一些寄存器的复位状态寄存器复位状态寄存器复位状态PC0000HTCON00HACC00HTL000HPSW00HTH000HSP07HTL100HDPTR0000HTH100HP0—P3FFHSCON00HIPXX000000BSBUF不定IE0X000000BPCON0XXX0000BTMOD00HRST引脚是复位信号的输入端。复位信号是高电平有效,其有效时间应持续24个振荡周期(即二个机器周期)以上.B、时钟电路相当于微机处理器的脉搏,单片机内部有一个高增益反相放大器,反相放大端输入为XTAL1,输出为XTAL2,在XTAL1和XTAL2两端跨接石英晶体及微调电容就构成了振荡器.我们用了11。0592M的晶振,则振荡周期为T0=1/11。0592us,时钟周期为2T0,机器周期为12T0。、软件设计1、18b20驱动时序#include〈reg52.h〉#include〈intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitdq=P1^1;uintt,s;ucharflag,count;voiddelayus(uintz)//ds18b20内部延时{ﻩuchari; for(i=0;i<z;i++);}////ds18b20复位,及存在检测//uchards18b20_reset()ﻩ {ﻩﻩuchark;ﻩdq=1;//释放总线ﻩdelayus(5);//延时5usﻩdq=0;//拉低总线 delayus(30); dq=1;//释放总线 delayus(3);ﻩk=dq;//对数据较采样 delayus(25);ﻩreturnk;//根据K值判断da18b20是否损坏}////写数据到ds18b20//voidds18b20_writedate(uchardate){ ucharnum;ﻩfor(num=0;num<8;num++) {ﻩ ﻩdq=0;//拉低总线,产生写信号delayus(4);ﻩﻩdq=date&0x01;//发送一位数据ﻩ date>>=1;//准备下一位数据传送ﻩﻩdelayus(4);ﻩ//延时4usﻩ dq=1;//释放总线,等待总线恢复 } delayus(4);}///从ds18b20中读数据///uchards18b20_readdate(){ﻩucharvalue,i;ﻩfor(i=0;i〈8;i++)//读8位ﻩ{ ﻩdq=0;///拉低总线,产生读信号ﻩdelayus(4); ﻩvalue>〉=1;//准备读温度delayus(4); dq=1;//释放总线,准备读数据 if(dq)//读数据 ﻩvalue|=0x80;ﻩ delayus(6);//延时 } returnvalue;///返回独到的数据}///ds18b20初始化以及数据处理//uintread_temp(){ﻩﻩuintg,d,m;ﻩuintc; m=1; m=ds18b20_reset();//复位检测ds18b20正常工作,m=0ﻩﻩwhile(m);//等待复位完成 ds18b20_writedate(0xcc);//跳过romﻩds18b20_writedate(0x44);//启动温度测量,写暂存器 delayus(100);ﻩm=ds18b20_reset();ﻩwhile(m);//等待转化完成 ds18b20_writedate(0xcc);//跳过romﻩds18b20_writedate(0xbe);//读ds18b20温度暂存器命令 d=ds18b20_readdate();//读低8位数据 g=ds18b20_readdate();//读高3位数据 g〈<=4;//数据转换处理程序 g=g+(d〉>4);ﻩﻩ ﻩﻩ//整数部分ﻩg=g*100;ﻩd=(d&0x0f)*0.0625*100; ﻩc=g+d; returnc; ﻩ ﻩﻩ}///温度转换显示子程序//voidwrite_temp(uinttemp){ﻩ12864_writecom(0x88+3);//显示地址指针ﻩ12864_writedat(0x30+temp%10000/1000);//写数据最高位(十位)ﻩ12864_writedat(0x30+temp%1000/100);//写个位ﻩ12864_writedat('.');//写小数点ﻩ12864_writedat(0x30+temp%100/10);//小数位ﻩ12864_writedat(0x30+temp%10);ﻩ}///中断初始化程序//voidinit(){ﻩ count=0;ﻩTMOD=0x21; TH1=0xfd;ﻩTL1=0xfd;ﻩTH0=(65536-50000)/256;//设定时器0初值 TL0=(65536-50000)%256;ﻩSM0=0; SM1=1; TR1=1;ﻩREN=1;ﻩTR0=1;ﻩET0=1;ﻩES=1;ﻩEA=1;开中断}//开定时器0中断1,在液晶上显示温度//voidtimer0()interrupt1{ﻩﻩTH0=(65536-50000)/256; TL0=(65536-50000)%256; count++; if(count>=18)ﻩ{ﻩ ﻩt=read_temp();ﻩ write_temp(t); count=0;ﻩ}}voidses()interrupt4{ﻩTI=0; ET0=0;ﻩif(flag==4)ﻩﻩflag=0;ﻩswitch(flag) { case0:ﻩSBUF=50;delay(5);break; case1: SBUF=t/100;delay(5);ﻩbreak; case2:ﻩ SBUF=t%100;delay(5);break; case3:ﻩﻩSBUF=40;delay(5);break; ﻩdefault:flag=0;ﻩ}ﻩflag++; delay(50);ﻩET0=1;}2、LCD12864的显示程序#include<reg52.h〉#include〈intrins.h〉#defineucharunsignedchar#defineuintunsignedintsbitlcd_en=P1^2;sbitlcd_rs=P1^4;sbitlcd_rw=P1^3;///sbitlcd_psb=P3^6;voidinit_12864(void);void12864_writecom(ucharcom);void12864_writedat(uchardat);voidwrite_12864com(ucharcom)//写指令函数{ﻩlcd_rs=0; lcd_rw=0; lcd_en=0;ﻩP2=com;//P2口传送数据 delay(5); lcd_en=1; delay(5);ﻩlcd_en=0;}voidwrite_12864dat(uchardate)//写数据函数{ lcd_rs=1; lcd_rw=0; lcd_en=0;ﻩP2=date; delay(5);ﻩlcd_en=1;ﻩdelay(5);ﻩlcd_en=0;}voidinit_12864()//初始化液晶{ //lcd_psb=1; write_12864com(0x30); delay(5); write_12864com(0x0c); delay(5); write_12864com(0x01);ﻩdelay(5);}voidwrite_temp(uinttemp)//显示温度{ﻩwrite_12864com(0x88+4); write_12864dat(0x30+temp%10000/1000);ﻩwrite_12864dat(0x30+temp%1000/100);ﻩwrite_12864dat('。’);ﻩwrite_12864dat(0x30+temp%100/10);ﻩwrite_12864dat(0x30+temp%10); }voidmain()//主函数{ uchari;SBUF=0;ﻩinit_12864();///初始化液晶12864_writecom(0x0c);//关显示显示游标地址加1while(1){ﻩ12864_writecom(0x80);//写数据入口地址,液晶第一行显示ﻩfor(i=0;i<16;i++)ﻩ{ﻩﻩ uchartable1[]=”单片机课程设计";ﻩﻩ12864_writedat(table1[i]); } 12864_writecom(0x90);//液晶第二行入口地址ﻩfor(i=0;i<16;i++) { uchartable1[]=”徐新丽张燕"; 12864_writedat(table1[i]); } 12864_writecom(0x88);//液晶第三行入口地址 for(i=0;i<16;i++)ﻩ{ ﻩﻩuchartable1[]=”温度:C"; ﻩ12864_writedat(table1[i]);ﻩ}init(); //中断初始化}四、总结1、复位开关焊接前需要测试一下使用的两端是否有效,否则会导致电源与地短路,烧坏电路.焊接时,因为没有仔细检查,后上电前用万用表查出焊错了,还好没有导致严重后果,改正之后可正常使用。2、焊接前需要对照ds18b20的三个引脚标号,电源与地不能接反。检查电路时查出接反,改正之后能正常工作。3、编程序时需要查看DS18B20以及LCD12864的数据手册,对照手册上的内容进行编程。初始化以及写数据读数据的程序一般为固定模式,对照数据手册以及系统功能,初始化系统;显示数据时要先对读进的数据进行数据处理,否则不能直接得到温度值。4、在LCD12864上显示中文字时,每个汉字占两位,所以在设置中文时要注意空格的位数,否则会出现乱码,不显示汉字。调试程序时就遇到了这个问题;编程前最好在网上搜查这两个器件的一些注意点,少走歪路。5、调试成功后,在液晶上显示“单片机课程设计”成员姓名“。。..。。。。..”当前温度显示“温度:****”实物如下图所示。正面:反面:致谢本设计历时两星期,通过前期的收集、查阅资料,了解DS18B20的一些特性以及基本用法,确定单片机型号STC89C52;设计电路,用PROTEL画电路原理图,购买器件,同时编写程序并调试;焊接电路,查看电路;最后用单片机驱动显示并调试。这里感谢。...同学,显示出错时,及时帮助我们找出程序错误并改正,使液晶能够按照我们的想法与要求显示。同时感谢小组成员张燕同学,与她共同完成这些工作,相互学习,收获很多。附件1、电路图:附件2:#include<reg52。h>#include〈intrins。h>#defineucharunsignedchar#defineuintunsignedintsbitlcd_en=P1^2;sbitlcd_rs=P1^4;sbitlcd_rw=P1^3;///sbitlcd_psb=P3^6;sbitdq=P1^1;uintt,s;//voidinit();/////////////////ucharflag,count;voiddelayus(uintz);voiddelay(uintz);voidinit_12864(void);voidwrite_12864com(ucharcom);voidwrite_12864dat(uchardat);voidwrite_12864com(ucharcom)//写指令函数{ lcd_rs=0;ﻩlcd_rw=0;ﻩlcd_en=0; P2=com;ﻩdelay(5); lcd_en=1;ﻩdelay(5);ﻩlcd_en=0;}voidwrite_12864dat(uchardate)//写数据函数{ﻩlcd_rs=1;ﻩlcd_rw=0; lcd_en=0; P2=date; delay(5); lcd_en=1;ﻩdelay(5); lcd_en=0;}voidinit_12864()//初始化液晶{ﻩ//lcd_psb=1;ﻩwrite_12864com(0x30); delay(5);ﻩwrite_12864com(0x0c);ﻩdelay(5);ﻩwrite_12864com(0x01); delay(5);}voidwrite_temp(uinttemp){ﻩwrite_12864com(0x88+4); write_12864dat(0x30+temp%10000/1000);ﻩwrite_12864dat(0x30+temp%1000/100); write_12864dat('.'); write_12864dat(0x30+temp%100/10);ﻩwrite_12864dat(0x30+temp%10); }voiddelay(uintz){uintx,y;for(x=z;x〉0;x--)for(y=110;y〉0;y-—);}voiddelayus(uintz){ uchari; for(i=0;i<z;i++);}ucharclean_ds18b20() ﻩ{ﻩﻩuchark; dq=1;ﻩdelayus(5);ﻩdq=0; delayus(30); dq=1;ﻩdelayus(3); k=dq; delayus(25);ﻩreturnk;}voidwrite_ds18b20_date(uchardate){ ucharnum;ﻩfor(num=0;num<8;num++) {ﻩ ﻩdq=0; dq=date&0x01; ﻩdate>>=1; delayus(4);ﻩ//4us dq=1;ﻩ}ﻩdelayus(4);}ucharread_ds18b20_date(){ ucharvalue,i;ﻩfor(i=0;i<8;i++)//读8位ﻩ{ﻩ dq=0; ﻩvalue>〉=1; ﻩdq=1; ﻩ if(dq)ﻩﻩvalue|=0x80; delayus(6); } returnvalue;}uintread_temp(){ﻩﻩuintg,d,m;ﻩuintc;ﻩm=1;ﻩm=clean_ds18b20();//初始化完成m=0ﻩ while(m);//等待初始化完成ﻩwrite_ds18b20_date(0xcc);//跳过rom write_ds18b20_date(0x44);//启动温度测量 delayus(100);ﻩm=clean_ds18b20(); while(m);//等待转化完成 write_ds18b20_date(0xcc);//跳过romﻩwrite_ds18b20_date(0xbe);//读数据命令ﻩd=read_ds18b20_date();//读低8位数据 g=read_ds18b20_date();//读高3位数据 g<<=4;ﻩg=g+(d〉>4); ﻩ ﻩ //整数部分 g=g*100;ﻩd=(d&0x0f)*0.0625*100; c=g+d; returnc;ﻩﻩﻩﻩ }voidinit(){ﻩ count=0;ﻩTMOD=0x21; TH1=0xfd; TL1=0xfd;ﻩTH0=(65536—50000)/256; TL0=(65536—5

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论