基于DS18B20的52单片机的温度计设计_第1页
基于DS18B20的52单片机的温度计设计_第2页
基于DS18B20的52单片机的温度计设计_第3页
基于DS18B20的52单片机的温度计设计_第4页
基于DS18B20的52单片机的温度计设计_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

基于单片机的DS18B20温度计设计//Main.c主程序#include<reg52.h>#include<18b20.h>#defineDataPortP0//概念数据端口程序中碰到DataPort则用P0替换sbitLATCH1=P1^0;//概念锁存使能端口段锁存sbitLATCH2=P1^1;//位锁存bitReadTempFlag;//概念读时间标志unsignedcharcodeDuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码值0~9共阴数码管dp-aunsignedcharcodeWeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//别离对应相应的数码管点亮,即位码unsignedcharTempData[4];//存储显示值的全局变量voidDisplay(unsignedcharFirstBit,unsignedcharNum);//数码管显示函数voidInit_Timer0(void);//按时器初始化voidmain(void){unsignedintTempH,TempL,temp;Init_Timer0(); //按时器初始化while(1)//主循环{if(ReadTempFlag==1){ReadTempFlag=0;temp=ReadTemperature(); //读取温度函数if(temp&0x8000) {TempData[0]=0x40;//负号标志temp=~temp;//取反加1 temp+=1; TempH=temp>>4;TempL=temp&0x0F;TempL=TempL*6.25/10;//小数近似处置 if(TempH/10==0)TempData[1]=0;//十位温度 else TempData[1]=DuanMa[TempH/10];TempData[2]=DuanMa[TempH%10]|0x80;//个位温度,带小数点TempData[3]=DuanMa[TempL]; }else{ TempH=temp>>4;TempL=temp&0x0F;TempL=TempL*6.25/10;//小数近似处置 if(TempH/100==0) TempData[0]=0; elseTempData[0]=DuanMa[TempH/100];//百位温度if((TempH/100==0)&&((TempH%100)/10==0))//消隐 TempData[1]=0; elseTempData[1]=DuanMa[(TempH%100)/10];//十位温度TempData[2]=DuanMa[(TempH%100)%10]|0x80;//个位温度,带小数点TempData[3]=DuanMa[TempL]; }} }}voidDisplay(unsignedcharFirstBit,unsignedcharNum){staticunsignedchari=0; DataPort=0;//清空数据LATCH1=1;//段锁存LATCH1=0;DataPort=WeiMa[i+FirstBit];//取位码LATCH2=1;//位锁存LATCH2=0;DataPort=TempData[i];//取显示数据,段码LATCH1=1;//段锁存LATCH1=0; i++;if(i==Num) i=0;}voidInit_Timer0(void) //按时器初始化{TMOD|=0x01; //利用模式1,16位按时器 EA=1;//总中断打开ET0=1;//按时器中断打开TR0=1;//按时器开关打开}voidTimer0_isr(void)interrupt1 //按时器中断程序{staticunsignedintnum;TH0=(65536-2000)/256; //从头赋值2msTL0=(65536-2000)%256;Display(0,4);//挪用数码管扫描num++;if(num==300)//{num=0;ReadTempFlag=1;//读标志位置1 }}//reg52.h#ifndef__REG52_H__#define__REG52_H__sfrP0=0x80;sfrP1=0x90;sfrP2=0xA0;sfrP3=0xB0;sfrPSW=0xD0;sfrACC=0xE0;sfrB=0xF0;sfrSP=0x81;sfrDPL=0x82;sfrDPH=0x83;sfrPCON=0x87;sfrTCON=0x88;sfrTMOD=0x89;sfrTL0=0x8A;sfrTL1=0x8B;sfrTH0=0x8C;sfrTH1=0x8D;sfrIE=0xA8;sfrIP=0xB8;sfrSCON=0x98;sfrSBUF=0x99;/*8052Extensions*/sfrT2CON=0xC8;sfrRCAP2L=0xCA;sfrRCAP2H=0xCB;sfrTL2=0xCC;sfrTH2=0xCD;/*BITRegisters*//*PSW*/sbitCY=PSW^7;sbitAC=PSW^6;sbitF0=PSW^5;sbitRS1=PSW^4;sbitRS0=PSW^3;sbitOV=PSW^2;sbitP=PSW^0;//8052sbitTF1=TCON^7;sbitTR1=TCON^6;sbitTF0=TCON^5;sbitTR0=TCON^4;sbitIE1=TCON^3;sbitIT1=TCON^2;sbitIE0=TCON^1;sbitIT0=TCON^0;sbitEA=IE^7;sbitET2=IE^5;//8052sbitES=IE^4;sbitET1=IE^3;sbitEX1=IE^2;sbitET0=IE^1;sbitEX0=IE^0;/*IP*/sbitPT2=IP^5;sbitPS=IP^4;sbitPT1=IP^3;sbitPX1=IP^2;sbitPT0=IP^1;sbitPX0=IP^0;sbitRD=P3^7;sbitWR=P3^6;sbitT1=P3^5;sbitT0=P3^4;sbitINT1=P3^3;sbitINT0=P3^2;sbitTXD=P3^1;sbitRXD=P3^0;sbitSM0=SCON^7;sbitSM1=SCON^6;sbitSM2=SCON^5;sbitREN=SCON^4;sbitTB8=SCON^3;sbitRB8=SCON^2;sbitTI=SCON^1;sbitRI=SCON^0;sbitT2EX=P1^1;//8052sbitT2=P1^0;//8052sbitTF2=T2CON^7;sbitEXF2=T2CON^6;sbitRCLK=T2CON^5;sbitTCLK=T2CON^4;sbitEXEN2=T2CON^3;sbitTR2=T2CON^2;sbitC_T2=T2CON^1;sbitCP_RL2=T2CON^0;#endif//18b20.h#ifndef__DS18B20_H__#define__DS18B20_H__#include<reg52.h>#defineucharunsignedchar#defineuintunsignedint;/*端口概念*/sbitDQ=P1^3;//ds18b20端口/*函数声明*/unsignedintReadTemperature(void); bitInit_DS18B20(void); unsignedcharReadOneChar(void);voidWriteOneChar(unsignedchardat);#endif//delay.c#ifndef__DELAY_H__#define__DELAY_H__/*微秒延时函数*/voidDelayUs2x(unsignedchart);/*毫秒延时函数*/voidDelayMs(unsignedchart);#endif//18b20.c#include<delay.h>#include<18b20.h>/*18b20初始化*/bitInit_DS18B20(void){ bitdat=0; DQ=1; //DQ复位 DelayUs2x(5);//稍做延时 DQ=0;//单片机将DQ拉低 DelayUs2x(200);//精准延时大于480us小于960us DelayUs2x(200); DQ=1;//拉高总线 DelayUs2x(50);//15~60us后接收60-240us的存在脉冲 dat=DQ;//若是dat=0则初始化成功,dat=1则初始化失败 DelayUs2x(25);//稍作延时返回 returndat;}/*读取一个字节*/ unsignedcharReadOneChar(void) { unsignedchari=0; unsignedchardat=0; for(i=8;i>0;i--) { DQ=0;//给脉冲信号 dat>>=1; DQ=1;//给脉冲信号 if(DQ) dat|=0x80; DelayUs2x(25); } return(dat); }/*写一个字节*/ voidWriteOneChar(unsignedchardat) { unsignedchari=0; for(i=8;i>0;i--) { DQ=0; DQ=dat&0x01; DelayUs2x(25); DQ=1; dat>>=1; } DelayUs2x(25); }/*读取温度函数*/ unsignedintReadTemperature(void) { unsignedchara=0; unsignedintb=0; unsignedintt=0; Init_DS18B20(); //

温馨提示

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

评论

0/150

提交评论