版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、DS18B20溫度傳感器測溫通過數(shù)碼管顯示(詳盡版)/*- 名稱:DS18B20溫度傳感器數(shù)碼管顯示 編寫:JR 日期:2017.12 修改:無 內(nèi)容:利用DS18B20溫度傳感器測量溫度-40+100,通過數(shù)碼管顯示單片機(jī)開發(fā)板使用“金容電子(-*/#include<reg52.h>#include<stdio.h>#include<intrins.h>#include"delayus.h"#define uchar unsigned char#define uint unsigned intsbit DQ=P22; /溫度傳感器信號(hào)線
2、sbit dula=P26; /數(shù)碼管段選線sbit wela=P27; /數(shù)碼管位選線sbit beep=P23; /數(shù)碼管位選線uint temper;uchar a1,a2,a3,a4,a5,n;uint aaa,num;uint warn_l=3000; /低溫-40報(bào)警,測試溫度乘以100uint warn_h=10000; /高溫100報(bào)警,測試溫度乘以100float ttt;void disp(uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5);const uchar table=0x3f,0x0
3、6,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x40,0x00;/不帶小數(shù)點(diǎn)0-9編碼const uchar table1=0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,0xff,0xef; /帶小數(shù)點(diǎn)0-9編碼uchar data temp_data2=0x00,0x00; /讀出溫度暫放void delay(uint z)uint x,y;for(x=z;x>0;x-)for(y=110;y>0;y-);/*18B20復(fù)位初始化函數(shù)1、將數(shù)據(jù)線拉高到12、延時(shí)2us(該時(shí)間要求不是很嚴(yán)格,但是要盡可能
4、短一點(diǎn))3、將數(shù)據(jù)線拉低到04、延時(shí)750us(該時(shí)間范圍可以在480960us)5、將數(shù)據(jù)線拉高到16、延時(shí)等待(70us),如果初始化成功則在1560us內(nèi)產(chǎn)生一個(gè)由18B20返回的低電平0,據(jù)該狀態(tài)可以確定它的存在。但是應(yīng)注意,不能無限的等待,不然會(huì)使程序進(jìn)入死循環(huán),所以要進(jìn)行超時(shí)判斷。7、若CPU讀到數(shù)據(jù)線上的低電平0后,還要進(jìn)行延時(shí),其延時(shí)時(shí)間從發(fā)出高電平算起(第5步的時(shí)間算起最少要480us)。8、將數(shù)據(jù)線再次拉高到1后結(jié)束*/void dsreset()uchar st=1;DQ=1; /拉高數(shù)據(jù)線_nop_();_nop_();while(st)DQ=0; /控制器向DS18B
5、20發(fā)低電平脈沖delayus(81); /延時(shí)750us左右DQ=1; /控制器拉高總線delay70us(); /延時(shí)70usif(DQ=1)st=1;else st=0;delayus(54); /延時(shí)500us等待/*向DS18B20寫一個(gè)字節(jié)函數(shù)1、將數(shù)據(jù)線置低電平02、延時(shí)15us3、按從低位到高位的順序發(fā)送數(shù)據(jù)(一次只發(fā)送一位)4、延時(shí)45us5、將數(shù)據(jù)線拉高到16、重復(fù)15步驟,直到發(fā)送完整個(gè)字節(jié)7、最后將數(shù)據(jù)線拉高到1*/void tempwritebyte(uchar date)uchar i,temp;DQ=1; /因?yàn)閷懼靶枰?,所以先置為高電平_nop_();_n
6、op_(); for(i=8;i>0;i-) /一位一位的寫 temp=date&0x01; /取數(shù)據(jù)最低位DQ=0;delay20us(); /延時(shí)20usif(temp=1) /判斷數(shù)據(jù)為1還是0DQ=1; /如果為1則發(fā)送1,即DQ=1;如果是0則保持,因?yàn)橹癉Q已經(jīng)置為0,所以不用判斷。delay45us(); DQ=1;date=date>>1; /*讀1個(gè)字節(jié)數(shù)據(jù)函數(shù)1、將數(shù)據(jù)線拉高到12、延時(shí)2us3、將數(shù)據(jù)線拉低到04、延時(shí)6us5、將數(shù)據(jù)線拉高到16、延時(shí)4us7、讀數(shù)據(jù)線的狀態(tài)得到一個(gè)狀態(tài)位,并進(jìn)行數(shù)據(jù)處理。8、延時(shí)30us9、重復(fù)17步驟,直到
7、讀取完一個(gè)字節(jié)(一個(gè)字節(jié)共8位需要循環(huán)8次)。*/uchar tempread() /uchar為帶返回值的函數(shù),void不帶uchar i,date;static bit j; /定義靜態(tài)變量 位for(i=8;i>0;i-)date=date>>1; /讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個(gè)字節(jié)在date里DQ=1; /將數(shù)據(jù)線拉高到1_nop_();_nop_(); /延時(shí)2usDQ=0; /將數(shù)據(jù)線拉低到0_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();/延時(shí)6usDQ=1; /將數(shù)據(jù)線拉高到1_nop_();_nop_
8、();_nop_();_nop_();/延時(shí)4usj=DQ;if(j=1)date=date|0x80;/1000 0000delay30us();return(date);void get_tem()dsreset(); /復(fù)位tempwritebyte(0xCC); /跳過ROMtempwritebyte(0x44); /溫度轉(zhuǎn)換dsreset(); /每次操作ROM之前要先復(fù)位,然后執(zhí)行跳過或其他指令tempwritebyte(0xCC);tempwritebyte(0xBE); /讀暫存器 temp_data0=tempread(); /第0位,溫度值低8位;RAM共9個(gè)字節(jié),從0開始
9、自動(dòng)讀temp_data1=tempread(); /第1位,溫度值高8位aaa=temp_data1;aaa<<=8;aaa=aaa|temp_data0; / 兩字節(jié)合成一個(gè)整型變量。work_aaa()n=0;if(aaa>63488) / 溫度值正負(fù)判斷63448=1111 1000 0000 0000aaa=65536-aaa;n=1; / 負(fù)溫度求補(bǔ)碼,標(biāo)志位置1ttt=aaa*6.25; /0.0625*100=6.25temper=(int)ttt;a1=temper/10000; /對1000求模,取萬位a2=temper%10000/1000; /對100
10、00求余對1000求模,取千位a3=temper%1000/100; /對1000求余再對100求模,取百位a4=temper%100/10; /取小數(shù)十位a5=temper%10; /取個(gè)位for(num=100;num>0;num-) if(n=1) /負(fù)溫度if(ttt>warn_l) /超溫報(bào)警beep=0;delay(100);beep=1;delay(100);if(a2!=0)disp(11,10,a2,a3,a4,a5);else disp(11,11,10,a3,a4,a5);else /正溫度if(ttt>warn_h) /超溫報(bào)警beep=0;delay
11、(100);beep=1;delay(100);if(a1=0&&a2=0)disp(11,11,11,a3,a4,a5);if(a1=0&&a2!=0)disp(11,11,a2,a3,a4,a5);if(a1!=0)disp(11,a1,a2,a3,a4,a5);void disp(uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5)wela=1;P0=0xFE;wela=0;dula=1;P0=tablenum0;/顯示第一個(gè)數(shù)碼管顯示'-'號(hào)dula=0;de
12、lay(2);wela=1;P0=0xFD;wela=0;dula=1;P0=tablenum1;/顯示第二個(gè)數(shù)碼管dula=0;delay(2);wela=1;P0=0xFB;wela=0;dula=1;P0=tablenum2;/顯示第三個(gè)數(shù)碼管dula=0;delay(2);wela=1;P0=0xF7;wela=0;dula=1;P0=table1num3;/顯示第四個(gè)數(shù)碼管dula=0;delay(2);wela=1;P0=0xEF;wela=0;dula=1;P0=tablenum4;/顯示第五個(gè)數(shù)碼管dula=0;delay(2);wela=1;P0=0xDF;wela=0;du
13、la=1;P0=tablenum5;/顯示第六個(gè)數(shù)碼管dula=0;delay(2);void disp1(uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5)wela=1;P0=0xFE;wela=0;dula=1;P0=tablenum0;/顯示第一個(gè)數(shù)碼管顯示'-'號(hào)dula=0;delay(2);wela=1;P0=0xFD;wela=0;dula=1;P0=tablenum1;/顯示第二個(gè)數(shù)碼管dula=0;delay(2);wela=1;P0=0xFB;wela=0;dula=1;P0=
14、tablenum2;/顯示第三個(gè)數(shù)碼管dula=0;delay(2);wela=1;P0=0xF7;wela=0;dula=1;P0=tablenum3;/顯示第四個(gè)數(shù)碼管dula=0;delay(2);wela=1;P0=0xEF;wela=0;dula=1;P0=tablenum4;/顯示第五個(gè)數(shù)碼管dula=0;delay(2);wela=1;P0=0xDF;wela=0;dula=1;P0=tablenum5;/顯示第六個(gè)數(shù)碼管dula=0;delay(2);void main()uchar j;get_tem();for(j=0;j<10;j+)wela=1;P0=0x00;w
15、ela=0;dula=1;P0=tablej;/顯示第一個(gè)數(shù)碼管顯示'-'號(hào)delay(500);dula=0;while(1)get_tem();work_aaa();/* 程序名; _delayus_h_* 功 能: DS18B20的c51編程頭文件 * 編程者:ZPZ* 編程時(shí)間:2017/1 * 說 明:us延時(shí)程序 */#ifndef _delayus_h_/定義頭文件#define _delayus_h_#define uint unsigned int /變量類型宏定義,用uint表示無符號(hào)整形(16位)#define uchar unsigned charvoi
16、d delayus(uint t) /t=54時(shí),延時(shí)500us;t=81時(shí)延時(shí)745us while(t-);void delay15us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();void delay20us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_n
17、op_();void delay30us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();void delay45us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop
18、_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();void delay70us() _nop_();_nop_();
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 6495.7-2025光伏器件第7部分:光伏器件測量的光譜失配修正計(jì)算方法
- 貨運(yùn)車輛黑名單制度
- 財(cái)務(wù)會(huì)計(jì)準(zhǔn)則制度
- 落實(shí)備案審查年度工作報(bào)告制度
- 2026福建南平市建陽區(qū)文化體育和旅游局招聘1人參考考試試題附答案解析
- 2026黑龍江雙鴨山公益性崗位招聘176人參考考試試題附答案解析
- 上海市執(zhí)法類公務(wù)員招錄體能測評健康承諾書備考考試題庫附答案解析
- 2026上半年云南事業(yè)單位聯(lián)考能源職業(yè)技術(shù)學(xué)院招聘21人參考考試題庫附答案解析
- 2026四川廣安市廣安區(qū)白市鎮(zhèn)人民政府選用片區(qū)紀(jì)檢監(jiān)督員1人備考考試題庫附答案解析
- 2026年云南師范大學(xué)基礎(chǔ)教育集團(tuán)人才招聘(若干)參考考試題庫附答案解析
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責(zé)任公司社會(huì)成熟人才招聘備考題庫及參考答案詳解1套
- 2025年廣東省生態(tài)環(huán)境廳下屬事業(yè)單位考試真題附答案
- 2026年安徽省公務(wù)員考試招錄7195名備考題庫完整參考答案詳解
- 【地理】期末模擬測試卷-2025-2026學(xué)年七年級地理上學(xué)期(人教版2024)
- LoRa技術(shù)教學(xué)課件
- 統(tǒng)籌發(fā)展與安全課件
- 弱電項(xiàng)目實(shí)施管理方案
- 2025年山西省公務(wù)員考試《申論》試題及答案解析(縣鄉(xiāng)卷)
- 2025年法考客觀題真題回憶版(含答案)
- 2026年鐵嶺衛(wèi)生職業(yè)學(xué)院單招職業(yè)技能測試題庫附答案詳解
- 操作系統(tǒng)安裝與配置標(biāo)準(zhǔn)
評論
0/150
提交評論