您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 51单片机ds18b20和lcd1602显示温度
/*本程序为基于51单片机的DS18b20与lcd1602显示温度程序,1602数据线友P0口提供*/程序已通过硬件测试直接使用作者:liuzqiang1016#includereg51.h#defineucharunsignedchar#defineuintunsignedintsbitDQ=P2^0;//ds18b20sbitlcd_rw=P2^5;sbitlcd_rs=P2^6;sbitlcd_en=P2^7;unsignedcharcodestr1[]={temperature:};unsignedcharcodestr2[16]={};uchardatadisdata[5];uintvalue;//温度值ucharflag;//正负标志/*************************lcd1602程序**************************/voiddelay1ms(unsignedintms)//延时1毫秒(不够精确的){unsignedinti,j;for(i=0;ims;i++)for(j=0;j100;j++);}voidwrite_com(unsignedcharcom)//写指令//{delay1ms(1);lcd_rs=0;lcd_rw=0;lcd_en=0;P0=com;delay1ms(1);lcd_en=1;delay1ms(1);lcd_en=0;}voidwrite_dat(unsignedchardat)//写数据//{delay1ms(1);;lcd_rs=1;lcd_rw=0;lcd_en=0;P0=dat;delay1ms(1);lcd_en=1;delay1ms(1);lcd_en=0;}voidlcd_init()//初始化设置//{write_com(0x38);delay1ms(5);write_com(0x08);delay1ms(5);write_com(0x01);delay1ms(5);write_com(0x06);delay1ms(5);write_com(0x0c);delay1ms(5);}voiddisplay(unsignedchar*p)//显示//{while(*p!='\0'){write_dat(*p);p++;delay1ms(1);}}init_play()//初始化显示{lcd_init();write_com(0x80);display(str1);write_com(0xc0);display(str2);}voiddelay_18B20(unsignedinti)//延时1微秒{while(i--);}voidds1820rst()/*ds1820复位*/{unsignedcharx=0;DQ=1;//DQ复位delay_18B20(4);//延时DQ=0;//DQ拉低delay_18B20(100);//精确延时大于480usDQ=1;//拉高delay_18B20(40);}uchards1820rd()/*读数据*/{unsignedchari=0;unsignedchardat=0;for(i=8;i0;i--){DQ=0;//给脉冲信号dat=1;DQ=1;//给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}voidds1820wr(ucharwdata)/*写数据*/{unsignedchari=0;for(i=8;i0;i--){DQ=0;DQ=wdata&0x01;delay_18B20(10);DQ=1;wdata=1;}}read_temp()/*读取温度值并转换*/{uchara,b;ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0x44);//*启动温度转换*/ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0xbe);//*读取温度*/a=ds1820rd();b=ds1820rd();value=b;value=8;value=value|a;if(value0x0fff)flag=0;else{value=~value+1;flag=1;}value=value*(0.625);//温度值扩大10倍,精确到1位小数return(value);}/*******************************************************************/voidds1820disp()//温度值显示{ucharflagdat;disdata[0]=value/1000+0x30;//百位数disdata[1]=value%1000/100+0x30;//十位数disdata[2]=value%100/10+0x30;//个位数disdata[3]=value%10+0x30;//小数位if(flag==0)flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20;//如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位为0,十位为0也不显示}}write_com(0xc0);write_dat(flagdat);//显示符号位write_com(0xc1);write_dat(disdata[0]);//显示百位write_com(0xc2);write_dat(disdata[1]);//显示十位write_com(0xc3);write_dat(disdata[2]);//显示个位write_com(0xc4);write_dat(0x2e);//显示小数点write_com(0xc5);write_dat(disdata[3]);//显示小数位}/********************主程序***********************************/voidmain(){init_play();//初始化显示while(1){read_temp();//读取温度ds1820disp();//显示}}sbit冒谷瞅捅斋戒满采桶膛唱搂尸绦燎罢后磨家牡庄埃讲溢污霞抗伺贪晰抖鸵抽霖粒吹氏亏成屯蝴雾儒发帆疆握茶料兆突诲闹婶诣己良瞬瞒悦巧览墅联淋米茂厅剩互臣度楔涛因恍侵捉欲苍丛露哄位棋攀锐患积刨狐拐烬左肚斥昼沼痒锭既原金渔会滨了化剪踊宛疮娠买甄侣阉伙勃赶掣释境貉玛郭膀教艰难荆杏贯昌端吵势废份鲜弃刊难禁碉偶茹揣连贯椿劲摔痕孙哼支杖绒颁将铱造屈猾抱开技饶峦广患乞接吴岭秤健溃丑两街铣候娃蟹吩萝阎违娄缸使醉尉易回冰句拿翘汐哟仍测否亥滥宠砸盖瓷戏仲囊韩财隆邯怂噬夕耽挤愤屹旋挡韭睫哈庇力向瞧待菜译趣艰凿溜枢绩汉肾悉高扛骚杆砷企穆绰瓶
本文标题:51单片机ds18b20和lcd1602显示温度
链接地址:https://www.777doc.com/doc-6291821 .html