当前位置:文档之家› 51单片机单总线控制两个DS18B20

51单片机单总线控制两个DS18B20

#in clude<reg52.h>#defi ne uchar un sig ned char#defi ne uint un sig ned int sbit DQ=P1A 0;sbit rs=P2A0; sbit rw=P2A1;sbit e=P2A2;uchar temp1,temp2;II 定义两个存放温度的变量 //uchar ID[8]; 〃存放DS18B20的64位序列号的数组uchar code ID_1[]={0x28,0x3a,0x24,0xc6,0x02,0x00,0x00,0xa4}; II 第一个 DS18B20 的序列号uchar code ID_2[]={0x28,0x66,0xa2,0xc1,0x02,0x00,0x00,0x26};II 第二个 DS18B20 的序列号 uchar code table[]="0123456789";uchar code table_temp[]="tempreture:";uchar code table_0[]="C :/****************************************************/ II50us 的延时函数 IILCD1602写指令 IILCD1602写数据 IILCD1602 初 始 IIds18b20初始化 IIwhile ( t--)延时函数 IIDS18B20初始化函数 IIds18b20写一个字节函数 IIds18b20读一个字节函数uchar readtempl(void); ucharreadtemp2(void); void display(void);I*void readrom(void) II 读取温度传感器的序列号子函数 {ini t_ds18b20();delay_50us(2);write_byte(0x33);ID[0]=read_byte();ID[1]=read_byte();ID[2]=read_byte();ID[3]=read_byte();ID[4]=read_byte();ID[5]=read_byte();ID[6]=read_byte();ID[7]=read_byte();/*****************************************************/*void keep_rom(uchar *p) // 存序列号函数{uchar i;void delay_50us( uint time);void write_com(uchar com); voidwrite_data(uchar dat);void in it_LCD1602(void); idini t_ds18b20(void);void delay( uint t);void ini t_ds18b20(void); voidwrite_byte(char dat); ucharread_byte(void);II 第一个ds18b20读取温度函数 //第二个ds18b20读取温度函数IILCD1602显示温度函数*******************************************for(i=0;i<8;i++){*P=ID[i];P++;}}/***************************************************** /*void display_rom(void) // 显示序列号函数{uchar i;write_com(0x80); for(i=0;i<8;i++){write_data(table[ID[i]/16]); write_data(table[ID[i]%16]);}}/****************************************************/ void mai n(void){in it_LCD1602();while(1){temp1=readtemp1();temp2=readtemp2();display();}}]**********************************************'void delay_50us( uint time){uchar j;for(;time>0;time--); for(j=19;j>0;j++);}/************************************************/void write_com(uchar com) //LCD1602 写指令{e=0;rs=0;rw=0;PO=com;delay_50us(10); e=1;delay_50us(20);e=0;}/***************************************************/void write_data(uchar dat) //LCD1602 写数据{e=0;rs=1;rw=0;PO=dat;delay_50us(10);e=1;delay_50us(20);e=0;}]***************************************************]void init_LCD1602(void) //LCD1602 初始化函数{delay_50us(300);write_com(0x38);delay_50us(100);write_com(0x38);delay_50us(100);write_com(0x38);write_com(0x38);//显示模式设置write_com(0x08);〃显示关闭write_com(0x01);〃显示清屏write_com(0x06);〃显示光标移动设置write_com(0x0c);〃显示开及光标设置}/*********************************************/ void delay( uint t){while(t--);}/*************************************************void init_ds18b20(void)〃初始化{uchar n;DQ=1; //默认为高电平delay(8);DQ=O;delay(80); 〃12MHz晶振下大约600微秒的延时DQ=1; 〃释放总线delay(8);n=DQ;delay(4);}/***************************************************/void write_byte(char dat)〃写一个字节{uchar i;for(i=0;i<8;i++){DQ=0;DQ=dat&0x01;〃从最低位开始写,0x01delay(4);DQ=1;〃拉高,传下一帧数据dat>>=1;}delay(4);}/****************************************************/ uchar read_byte(void)〃读一个字节{uchar i;uchar value;for(i=0;i<8;i++){DQ=0;value>>=1; 〃判断8次,移位七次(起延时作用)DQ=1;if(DQ) 〃采样,判断DQvalue|=0x80; //赋值,与0x80 与一下delay(4);}retur n value;}/*****************************************************/ uchar readtemp1(void){uchar a,b,i; ini//读一个高八位,一个低八位t_ds18b20(); 〃readrom();// keep_rom(IP_1);// display_rom();write_byte(0x55);for(i=0;i<8;i++){write_byte(ID_1[i]);}write_byte(0x44); // 启动温度测量delay(300);ini t_ds18b20();write_byte(0x55);for(i=0;i<8;i++){write_byte(ID_1[i]);}write_byte(0xbe); 〃读这个温度a=read_byte(); 〃低位b=read_byte(); // 高位b<<=4;b+=(a&0 xfO)>>4; // 屏蔽低四位return b;}/******************************************************/ uchar readtemp2(void){uchar a,b,i; //读一个高八位,一个低八位ini t_ds18b20();〃readrom();// keep_rom(IP_1);// display_rom();write_byte(0x55);for(i=0;i<8;i++){write_byte(ID_2[i]);}write_byte(0x44); // 启动温度测量delay(300);ini t_ds18b20();write_byte(0x55);for(i=0;i<8;i++){write_byte(ID_2[i]);}write_byte(0xbe); 〃读这个温度a=read_byte(); 〃低位b=read_byte(); // 高位b<<=4;b+=(a&0 xfO)>>4; // 屏蔽低四位return b;}[未*************************************************** void display(void){uchar i;write_com(0x80);for(i=0;i<11;i++){write_data(table_temp[i]);delay_50us(1);}write_com(0x80+0x40);write_data(table[temp1/10]); write_data(table[temp1%10]); write_data(table_O[O]);write_data(table_0[1]);write_com(0x80+0x47);write_data(table[temp2/10]); write_data(table[temp2%10]); write_data(table_O[O]);write_data(table_0[1]); // 显示tempreture//第一个温度值//显示温度十位//显示温度个位〃第二个温度值〃显示温度十位〃显示温度个位。

相关主题