西华大学电气信息学院智能化电子系统设计报告 11 附录二:基于DS18B20数字温度计的设计PCB图
第 24 页
西华大学电气信息学院智能化电子系统设计报告
12 附录三:基于DS18B20数字温度计的设计的实物图
实际 实际测得温度
报警上限值
报警下限值
第 25 页
西华大学电气信息学院智能化电子系统设计报告 13 附录四:基于DS18B20数字温度计的设计C语言程序
#include
ledmap[]={0xc0,0xf9,0xa4,0xb0,0x99, flag=1; 0x92,0x82,0xf8,0x80,0x90,0xbf}; break;
code unsigned char } ledmap1[]={0x40,0x79,0x24,0x30, } 0x19,0x12,0x02,0x78,0x00,0x10}; if(flag)
void set_ds18b20(); {
//初始化DS18B20子程序 delay=240;
void get_temperature(); while(--delay);
//获得温度子程序 break; void read_ds18b20(); }
//读DS18B20子程序 } void write_ds18b20(uchar command); }
//向DS18B20写1字节子程序 //******获得温度子程序********** void delayms(uchar count); //******************************
//延时count毫秒子程序 void get_temperature() void disp_temp(tempint,tempdf); {
//显示温度子程序 set_ds18b20(); //*****初始化DS18B20子程序****** write_ds18b20(0xcc);
第 26 页
西华大学电气信息学院智能化电子系统设计报告 write_ds18b20(0x44); f=0; disp_temp(tempint,tempdf); if((temph & 0xf8)!=0x00) set_ds18b20(); //若温度为负的处理 write_ds18b20(0xcc); { write_ds18b20(0xbe); f=1;
//发出读温度命令 temph=~temph;
read_ds18b20(); templ=~templ; } templ=k; //*****读DS18B20子程序********** if(k>255) //****************************** { void read_ds18b20() temph++; { } uchar } delay,i,j,k,temp,temph,templ; tempdf=templ & 0x0f;
float wendu; c=(tempdf*625); j=4; tempdf=c; do templ>>=4; // { temph<<=4; for(i=8;i>0;i--) tempint=temph|templ; { if
temp>>=1; (tempint>th|tempint==th|tempint //延时8us //****************************** if(DQ) void write_ds18b20(uchar command) temp|=0x80; { delay=25; uchar delay,i; while(--delay); for(i=8;i>0;i--) } { if(j==4) DQ=0; templ=temp; delay=6; if(j==3) //延时12us temph=temp; while(--delay); if(j==2) DQ=command&0x01; tempth=temp; delay=25; if(j==1) //延时50us temptl=temp; while(--delay); }while(--j); command=command>>1; 第 27 页 西华大学电气信息学院智能化电子系统设计报告 DQ=1; if (f==0) } { } P0=display1; //*******显示子程序************ P2=ledmap[0]; //****************************** } void disp_temp( tempint,tempdf) else { { uchar P0=display1; tempinth,tempintl,tempinbai,shifen,b//符号位 aifen,gefen,qianfen; P2=ledmap[10]; if (bb==1) } { delayms(2); tempinbai=th/100; P0=display2; tempinth=(th0)/10; tempintl=th; P2=ledmap[tempinbai];//开百位 gefen=0/1000; delayms(2); shifen=000/100; P0=display3; baifen =00/10; P2=ledmap[tempinth];//开十位 qianfen=0; delayms(2); } P0=display4; else P2=ledmap1[tempintl];//开个位 if(bb==2) delayms(2); { P0=display5; tempinbai=tl/100; P2=ledmap[gefen];//开个分位 tempinth=(tl0)/10; delayms(2); tempintl=tl; P0=display6; gefen=0/1000; P2=ledmap[shifen]; //开十分位 shifen=000/100; delayms(2); baifen =00/10; P0=display7; qianfen=0; P2=ledmap[baifen]; //开百分位 } delayms(2); else P0=display8; { P2=ledmap[qianfen];//开千分位 tempinbai=tempint/100; } //*********沿时子程序*********** tempinth=(tempint0)/10; //****************************** tempintl=tempint; void delayms(uchar count) gefen=tempdf/1000; //延时count ms子程序 shifen=tempdf00/100; { baifen =tempdf0/10; uchar i,j; qianfen=tempdf; do } { 第 28 页