DS18B20温度测量 - 图文(5)

2019-04-16 17:15

武汉理工大学《专业课程设计》说明书

附录1:源程序

/* file: 冷库温度测量与控制系统*/ #include #include

#define uint unsigned int #define uchar unsigned char void delayus(uint i); void delayms(uchar x);

void write_com(uchar comr ); void write_dat(uchar dat); void set_pos(uchar x,uchar y); void init_lcd(); void init_1(); void init_2(); void init_ds18(); uchar read_bit(void); void read_byte();

void write_byte(uchar dat);

void tempchange(void); void read_temp(void); void display(uint t); void welcom(); void temp_set(); void temp_control();

#define DB P0 // 液晶数据端口 #define DQ P1 // ds18b20数据采集端口

sbit relay=P2^0; //继电器控制端口

sbit light=P3^2; //利用发光二极管模拟显示加热装置端口

sbit RS=P2^7; //液晶的数据/地址选择端口

sbit RW=P2^6; //液晶读写端口 sbit EN=P2^5; //液晶使能端口 sbit s1=P3^7; //温度上限设置 sbit s4=P3^6; //TH温度+ sbit s5=P3^5; //TH温度— sbit s2=P3^4; //退出设置 sbit s3=P3^3; //温度下限设置 uint m,y; uchar j,i,z=0;

uchar x1[4],x2[4],n[8],zf[4],flag,g; //系统默

认的最适宜的环境工作为温度

uint k[]={0,0,0,0}; //全局变量,便于函数之间的调用,存储四个端口的温度数据,按字节存储

uint t[]={0,0,0,0,0,0,0,0}; //中间变量,存储四个端口的数据 int q[4]; float f[4];

char TH=30,TL=5;

/************液晶开始界面的静态显示界面***********************/

