DS18B20自动搜索ROM51C程序多点测温经验证

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

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

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

资源描述

#includereg52.h#includeintrins.h#defineucharunsignedchar//定义无符号单字节#defineuintunsignedint//定义无符号整形#defineMAXNUM2//定义最多DS18B20个数超过的无法显示sbitDQ=P1^3;//定义数据线sbitRS=P2^4;sbitRW=P2^5;sbitE=P2^6;ucharcodelcd0[]={SEARCHROMING...};ucharcodelcd1[]={SEARCHROMOK!};ucharcodelcd2[]={Thetotalis:};ucharcodelcd3[]={No.():};ucharcodelcd4[]={'0','1','2','3','4','5','6','7','8','9','.',0xdf,0x43};uchardat[6];uchartemp_l,temp_h,is_fuwen,temp_x,temp_over,t;ucharnum=0;uinti;ucharal[MAXNUM];idataucharID[MAXNUM][8];//={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}voidalarm_search(void);/***********************液晶模块**********************************/voiddelay()//延时程序{uchary;for(y=0;y250;y++);}voidLCD_write_com(ucharcom)//写{delay();RS=0;RW=0;E=0;E=1;P0=com;E=0;delay();}voidLCD_write_data(uchardat){delay();RS=1;RW=0;E=0;E=1;P0=dat;E=0;delay();}voidinit()//初始化{LCD_write_com(0x01);LCD_write_com(0x38);LCD_write_com(0x0c);LCD_write_com(0x06);}/************************ds18b20****************************/voiddelay_nus(uintn)//延时程序一次8+6(进出)=14us{while(n--);}voidreset(void)//ds18b20初始化复位操作{unsignedcharx=0;DQ=1;//DQ复位delay_nus(8);//稍做延时DQ=0;//单片机将DQ拉低delay_nus(80);//精确延时大于480usDQ=1;//拉高总线delay_nus(10);x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败delay_nus(5);}voidwrite_bit(uchardat)//DS18B20写一位操作{DQ=0;_nop_();_nop_();DQ=dat&0x01;delay_nus(5);DQ=1;}voidwrite_byte(uchardat)//写一个字节{unsignedchari,j;for(i=8;i0;i--){j=dat&0x01;write_bit(j);dat=1;}}ucharread_2bit()//读二位子程序{uchari;uchardat=0;for(i=2;i0;i--){DQ=0;//给脉冲信号dat=1;DQ=1;//给脉冲信号if(DQ)dat|=0x01;delay_nus(4);}return(dat);}ucharread_byte()//读一个字节子程序{uchari=0;uchardat=0;for(i=8;i0;i--){DQ=0;//给脉冲信号dat=1;DQ=1;//给脉冲信号if(DQ)dat|=0x80;delay_nus(4);}return(dat);}voiddelay_nms(uintn){uintj;for(j=0;jn;j++);}voidread_temp(uchari)//读取温度子程序{ucharf;reset();write_byte(0xcc);write_byte(0x44);delay_nms(50000);reset();write_byte(0x55);for(f=0;f8;f++){write_byte(ID[i][f]);//发匹配ROM}delay_nus(100);write_byte(0xbe);delay_nus(100);temp_l=read_byte();temp_h=read_byte();}voidtemp_convert()//温度转换{temp_x=(temp_l&0x0f)*0.625+0.5;is_fuwen=temp_h&0xf8;if(is_fuwen){is_fuwen=1;temp_h=~temp_h;if(temp_l==0)temp_h++;//若低8位全为0且温度为负,取补时就要向高位进1temp_l=~temp_l+1;}temp_h=4;temp_l=4;temp_over=temp_h|temp_l;delay_nus(255);}/*******************显示***************************/void_search_cartoon(void)//搜索ROM动画{init();LCD_write_com(0x80);for(i=0;i16;i++){LCD_write_data(lcd0[i]);}LCD_write_com(0xc0);for(i=0;i16;i++){LCD_write_data(0xff);delay_nms(num*2000);}}void_display_total()//显示总数{init();LCD_write_com(0x80);for(i=0;i14;i++){LCD_write_data(lcd1[i]);}LCD_write_com(0xc0);for(i=0;i13;i++){LCD_write_data(lcd2[i]);}LCD_write_data(lcd4[num]);delay_nms(50000);delay_nms(50000);}void_display_ds18b20(i)//显示编号为i的DS18B20的温度//{uintdata_b,data_temp,l;data_b=temp_over/100;//百位//data_temp=temp_over%100;dat[0]=data_temp/10;//十位//dat[1]=data_temp%10;//个位//dat[2]=10;dat[3]=temp_x;dat[4]=11;dat[5]=12;init();LCD_write_com(0x80);for(l=0;l14;l++){LCD_write_data(lcd1[l]);}LCD_write_com(0xc0);for(l=0;l7;l++){LCD_write_data(lcd3[l]);}LCD_write_com(0xc4);LCD_write_data(lcd4[++i]);LCD_write_com(0xc8);if(is_fuwen==1){LCD_write_data(0x2d);}else{LCD_write_data(lcd4[data_b]);}for(l=0;l6;l++)LCD_write_data(lcd4[dat[l]]);delay_nms(50000);delay_nms(50000);}/***********************自动搜索ROM*****************************/voidsearch_rom(void)//搜索ROM{uchark,l,chongtuwei,m,n;ucharzhan[(MAXNUM-1)];ucharss[64];l=0;do{reset();write_byte(0xf0);for(m=0;m8;m++){uchars=0;for(n=0;n8;n++){k=read_2bit();//读两位数据k=k&0x03;s=1;if(k==0x01)//01读到的数据为0写0此位为0的器件响应{write_bit(0);ss[(m*8+n)]=0;}elseif(k==0x02)//读到的数据为1写1此位为1的器件响应{s=s|0x80;write_bit(1);ss[(m*8+n)]=1;}elseif(k==0x00)//读到的数据为00有冲突位判断冲突位{//如果冲突位大于栈顶写0小于栈顶写以前数据等于栈顶写1chongtuwei=m*8+n+1;if(chongtuweizhan[l]){write_bit(0);ss[(m*8+n)]=0;zhan[++l]=chongtuwei;}elseif(chongtuweizhan[l]){s=s|((ss[(m*8+n)]&0x01)7);write_bit(ss[(m*8+n)]);}elseif(chongtuwei==zhan[l]){s=s|0x80;write_bit(1);ss[(m*8+n)]=1;l=l-1;}}else{gotoloop;}}ID[num][m]=s;}num=num+1;}while(zhan[l]!=0&&(numMAXNUM));loop:_search_cartoon();_display_total();}voidmatch_rom(uchari){ucharc;reset();write_byte(0x55);for(c=0;c8;c++)write_byte(ID[--i][c]);}voidwrite_schratchpad(charH,charL){write_byte(0x4e);write_byte(H);write_byte(L);}voidcopy_schratchpad(){write_byte(0x48);}voidrecall_EE(){write_byte(0xb8);}voidmain(void){uchari;search_rom();//搜索ROM并且存储//reset();//write_byte(0xcc);//write_schratchpad(30,15);//reset();//write_byte(0xcc);//copy_schratchpad();reset();match_rom(0);recall_EE();while(1){for(i=0;inum;i++)//编号0到num-1个ds18b20循环{read_temp(i);//读编号i(0--(num-1))ds18b20的温度temp_convert();//调用温度转换_display_ds18b20(i);//显示编号i的温度}alarm_search();}}voidalarm_search(void){uchark,l,chongtuwei,m,n,numb,a;ucharzhan[(MAXNUM-1)];ucharss[64],ID0[MAXNUM][8];l=0;P1=0xe0;do{reset();write_byte(0xec);for(m=0;m8;m++){uchars=0;for(n=0;n8;n++){k=read_2bit();//读两位数据k=k&0x03;s=1;if(k==0x01)//01读到的数据为0写0此位为0的器件响应{write_bit(0);ss[(m*8+n)]=0;}elseif(k==0x02)//读到的数据为1写1此位为1的器件响应{s=s|0x80;write_bit(1);ss[

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

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

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

×
保存成功