数码管 ds18b20温度显示
提问者:rockchunyang2016-12-23 00:00
一直显示255 程序如下 #include #define uchar unsigned char #define uint unsigned int uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delayms(uint); uchar t... 一直显示255 程序如下#in
最佳答案
楼主你在时序上有些错误1。在转换时没有留够足够的转换时间。根据DS18B20芯片手册,9位精度转换时间为93.75ms。12位精度转换时间为750ms。而DS18B20默认为12位精度。所以我加了750ms延时2。在写函数的时候voidds18b20_write_byte(uchardate)//写一个字节{uchari;for(i=0;i<8;i++)//一个字节八位{if((date&&0x01)==1)//写入1{ds18b20=0;delay_15us();ds18b20=1;}else//写入0{ds18b20=0;delay_60us();ds18b20=1;}date>>=1;//右移一位}}应该是if((dat&0x01)==0x01)这里多了一个&号,导致结果错误。3。我增加了用1602显示的模块,删除了用液晶显示的模块。/**********************************以下是程序,并附上仿真图一张**********************************/#include#include#defineucharunsignedchar#defineuintunsignedintuchartemp,tmph,tmpl;sbitds18b20=P2^3;sbitrw=P2^6;sbitlcde=P2^7;sbitrs=P2^5;//下面是1602的驱动程序voiddelay(uintz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}voidwrite_com(ucharcom,biti)//是命令写0数据写1{rs=i;P0=com;delay(5);lcde=1;delay(5);lcde=0;}voidlcd1602init(void){rw=0;write_com(0x01,0);write_com(0x02,0);write_com(0x06,0);write_com(0x0c,0);write_com(0x38,0);}voiddisplay(ucharx,uchary,uchardate){x&=0x01;y&=0x0f;if(x){y+=0x40;}y+=0x80;write_com(y,0);write_com(date,1);}voiddelayms(uintxms){uinti,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}//////////////////////////////////////////////////////////////DS18B20部分/////////////////////////////////////////延时部分voiddelay_600us(void){uchari;for(i=0;i<180;i++);}//延时600usvoiddelay_400us(void){uchari;for(i=0;i<120;i++);}voiddelay_60us(void){uchari;for(i=0;i<18;i++);}//延时60usvoiddelay_15us(void){uchari;for(i=0;i<3;i++);}//延时15us//复位脉冲bitresetpulse(void){ds18b20=0;delay_600us();ds18b20=1;delay_60us();returnds18b20;}//ds18b20初始化voidds18b20_init(void){while(1){if(!resetpulse())//收到ds18b20的低电平信号{ds18b20=1;delay_400us();break;}elseresetpulse();//继续发送复位信号}}voidds18b20_write_byte(uchardate)//写一个字节{uchari;for(i=0;i<8;i++)//一个字节八位{//if((date&&0x01)==1)//写入1//这里错了if((date&0x01)==0x01){ds18b20=0;_nop_();ds18b20=1;delay_60us();}//endifelse//写入0{ds18b20=0;delay_60us();ds18b20=1;}//endelsedelay_15us();date>>=1;//右移一位}}uchards18b20_read_byte(void)//读一个字节{uchari,u;for(i=0;i<8;i++){u>>=1;ds18b20=0;_nop_();//释放总线ds18b20=1;_nop_();_nop_();if(ds18b20==1)//读1{u|=0x80;}else{u=u&0x7f;//读0}delay_60us();}returnu;}ucharread_temperaturn(){ds18b20_init();//初始化;ds18b20_write_byte(0xcc);//跳过ram;ds18b20_write_byte(0x44);//启动温度测量当为高电平时转换完成delayms(750);//转换时间要求ds18b20_init();//初始化;ds18b20_write_byte(0xcc);//跳过ram;ds18b20_write_byte(0xbe);//采集温度delayms(750);tmpl=ds18b20_read_byte();//低位温度数据tmph=ds18b20_read_byte();//高位温度数据tmph<<=4;//左移4位tmph+=(tmpl&0xf0)>>4;return(tmph);}voidmain(){uchartemph=0;uchartempl=0;lcd1602init();while(1){temp=read_temperaturn();temph=temp/10+'0';templ=temp%10+'0';delayms(20);display(0,0,temph);display(0,1,templ);}}
回答者:u89u852tg8782016-12-25 00:00
DS 5相关问题
-
1:第一个划横线部分为延时函数大约为11.4ms,为什么要这么延时?数据手册上说了吗?我特意看了下英文手册,10位转换的时间就是187.6ms,12位转换的时间是750ms,你看的那个延时时间还不一定对。2:第二个划横线
提问者:ChinaGHT2016-08-05
-
高五位S为符号位,分辨率为0.0625。正温度把16进制数转成10进制即可;负温度把16进制数取反后加1再转成10进制数,第一个是00FA是(15*16+10)*0.0625=15.62度,第二个是0032是(3*16+
提问者:e7w9e6o4a22014-11-16
-
是格式化输出八进制的整型数据 printf的格式控制的完整格式: 格式字符 格式字符用以指定输出项的数据类型和输出格式。 ①d格式:用来输出十进制整数。有以下几种用法: %d:按整型数据的实际长度输出。 %md:m为指定
提问者:bjpjf2016-05-12
-
LCD驱动程序/*************************************************************//*
提问者:zhangpan6862017-01-10
-
1、节气门位置传感器作用:节气门位置传感器是监测节气门开启角度的大小,确定怠速,全负荷及加减速工况,以实施与节气门开度状态相对应的各种喷油量控制。失效影响:怠速忽高忽低,或造成飞车现象。2、进气门压力传感器作用:进气压力
提问者:ge870894382016-06-10
-
乘以256是为了将读过来的数据转换成十进制数,再乘以25,然后在返回值里又左移了2,相当于(b*256+a)*0.0625*100!这段程序应该没有判断正负的语句!你多看看DS18B20的手册就会明白了!那里面说的很明白
提问者:nisipm2013-07-16
- DS 5热门车型
- DS 5同品牌车系
- 上市新车
- 即将上市新车