版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、基于單片機的數(shù)字頻率計 作者: 日期:2 個人收集整理 勿做商業(yè)用途基于89S51的實時數(shù)字溫度計(DS1302 18B20)2010-09-01 17:22#includereg51.h>include<intrins。h>#includemath.h#define uchar unsigned char#define uint unsigned intdefine S_RST DS_RST=1#define C_RST DS_RST=0#define S_CLK DS_CLK=1define C_CLK DS_CLK=0define Write_Disable RW_DS
2、1302(0x8e,0x80) /寫保護#define Write_Enable RW_DS1302(0x8e,0x00) /允許寫入sbit SET = P15; /設(shè)置按鍵sbit ADD = P14; /調(diào)整加sbit DEC = P16; /調(diào)整減#define RdefineT1 TH1=0;TL1=0;TR1=0;a=0; /初始化超時檢測/#define Delay2us() _nop_();_nop_(); /延時2us,每nop 1us/define Delay8us()
3、; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();#define ReDetectTime 20 /設(shè)置重復(fù)檢測次次數(shù),超出次數(shù)則超時/ds18b20命令#define SkipROM 0xCC#define MatchROM
4、160; 0x55define ReadROM 0x33define SearchROM 0xF0#define AlarmSearch 0xEC#define Convert 0x44 /啟動溫度轉(zhuǎn)換define &
5、#160; WriteScr 0x4E#define ReadScr 0xBEdefine CopyScr 0x48#define RecallEE 0xB8#define ReadPower
6、 0xB4#define md collect_time00x0fdefine mg (collect_time0&0x70)/16define fd collect_time1&0x0fdefine fg (collect_time10x70)/16defi
7、ne sd collect_time2&0x0fdefine sg (collect_time20x30)/16sbit DS_RST = P12; /DS復(fù)位端sbit DS_CLK = P10; /SCLK端sbit DS_IO = P11; /IO端sbit DS18B20 = P13; /溫度傳感器接口bi
8、t keyboard,flash,STA=1;uchar choose,a; uchar collect_time3=0x45,0x23,0x11;/定義變量秒分時uchar collect_temperature2 = 0;uchar num10 = 0x7e,0x48,0x3d,0x6d,0x4b,0x67,0x77,0x4c,0x7f,0x6f; /七段數(shù)碼管顯示的段碼uchar display8 = 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08;void delay(uint i)uint k;while(i-)
9、160; for(k=0;k120;k+);void Dat_Int(void)/數(shù)據(jù)初始化P0=0xff;P1=0xff;P2=0xff;choose=0;flash=1;void Time01_Int(void)TMOD = 0x12; /定時器0為8位自動重載定時采樣,定時器1為16位超時檢測處理TCON = 0x00;TH0 = 0x60;TL0 = 0x60;TR0 = 1;IE = 0x0a; /允許定時器0、1中斷IP = 0x00;/*
10、 *
11、0; DS18B20溫度傳感器程序段 *
12、0; */*11微秒延時函數(shù)*/void delayus(uint t)for(;t0;t);/*18B20復(fù)位函數(shù)*/void ow_reset(void)char presence=1;while(presence)while(presence)DS18B20
13、 = 1;_nop_();_nop_();DS18B20 = 0;delayus(50); / 550usDS18B20 = 1; delayus(6); / 66uspresence=DS18B20; / presence=0繼續(xù)下一步 delayus(45); /延時500uspresence = DS18B20;DS18B20 = 1; /*18B20寫命令函數(shù)*/向 1WIRE 總線上寫一個字節(jié)void write_byte(uchar val)uchar i;for (i=8; i>0; i-) /DS18B20 =
14、1;_nop_();_nop_(); DS18B20 = 0;_nop_();_nop_();_nop_();_nop_();_nop_();/5usDS18B20 = val&0x01; /最低位移出delayus(6); /66usval=val/2; /右移一位DS18B20 = 1;delayu
15、s(1); /*18B20讀1個字節(jié)函數(shù)*/從總線上讀取一個字節(jié)uchar read_byte(void)uchar i;uchar value = 0;for (i=8;i>0;i-)DS18B20 = 1;_nop_();_nop_();value=1;DS18B20 = 0; /_nop_();_nop_();_nop_();_nop_(); /4usDS18B20 = 1;_nop_();_nop_();_nop_
16、();_nop_(); /4us if(DS18B20)value=0x80;delayus(6); /66usDS18B20 = 1;return(value);/*讀出溫度函數(shù)*/void Ds18b20_ReadEE(void)ow_reset();write_byte(SkipROM); / Skip ROMwrite_byte(Convert); / 發(fā)轉(zhuǎn)換命令ow_reset();
17、 /總線復(fù)位write_byte(SkipROM); / 發(fā)Skip ROM命令write_byte(ReadScr); / 發(fā)讀命令collect_temperature0=read_byte(); /溫度低8位collect_temperature1=read_byte(); /溫度高8位/* &
18、#160; DS1302時鐘芯片程序段
19、0;
20、60; */void DS1302_InputByte(uchar byte) /往DS1302寫入1Byte數(shù)據(jù) uchar i;uchar temp;temp = byte; for(i=8; i>0; i-) DS_IO = temp0x01; S_CLK; C
21、_CLK; temp = temp 1; uchar DS1302_OutputByte(void) /從DS1302讀取1Byte數(shù)據(jù) uchar i;uchar temp=0;for(i=0; i8;i+) C_CLK; if(DS_IO!=0) temp=(1<i); S_CLK; return(temp); void RW_DS1302(uchar reg, uchar byte)/向DS1302寄存器寫數(shù)據(jù)C_
22、RST;C_CLK;S_RST;DS1302_InputByte(reg); DS1302_InputByte(byte);S_CLK;C_RST; uchar Read_DS1302(uchar reg)/從DS1302寄存器讀數(shù)據(jù)uchar byte; C_RST; C_CLK; S_RST;DS1302_InputByte(reg);byte = DS1302_OutputByte(); S_CLK; C_RS
23、T;return(byte);void GetTime_DS1302(uchar *ucCurtime) /讀取DS1302當(dāng)前時間 ucCurtime0 = Read_DS1302(0x81);/格式為: 秒 分 時ucCurtime1 = Read_DS1302(0x83);ucCurtime2 = Read_DS1302(0x85);void Set_Time(uchar *receive) /寫時間Write_Enable; /控制命令,允許寫操作RW_DS1302(0x80,receive0);RW_DS1302(0x82,receive1);RW
24、_DS1302(0x84,receive2);Write_Disable; / 控制命令,寫保護 /*
25、60; * 數(shù)碼管顯示程序段 *
26、160;
27、160; */void deal(void)/送顯前的數(shù)據(jù)處理uint timer2;uint lstemp;timer2+;if(STA) GetTime_DS1302(collect_time);if(flash)/用于閃動效果的控制的display0 = numsg;display1 = numsd;display2 = numfg;display3 = numfd;display4 = nummg;display5 = nummd;elseswitch(choose)case 1:display0=0;break;case 2:displ
28、ay1=0;break;case 3:display2=0;break;case 4:display3=0;break;case 5:display4=0;break;case 6:display5=0;break;if(timer2=3000)/間斷性獲取溫度timer2=0;if(STA)TR0=0;Ds18b20_ReadEE();TR0=1;if(collect_temperature1127)collect_temperature0=255-collect_temperature0; collect_temperature1=255collect_temper
29、ature1; lstemp=(collect_temperature0)4)|((collect_temperature1)<4);display6 = num(uchar)((lstemp)/10);display7 = num(uchar)((lstemp)10); /* &
30、#160; * 按鍵控制程序段
31、60; * &
32、#160; */void Scan(void)if(SET=0&&keyboard=1) /檢測設(shè)置鍵有無按下,并進行相應(yīng)操作 if(SET=0&&keyboard=1) RdefineT1; /超時檢測初始化 choose+;
33、160; while(SET=0); if(choose=7) TR0=0; Set_Time(collect_time); TR0=1; STA=1; /設(shè)置完畢,重新開始采集時間 choose=0; if(choose) &
34、#160; /只有在時間調(diào)整時,加減按鍵才有作用 if(ADD=0&keyboard=1) /檢測加調(diào)整鍵有無按下,并進行相應(yīng)操作 if(ADD=0&keyboard=1) RdefineT1; /超時檢測初始化a=0TR0=0; switch (choose) case 1 :if(sg=2)
35、0; collect_time2 = collect_time2&0x0f; else collect_time2+=16; break; case 2 :if((sg2)&(sd=9)) collect_time2 = 0x30; if((sg=2)&(sd=3)
36、; collect_time2 = 0x30; else collect_time2+; break; case 3: if(fg=5) collect_time1 = 0x0f; else collect_time1+=16; break
37、; case 4: if(fd=9) collect_time1 &= 0xf0; else collect_time1+; break; case 5: if(mg=5) collect_time0 &= 0x0f;
38、60; else collect_time0+=16; break; case 6: if(md=9) collect_time0 = 0xf0; else collect_time0+; break; TR0=1; while(ADD=
39、0); if(DEC=0&&keyboard=1) /檢測減調(diào)整鍵有無按下,并進行相應(yīng)操作 if(DEC=0&keyboard=1) RdefineT1; /超時檢測初始化 TR0=0; switch (choose) case 1 :if(sg=0)
40、160; collect_time2=0x20; else collect_time2=16; break; case 2 :if(sg2&sd=0) collect_time2 = 0x09; if(sg=2&sd=0) &
41、#160; collect_time2 |= 0x03; else collect_time2-=1; break; case 3 :if(fg=0) collect_time1 |= 0x50; else collect_time1=16; brea
42、k; case 4 :if(fd=0) collect_time1 = 0x09; else collect_time1=1; break; case 5 :if(mg=0) collect_time0 = 0x50;
43、; else collect_time0-=16; break; case 6 :if(md=0) collect_time0 |= 0x09; else collect_time0-=1; break; TR0=1;
44、0; while(DEC=0); if(choose!=0)TR1=1;STA=0; /在設(shè)置模式下停止采集時間else TR1=0;STA=1;/* * AT89S51主程序段
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度高新技術(shù)研發(fā)廠房租賃合同3篇
- 2024版汽車租賃合同樣本6篇
- 二零二五年度駕校學(xué)員駕駛技能競賽組織與管理合同3篇
- 二零二四企業(yè)銷售合同合規(guī)性審核與風(fēng)險防范協(xié)議3篇
- 2025年度西餐廳桌椅設(shè)計采購及裝修合同模板3篇
- 2025年度科技企業(yè)戰(zhàn)略合作伙伴股權(quán)調(diào)整協(xié)議書3篇
- 二零二五年度航空航天器打膠工藝優(yōu)化合同2篇
- 2025版汽車金融臨時借款合同范例4篇
- 二零二五年度環(huán)保產(chǎn)品認證服務(wù)合同環(huán)保條款3篇
- 二零二四年農(nóng)產(chǎn)品電商平臺會員服務(wù)及積分獎勵合同3篇
- 二零二五年度無人駕駛車輛測試合同免責(zé)協(xié)議書
- 北京市海淀區(qū)2024-2025學(xué)年高一上學(xué)期期末考試歷史試題(含答案)
- 常用口服藥品的正確使用方法
- 2025年湖北華中科技大學(xué)招聘實驗技術(shù)人員52名歷年高頻重點提升(共500題)附帶答案詳解
- 2024年鉆探工程勞務(wù)協(xié)作協(xié)議樣式版B版
- 《心肺復(fù)蘇機救治院內(nèi)心搏驟?;颊咦o理專家共識》解讀
- 計算機二級WPS考試試題
- 智聯(lián)招聘行測題庫及答案
- 2023中華護理學(xué)會團體標(biāo)準(zhǔn)-注射相關(guān)感染預(yù)防與控制
- GB∕T 2099.1-2021 家用和類似用途插頭插座 第1部分:通用要求
- 超潔凈管道(CL-PVC)施工技術(shù)
評論
0/150
提交評論