
(2011-01-15 19:53:40)
转载
标签:
ds18b20
| 多点测量 | 分类: DS18B20 |
#include #include unsigned int shu[]={0x30,0x31,0x32,0x33,0x34,0X35,0x36,0x37,0x38,0x39}; unsigned long t; void flcd_1602() //当为负温度时,液晶显示可以高位为0屏蔽. { init(0x80);write_data(0x4e);//NO init(0x81);write_data(0x4f); init(0x82);write_data(0x80); init(0x85);write_data(0x74);//temperature init(0x86);write_data(0x65); init(0x87);write_data(0x6d); init(0x88);write_data(0x70); init(0x);write_data(0x65); init(0x8a);write_data(0x72); init(0x8b);write_data(0x61); init(0x8c);write_data(0x74); init(0x8d);write_data(0x75); init(0x8e);write_data(0x72); init(0x8f);write_data(0x65); init(0xc0);write_data(0x80); init(0xc1);write_data(0x80); init(0xc2);write_data(0x69); //is: init(0xc3);write_data(0x73); init(0xc4);write_data(0x3a); if((t/1000)!=0) {init(0xc5);write_data(0x2d); init(0xc6);write_data(shu[t/1000]); init(0xc7);write_data(shu[t/100]); } else {init(0xc5);write_data(0xfe); init(0xc6);write_data(0x2d); init(0xc7);write_data(shu[t/100]); } init(0xc8);write_data(0x2e); init(0xc9);write_data(shu[(t0)/10]); init(0xca);write_data(shu[t]); init(0xcb);write_data(0x27); init(0xcc);write_data(0x43); init(0xcd);write_data(0x80); init(0xce);write_data(0x80); init(0xcf);write_data(0x80); } void lcd_1602() //当为正温度时,液晶显示可以高位为0屏蔽. { init(0x80);write_data(0x4e);//NO init(0x81);write_data(0x4f); init(0x82);write_data(0x80); init(0x84);write_data(0x80); init(0x85);write_data(0x74); //temperature init(0x86);write_data(0x65); init(0x87);write_data(0x6d); init(0x88);write_data(0x70); init(0x);write_data(0x65); init(0x8a);write_data(0x72); init(0x8b);write_data(0x61); init(0x8c);write_data(0x74); init(0x8d);write_data(0x75); init(0x8e);write_data(0x72); init(0x8f);write_data(0x65); init(0xc0);write_data(0x80); init(0xc1);write_data(0x80); init(0xc2);write_data(0x69); //is: init(0xc3);write_data(0x73); init(0xc4);write_data(0x3a); if(t/10000!=0) {init(0xc5);write_data(shu[t/10000]); init(0xc6);write_data(shu[t/1000]); init(0xc7);write_data(shu[t/100]); } else {if((t/1000)!=0) {init(0xc5);write_data(0xfe); init(0xc6);write_data(shu[t/1000]); init(0xc7);write_data(shu[t/100]); } else {init(0xc5);write_data(0xfe); init(0xc6);write_data(0xfe); init(0xc7);write_data(shu[t/100]);} } init(0xc8);write_data(0x2e); init(0xc9);write_data(shu[(t0)/10]); init(0xca);write_data(shu[t]); init(0xcb);write_data(0x27); init(0xcc);write_data(0x43); init(0xcd);write_data(0x80); init(0xce);write_data(0x80); init(0xcf);write_data(0x80); } void jiance() //初始化,即检测是否存在DS18B20. {unsigned char k=0; loop:DS=1; DS=0; //主机将总线从高电平拉到低电平 del(100); //持续400us~960us DS=1; //然后释放总线 del(10); //DS18B20检测到总线上升沿后,等待15us~60u后发低电平。 k=DS; del(20); //低电平至少要持续60~240us if(k==1) // 60~240us内若为高电平则要重新检测。 goto loop; } read() //从DS18B20中读出数据 { unsigned char i; unsigned long date=0; for(i=0;i<16;i++) { DS=0; //主机在某一时刻将总线从高电平拉到低电平. date>>=1; DS=1; del(3); //保持15us将总线拉到高电平,产生读时间隙 if(DS) date|=0x8000; del(8); //读数据需要持续35us~60us. } return(date); } void main() { unsigned long flag=0; EA=0; SP=0X60; init(0x01); //对液晶屏初始化 init(0x38); init(0x0c); init(0x06); while(1) { jiance(); //对DS18B20初始化 matchrom(); write(0x44); //启动温度变换 del(100); jiance(); matchrom(); if(f==1) {f=0;} else { write(0xbe); // 读暂存存储器 t=read(); flag=t&0x8000; //对读取的数据进行处理 if(flag==0x8000) {t=~t; t=t+1; t=t*25; t>>=2; flcd_1602(); } else { t=t*25; t>>=2; lcd_1602(); } } } } 头文件:#include #ifndef __XUANZE_H__ #define __XUANZE_H__ unsigned char k,f=0; sbit RS=P2^0; sbit RW=P2^1; sbit E=P2^2; sbit DS=P1^1; void del( int count ) //延时程序 {while(count--) ; } void delay(unsigned int count)//延时程序 {int p; while(count--) for(p=0;p<125;p++); } void write(unsigned char date)//向DS18B20中写入数据 { int i; for(i=0;i<8;i++) //由于是单总线每次只能写一位,一个字节需循环8次 {DS=0; //主机在某一时刻将总线从高电平拉到低电平,产生写时间隙 DS=date&0x01; // 写入数据。 del(15); //写如数据要15us,ds18b20对数据采样需要15us~60us,共需35us~70us. DS=1; date>>=1; } } void init(unsigned int n)// RW=0,RS=0;向指令寄存器中写入命令,即对1602初始化。 { delay(10); E=0; RS=0; RW=0; E=1; P0=n; E=0; } void write_data(unsigned char n)//RS=1,RW=0;向数据寄存器中写入数据,即显示的数符。 {delay(10); E=0; RS=1; RW=0; E=1; P0=n; E=0; } void matchrom() //匹配ROM { k=P3; switch(k) { case 0: { f=1; init(0x80);write_data(0x57);//which init(0x81);write_data(0x68); init(0x82);write_data(0x69); init(0x83);write_data(0x63); init(0x84);write_data(0x68); init(0x85);write_data(0x80); init(0x86);write_data(0x4e);//NO init(0x87);write_data(0x4f); init(0x88);write_data(0x79);//you init(0x);write_data(0x6f); init(0x8a);write_data(0x75); init(0x8b);write_data(0x80); init(0x8c);write_data(0x57);//want init(0x8d);write_data(0x61); init(0x8e);write_data(0x6e); init(0x8f);write_data(0x74); init(0xc0);write_data(0x70); //press init(0xc1);write_data(0x72); init(0xc2);write_data(0x65); init(0xc3);write_data(0x73); init(0xc4);write_data(0x73); init(0xc5);write_data(0x80); init(0xc6);write_data(0x57);//which init(0xc7);write_data(0x68); init(0xc8);write_data(0x69); init(0xc9);write_data(0x63); init(0xca);write_data(0x68); init(0xcb);write_data(0x80); init(0xcc);write_data(0x6b);//key init(0xcd);write_data(0x65); init(0xce);write_data(0x79); init(0xcf);write_data(0x80); }break; case 1: { init(0x83);write_data(0x31); //NO 1 write(0x55); write(0x28); write(0x30); write(0xc5); write(0xb8); write(0x00); write(0x00); write(0x00); write(0x8e); }break; case 2: { init(0x83);write_data(0x32);//NO 2 write(0x55); write(0x28); write(0x31); write(0xc5); write(0xb8); write(0x00); write(0x00); write(0x00); write(0xb9); }break; case 4: { init(0x83);write_data(0x33); //NO 3 write(0x55); write(0x28); write(0x32); write(0xc5); write(0xb8); write(0x00); write(0x00); write(0x00); write(0xe0); }break; case 8: { init(0x83);write_data(0x34); //NO 4 write(0x55); write(0x28); write(0x33); write(0xc5); write(0xb8); write(0x00); write(0x00); write(0x00); write(0xd7); } break; case 16: { init(0x83);write_data(0x35); //NO 5 write(0x55); write(0x28); write(0x34); write(0xc5); write(0xb8); write(0x00); write(0x00); write(0x00); write(0x52); } break; case 32: { init(0x83);write_data(0x36); // NO 6 write(0x55); write(0x28); write(0x35); write(0xc5); write(0xb8); write(0x00); write(0x00); write(0x00); write(0x65); }break; case : { init(0x83);write_data(0x37); //NO 7 write(0x55); write(0x28); write(0x36); write(0xc5); write(0xb8); write(0x00); write(0x00); write(0x00); write(0x3c); } break; case 128: { init(0x83); write_data(0x38);//NO 8 write(0x55); write(0x28); write(0x37); write(0xc5); write(0xb8); write(0x00); write(0x00); write(0x00); write(0x0b); } break; default:{ f=1; init(0x80);write_data(0x50); //please init(0x81);write_data(0x6c); init(0x82);write_data(0x65); init(0x83);write_data(0x61); init(0x84);write_data(0x73); init(0x85);write_data(0x65); init(0x86);write_data(0x80); init(0x87);write_data(0x70); //press init(0x88);write_data(0x72); init(0x);write_data(0x65); init(0x8a);write_data(0x73); init(0x8b);write_data(0x73); init(0x8c);write_data(0x80); init(0x8d);write_data(0x6f); //one init(0x8e);write_data(0x6e); init(0x8f);write_data(0x65); init(0xc0);write_data(0x80); init(0xc1);write_data(0x80); init(0xc2);write_data(0x80); init(0xc3);write_data(0x6b);//key init(0xc4);write_data(0x65); init(0xc5);write_data(0x79); init(0xc6);write_data(0x80); init(0xc7);write_data(0x6f);//only init(0xc8);write_data(0x6e); init(0xc9);write_data(0x6c); init(0xca);write_data(0x79); init(0xcb);write_data(0x80); init(0xcc);write_data(0x21);//! init(0xcd);write_data(0x80); init(0xce);write_data(0x80); init(0xcf);write_data(0x80); }break; } } #endif DS18B20单总线多点式测温系统--2 (2011-01-16 00:33:09) 转载 标签: ds18b20 程序改进版 缺点是:闪动的不准确,由于时间待早上改善 三个函数,一主函数 二个头函数 主函数:#include void delay(unsigned int count)//延时程序 {int p; while(count--) for(p=0;p<125;p++); } #include"LCD_Init.h" #include"xuanze.h" unsigned int shu[]={0x30,0x31,0x32,0x33,0x34,0X35,0x36,0x37,0x38,0x39}; unsigned long t; void flcd_1602() //当为负温度时,液晶显示可以高位为0屏蔽. { LCD_dis_string(1,1,"NO "); //显示字符串 LCD_dis_string(5,1,"temperature"); //显示字符串temperature LCD_dis_string(1,2," is:"); //显示字符串is: if((t/1000)!=0) { LCD_write_command(0xc5);LCD_write_data(0x2d); LCD_write_command(0xc6);LCD_write_data(shu[t/1000]); LCD_write_command(0xc7);LCD_write_data(shu[t/100]); } else {LCD_write_command(0xc5);LCD_write_data(0xfe); LCD_write_command(0xc6);LCD_write_data(0x2d); LCD_write_command(0xc7);LCD_write_data(shu[t/100]); } LCD_write_command(0xc8);LCD_write_data(0x2e); LCD_write_command(0xc9);LCD_write_data(shu[(t0)/10]); LCD_write_command(0xca);LCD_write_data(shu[t]); LCD_write_command(0xcb);LCD_write_data(0x27); LCD_write_command(0xcc);LCD_write_data(0x43); LCD_write_command(0xcd);LCD_write_data(0x80); LCD_write_command(0xce);LCD_write_data(0x80); LCD_write_command(0xcf);LCD_write_data(0x80); } void lcd_1602() //当为正温度时,液晶显示可以高位为0屏蔽. { LCD_dis_string(1,1,"NO "); //显示字符串 LCD_dis_string(5,1,"temperature"); //显示字符串temperature LCD_dis_string(5,2," is:"); //显示字符串is: if(t/10000!=0) { LCD_write_command(0xc5);LCD_write_data(shu[t/10000]); LCD_write_command(0xc6);LCD_write_data(shu[t/1000]); LCD_write_command(0xc7);LCD_write_data(shu[t/100]); } else { if((t/1000)!=0) { LCD_write_command(0xc5);LCD_write_data(0xfe); LCD_write_command(0xc6);LCD_write_data(shu[t/1000]); LCD_write_command(0xc7);LCD_write_data(shu[t/100]); } else { LCD_write_command(0xc5);LCD_write_data(0xfe); LCD_write_command(0xc6);LCD_write_data(0xfe); LCD_write_command(0xc7);LCD_write_data(shu[t/100]);} } LCD_write_command(0xc8);LCD_write_data(0x2e); LCD_write_command(0xc9);LCD_write_data(shu[(t0)/10]); LCD_write_command(0xca);LCD_write_data(shu[t]); LCD_write_command(0xcb);LCD_write_data(0x27); LCD_write_command(0xcc);LCD_write_data(0x43); LCD_write_command(0xcd);LCD_write_data(0x80); LCD_write_command(0xce);LCD_write_data(0x80); LCD_write_command(0xcf);LCD_write_data(0x80); } void Init_ds18b20() //初始化,即检测是否存在DS18B20. { unsigned char k=0; loop:DS=1; DS=0; //主机将总线从高电平拉到低电平 del(100); //持续400us~960us DS=1; //然后释放总线 del(10); //DS18B20检测到总线上升沿后,等待15us~60u后发低电平。 k=DS; del(20); //低电平至少要持续60~240us if(k==1) // 60~240us内若为高电平则要重新检测。 goto loop; } read() //从DS18B20中读出数据 { unsigned char i; unsigned long date=0; for(i=0;i<16;i++) { DS=0; //主机在某一时刻将总线从高电平拉到低电平. date>>=1; DS=1; del(3); //保持15us将总线拉到高电平,产生读时间隙 if(DS) date|=0x8000; del(8); //读数据需要持续35us~60us. } return(date); } void main() { unsigned long flag=0; EA=0; SP=0X60; LCD_init(); while(1) { Init_ds18b20(); //对DS18B20初始化 matchrom(); write(0x44); //启动温度变换 del(100); Init_ds18b20(); matchrom(); if(f==1){f=0;} else { write(0xbe); // 读暂存存储器 t=read(); flag=t&0x8000; //对读取的数据进行处理 if(flag==0x8000) { t=~t; t=t+1; t=t*25; t>>=2; flcd_1602(); } else { t=t*25; t>>=2; lcd_1602(); } } } } 头函数1: #include"xuanze.h" #ifndef __XUANZE_H__ #define __XUANZE_H__ unsigned char k,f=0; sbit DS=P1^1; void del( int count ) //延时程序 {while(count--) ; } void write(unsigned char date)//向DS18B20中写入数据 { int i; for(i=0;i<8;i++) //由于是单总线每次只能写一位,一个字节需循环8次 {DS=0; //主机在某一时刻将总线从高电平拉到低电平,产生写时间隙 DS=date&0x01; // 写入数据。 del(15); //写如数据要15us,ds18b20对数据采样需要15us~60us,共需35us~70us. DS=1; date>>=1; } } void matchrom() //匹配ROM { k=P3; switch(k) { case 0: //没有键按下,显示下面一串字符串 { f=1; LCD_dis_string(1,1,"which NOYOU WANT"); //显示字符串 LCD_dis_string(1,2,"press which key"); //显示字符串 }break; case 1: { LCD_write_command(0x83);LCD_write_data(0x31); //NO 1 write(0x55); write(0x28); write(0x30); write(0xc5); write(0xb8); write(0x00); write(0x00); write(0x00); write(0x8e); }break; case 2: {LCD_write_command(0x83);LCD_write_data(0x32);//NO 2 write(0x55); write(0x28); write(0x31); write(0xc5); write(0xb8); write(0x00); write(0x00); write(0x00); write(0xb9); }break; case 4: { LCD_write_command(0x83);LCD_write_data(0x33); //NO 3 write(0x55); write(0x28); write(0x32); write(0xc5); write(0xb8); write(0x00); write(0x00); write(0x00); write(0xe0); }break; case 8: { LCD_write_command(0x83);LCD_write_data(0x34); //NO 4 write(0x55); write(0x28); write(0x33); write(0xc5); write(0xb8); write(0x00); write(0x00); write(0x00); write(0xd7); } break; case 16: { LCD_write_command(0x83);LCD_write_data(0x35); //NO 5 write(0x55); write(0x28); write(0x34); write(0xc5); write(0xb8); write(0x00); write(0x00); write(0x00); write(0x52); } break; case 32: { LCD_write_command(0x83);LCD_write_data(0x36); // NO 6 write(0x55); write(0x28); write(0x35); write(0xc5); write(0xb8); write(0x00); write(0x00); write(0x00); write(0x65); }break; case : { LCD_write_command(0x83);LCD_write_data(0x37); //NO 7 write(0x55); write(0x28); write(0x36); write(0xc5); write(0xb8); write(0x00); write(0x00); write(0x00); write(0x3c); } break; case 128: { LCD_write_command(0x83); LCD_write_data(0x38);//NO 8 write(0x55); write(0x28); write(0x37); write(0xc5); write(0xb8); write(0x00); write(0x00); write(0x00); write(0x0b); } break; default: { f=1; LCD_dis_string(1,1,"please press one"); //显示字符串 LCD_dis_string(5,2," key only ! "); //显示字符串 } } } #endif 头函数2: #include"LCD_Init.h" #ifndef __LCD_H__ #define __LCD_H__ #define LCDIO P0 sbit RS=P2^0; sbit RW=P2^1; sbit E=P2^2; void LCD_write_command(unsigned int n)// RW=0,RS=0;向指令寄存器中写入命令. { delay(10); E=0; RS=0; RW=0; E=1; LCDIO=n; E=0; } LCD_init() { LCD_write_command(0x01); //对液晶屏初始化 LCD_write_command(0x38); LCD_write_command(0x0c); LCD_write_command(0x06); } void LCD_write_data(unsigned char n)//RS=1,RW=0;向数据寄存器中写入数据,即显示的数符。 { delay(10); E=0; RS=1; RW=0; E=1; P0=n; E=0; } void LCD_dis_string(unsigned char X,unsigned char Y,unsigned char *s) //显示字符串 { unsigned char address; if(Y==1)address=0x80+X; else address=0xc0+X; LCD_write_command(address); while(*s) { LCD_write_data(*s); s++; } } #endif
说明:较之第一个程序有很大的改善杂谈 分类: DS18B20
