基于单片机测量温度的电路图及相应程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

#includereg52.h//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#includemath.h#includeINTRINS.H#defineucharunsignedchar#defineuintunsignedint;/******************************************************************//*定义端口*//******************************************************************/sbitseg1=P2^0;sbitseg2=P2^1;sbitseg3=P2^2;sbitDQ=P1^3;//ds18b20端口sfrdataled=0x80;//显示数据端口/******************************************************************//*全局变量*//******************************************************************/uinttemp;ucharflag_get,count,num,minute,second;ucharcodetab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数码管段码表共阳ucharstr[6];/******************************************************************//*函数声明*//******************************************************************/voiddelay1(ucharMS);unsignedintReadTemperature(void);voidInit_DS18B20(void);unsignedcharReadOneChar(void);voidWriteOneChar(unsignedchardat);voiddelay(unsignedinti);/******************************************************************//*主函数*//******************************************************************/main(){unsignedcharTempH,TempL;TMOD|=0x01;//定时器设置TH0=0xef;TL0=0xf0;IE=0x82;TR0=1;P2=0x00;count=0;while(1){str[5]=0x39;//显示C符号str[1]=tab[TempH/100];//十位温度str[2]=tab[(TempH%100)/10];//十位温度str[3]=tab[(TempH%100)%10]|0x80;//个位温度,带小数点str[4]=tab[TempL];if(flag_get==1)//定时读取当前温度{temp=ReadTemperature();if(temp&0x8000){str[0]=0x40;//负号标志temp=~temp;//取反加1temp+=1;}elsestr[0]=0;TempH=temp4;TempL=temp&0x0F;TempL=TempL*6/10;//小数近似处理flag_get=0;}}}/******************************************************************//*定时器中断*//******************************************************************/voidtim(void)interrupt1using1//中断,用于数码管扫描和温度检测间隔{TH0=0xef;//定时器重装值TL0=0xf0;num++;if(num==50){num=0;flag_get=1;//标志位有效second++;if(second=60){second=0;minute++;}}count++;if(count==1){P2=0;dataled=str[0];}//数码管扫描if(count==2){P2=1;dataled=str[1];}if(count==3){P2=2;dataled=str[2];}if(count==4){P2=3;dataled=str[3];}if(count==5){P2=4;dataled=str[4];}if(count==6){P2=5;dataled=str[5];count=0;}}/******************************************************************//*延时函数*//******************************************************************/voiddelay(unsignedinti)//延时函数{while(i--);}/******************************************************************//*初始化*//******************************************************************/voidInit_DS18B20(void){unsignedcharx=0;DQ=1;//DQ复位delay(8);//稍做延时DQ=0;//单片机将DQ拉低delay(80);//精确延时大于480usDQ=1;//拉高总线delay(10);x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败delay(5);}/******************************************************************//*读一个字节*//******************************************************************/unsignedcharReadOneChar(void){unsignedchari=0;unsignedchardat=0;for(i=8;i0;i--){DQ=0;//给脉冲信号dat=1;DQ=1;//给脉冲信号if(DQ)dat|=0x80;delay(5);}return(dat);}/******************************************************************//*写一个字节*//******************************************************************/voidWriteOneChar(unsignedchardat){unsignedchari=0;for(i=8;i0;i--){DQ=0;DQ=dat&0x01;delay(5);DQ=1;dat=1;}delay(5);}/******************************************************************//*读取温度*//******************************************************************/unsignedintReadTemperature(void){unsignedchara=0;unsignedintb=0;unsignedintt=0;Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0x44);//启动温度转换delay(200);Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar();//低位b=ReadOneChar();//高位b=8;t=a+b;return(t);}

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功