數(shù)碼管 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。在轉(zhuǎn)換時沒有留夠足夠的轉(zhuǎn)換時間。根據(jù)DS18B20芯片手冊,9位精度轉(zhuǎn)換時間為93.75ms。12位精度轉(zhuǎn)換時間為750ms。而DS18B20默認為12位精度。所以我加了750ms延時2。在寫函數(shù)的時候voidds18b20_write_byte(uchardate)//寫一個字節(jié){uchari;for(i=0;i<8;i++)//一個字節(jié)八位{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)這里多了一個&號,導致結(jié)果錯誤。3。我增加了用1602顯示的模塊,刪除了用液晶顯示的模塊。/**********************************以下是程序,并附上仿真圖一張**********************************/#include#include#defineucharunsignedchar#defineuintunsignedintuchartemp,tmph,tmpl;sbitds18b20=P2^3;sbitrw=P2^6;sbitlcde=P2^7;sbitrs=P2^5;//下面是1602的驅(qū)動程序voiddelay(uintz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}voidwrite_com(ucharcom,biti)//是命令寫0數(shù)據(jù)寫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();//繼續(xù)發(fā)送復位信號}}voidds18b20_write_byte(uchardate)//寫一個字節(jié){uchari;for(i=0;i<8;i++)//一個字節(jié)八位{//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)//讀一個字節(jié){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);//啟動溫度測量當為高電平時轉(zhuǎn)換完成delayms(750);//轉(zhuǎn)換時間要求ds18b20_init();//初始化;ds18b20_write_byte(0xcc);//跳過ram;ds18b20_write_byte(0xbe);//采集溫度delayms(750);tmpl=ds18b20_read_byte();//低位溫度數(shù)據(jù)tmph=ds18b20_read_byte();//高位溫度數(shù)據(jù)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相關問題
-
任何外設的初始化或者命令如果能夠得到返回值確定完成或者未完成才能讓單片機選擇是否進行下一步,更能讓編程人員得到錯誤信息正確的調(diào)試錯誤
提問者:wangyunfeng1382016-09-20
-
1、節(jié)氣門位置傳感器作用:節(jié)氣門位置傳感器是監(jiān)測節(jié)氣門開啟角度的大小,確定怠速,全負荷及加減速工況,以實施與節(jié)氣門開度狀態(tài)相對應的各種噴油量控制。失效影響:怠速忽高忽低,或造成飛車現(xiàn)象。2、進氣門壓力傳感器作用:進氣壓力
提問者:ge870894382016-06-10
-
乘以256是為了將讀過來的數(shù)據(jù)轉(zhuǎn)換成十進制數(shù),再乘以25,然后在返回值里又左移了2,相當于(b*256+a)*0.0625*100!這段程序應該沒有判斷正負的語句!你多看看DS18B20的手冊就會明白了!那里面說的很明白
提問者:nisipm2013-07-16
-
把tplsb和tpmsb都是8位的合成一個16位的有符號數(shù)tt;temp為浮點數(shù)
t=tpmsb<<8;
t=t|tplsb;
if(t<0) //負溫
提問者:z78782013-06-13
-
(1)異響與發(fā)動機轉(zhuǎn)速的關系 發(fā)動機的大多數(shù)常見異響的存在取決于發(fā)動機的轉(zhuǎn)速狀態(tài)! 、佼愴憙H在怠速或低速運轉(zhuǎn)時存在。發(fā)響的原因有:活塞與氣缸壁間隙過大;活塞銷裝配過緊或連桿軸承裝配過緊;挺桿與其導孔間隙過大;配氣凸輪
提問者:zzty09282016-01-18
-
高五位S為符號位,分辨率為0.0625。正溫度把16進制數(shù)轉(zhuǎn)成10進制即可;負溫度把16進制數(shù)取反后加1再轉(zhuǎn)成10進制數(shù),第一個是00FA是(15*16+10)*0.0625=15.62度,第二個是0032是(3*16+
提問者:e7w9e6o4a22014-11-16
- DS 5熱門車型
- DS 5同品牌車系
- 上市新車
- 即將上市新車