uchar code zeros[]={\冷库工作温度设置\

uchar code ones[]={\最高温度: 度\

uchar code twos[]={\最低温度: 度\

uchar code zero[]={\A B \

uchar code one[]={\ D \

uchar code two[]={\冷库实温 \

uchar code heat[]={\ 开启加热设备 %uchar code cool[]={\ 开启制冷设备 %uchar code well[]={\ 冷库温度良好 \void main() { init_lcd(); delayms(3); welcom(); for(i=0;i<120;i++) delayms(90); init_lcd(); delayms(3); init_1(); while(1) { tempchange(); for(i=30;i>0;i--) delayms(100); read_temp(); //运行该函数后,就得到了温度的实际值了

- 21 -

武汉理工大学《专业课程设计》说明书

for(i=0;i<4;i++) { switch(i) { case 0: write_com(0x81); z=zf[0];display(t[0]); break; case 1: write_com(0x85); z=zf[1];display(t[1]); break; case 2: write_com(0x91); z=zf[2];display(t[2]); break; case 3: write_com(0x95); z=zf[3];display(t[3]); } } m=q[0]+q[1]+q[2]+q[3]; m=m/4; if(m>0) { y=m; write_com(0x8D); display(y);} else {y=abs(m); z=1; write_com(0x8D); display(y); } temp_set(); temp_control(); } }

/**********延时10*i us************/ void delayus(uint i) { while(i--); }

/**********延时1ms************/

void delayms(uchar x) { uchar m,n; for(m=x;m>0;m--) for(n=110;n>0;n--); }

/*对液晶操作的命令写入*/ void write_com(uchar com) { RS=0; RW=0; EN=0; DB=com; delayms(5); EN=1;delayms(5);EN=0; }

/*写显示数据函数*/ void write_dat(uchar dat) { RS=1; RW=0; EN=0; DB=dat; delayms(5); EN=1;delayms(5);EN=0; }

/*设定显示位置*/

void set_pos(uchar x,uchar y) { uchar pos; if(x==0) x=0x80; //第1排,显示8个汉字 else if(x==1) x=0x90; //第2排,显示8个汉字 else if(x==2) x=0x88; //第3排,显示8个汉字 else if(x==3) x=0x98; //第4排,显示8个汉字 pos=x+y; write_com(pos); }

/*lcd初始化设定*/ void init_lcd() { write_com(0x30); delayms(5); // 功能设定为8位输出数据 write_com(0x0C); delayms(5); //显示开,关闭光标 write_com(0x01); delayms(5); //清除显示内容 }

/*********液晶启动的欢迎界面*************/ void init_1()

- 22 -

武汉理工大学《专业课程设计》说明书

{

uchar i;

set_pos(0,0); for(i=0;i<16;i++) write_dat(zero[i]); set_pos(1,0); for(i=0;i<16;i++) write_dat(one[i]); set_pos(2,0); for(i=0;i<16;i++) write_dat(two[i]); }

/*********主界面的静态显示界面*************/ void init_2() { uchar i; set_pos(0,0); for(i=0;i<16;i++) write_dat(zeros[i]); set_pos(1,0); for(i=0;i<14;i++) write_dat(ones[i]); set_pos(2,0); for(i=0;i<14;i++) write_dat(twos[i]); write_com(0x95);

write_dat(TH/10+'0');write_dat(TH+'0'); write_com(0x8D); write_dat(TL/10+'0'); write_dat(TL+'0'); }

/*****************操作DS18B20**********************/ /*初始化ds1820温度传感器*/ void init_ds18() {

DQ =0x00; //单片机将DQ拉低

delayus(100); //精确延时 大于 480us

DQ=0xff; //拉高总线 delayus(60); }

/****读一位(DS18B20驱动)********/ uchar read_bit(void) {

uchar i=0,j; uchar dat=0; DQ=0x00; j++;j++;j++;//仅仅用于延时 DQ =0XFF; // 给脉冲信号 i++;i++;i++; //仅仅用于延时

dat=DQ; //每个端口读取一位(bit)信号,一次读取四个端口的数据 delayus(5); return(dat); }

/******读取ds18b20的一个字节数据**********/

void read_byte() { uchar i,j,x; uchar h[]={0x01,0x02,0x04,0x08}; //h[]数组就是用于选择4个ds18b20器件 for(i=0;i<8;i++) //第一层循环完成一个字节的存储 { j=read_bit(); for(x=0;x<4;x++) //第二层循环是将4个ds18b20读取的一个字节的数据分别存储与k【】数组中 { switch(h[x]) { // 器件选择 case 0x01: k[x]=((j&h[x])<<7)|(k[x]>>1);break; case 0x02: k[x]=((j&h[x])<<6)|(k[x]>>1);break; case 0x04: k[x]=((j&h[x])<<5)|(k[x]>>1);break; case 0x08: k[x]=((j&h[x])<<4)|(k[x]>>1);break; } } } }

void write_byte(uchar dat)//写一个字节(DS18B20驱动) {

uchar i=0,t; DQ=0x00; delayus(5);

for (i=8; i>0; i--) {

DQ = 0;

- 23 -

武汉理工大学《专业课程设计》说明书

t=dat&0x01; if(t) DQ=0xFF; else DQ=0x00; delayus(3); DQ=0XFF; dat>>=1; } }

void tempchange(void) { init_ds18(); delayms(1); write_byte(0xCC);// 跳过读序号列号的操作 write_byte(0x44);// 启动温度转换 }

//温度转换,

void read_temp(void)//读取温度(DS18B20驱动) { uchar i; init_ds18();

write_byte(0xCC); //跳过读序号列号的操作

write_byte(0xBE); //读取温度寄存器 read_byte(); //得到8个字节的数组k【8】 for(i=0;i<4;i++) //低八位 t[i]=k[i]; for(i=0;i<4;i++) k[i]&=0x0000; read_byte(); //程序运行之后,k【】就得到新的赋值 for(i=0;i<4;i++) {t[i]=(k[i]<<8)|t[i]; if(t[i]>0x0800) {t[i]=~(t[i]); t[i]=t[i]+1; zf[i]=1;} else zf[i]=0; }

for(i=0;i<4;i++) { f[i]=t[i]*0.0625; t[i]=f[i]*10+0.5; if(zf[i]==1) q[i]=0-t[i]; else q[i]=t[i]; } }

void display(uint t) { write_dat(':'); if(z==1)

{write_dat('-'); z=0;} write_dat(t/1000+'0'); write_dat(t00/100+'0'); write_dat(t0/10+'0'); write_dat('.'); write_dat(t+'0'); }

void welcom() { uchar i; uchar code a0[]={\冷库温度控制系统\ uchar code a3[]={\毛秋阳制作\ write_com(0x90); for(i=0;i<16;i++) write_dat(a0[i]); write_com(0x88); for(i=0;i<10;i++) write_dat(a3[i]); }

void temp_set() {

//***********系统工作范围温度设置**************/ //温度设置部分 if(s1==0) delayms(3); if(s1==0) { j=1; //s1为设置键,按下s1键后,进入下一液晶界面,进行调温测试 init_lcd(); //液晶初始化,将界面清空,以显示设置界面

- 24 -

武汉理工大学《专业课程设计》说明书

delayms(50); init_2(); //温度上限设置界面

delayms(3); while(j) { if(s4==0) delayms(3); if(s4==0) { TH+=1; write_com(0x95);write_dat(TH/10+'0'); write_dat(TH+'0'); while(!s4); } if(s5==0) delayms(3); if(s5==0) { TH-=1;

write_com(0x95);write_dat(TH/10+'0'); write_dat(TH+'0'); while(!s5); } if(s2==0) delayms(3); if(s2==0) { j=0; init_1(); while(!s2); } //s2为退出键,按下s2后,调温结束,返回主界面,继续显示检测的温度 } while(!s1); } if(s3==0) delayms(3); if(s3==0) { j=1; //s3为温度下限设置键,按下s3键后,进入下一液晶界面,进行调温测试 init_lcd(); //液晶初始化,将界面清空,以显示设置界面

delayms(50); init_2(); //温度上限设置界面

delayms(3); while(j) { if(s4==0) delayms(3); if(s4==0) { TL+=1; if(TL>=0) {write_com(0x8D);write_dat(TL/10+'0'); write_dat(TL+'0'); write_dat(' ');} else

{g=abs(TL);write_com(0x8D);write_dat('-');write_dat(g/10+'0'); write_dat(g+'0');} while(!s4); } if(s5==0) delayms(3); if(s5==0) { TL-=1; if(TL>=0) {write_com(0x8D);write_dat(TL/10+'0'); write_dat(TL+'0'); write_dat(' ');} else

{g=abs(TL);write_com(0x8D);write_dat('-');write_dat(g/10+'0'); write_dat(g+'0');} while(!s5); } if(s2==0) delayms(3); if(s2==0) { j=0; init_1(); while(!s2); } //s2为退出键,按下s2后,调温结束,返回主界面,继续显示检测的温度 }

- 25 -

武汉理工大学《专业课程设计》说明书

while(!s3); } } void temp_control() {

/*************超过高温,低于低温报警,以及相关的动作********************************/ //温度低于设置的最低值,开启加热设备,制冷设备属于关闭状态 if(m<=TL*10) { relay=1; light=0; set_pos(3,0); for(i=0;i<18;i++) write_dat(heat[i]); }

//温度高于设置的最大值,开启制冷设备,加热设备处于关闭状态

else if(m>=TH*10) { relay=0; light=1; set_pos(3,0); for(i=0;i<18;i++) write_dat(cool[i]); }

//温度处于设置值的正常范围内时,加热设备与制冷设备均处于关闭状态。 else { relay=1; light=1; set_pos(3,0); for(i=0;i<16;i++) write_dat(well[i]); } }

- 26 -


DS18B20温度测量 - 图文(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:(广东专用)2014高考数学第一轮复习用书 第43课 等比数列 文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: