基于單片機的數(shù)字頻率計_第1頁
基于單片機的數(shù)字頻率計_第2頁
基于單片機的數(shù)字頻率計_第3頁
基于單片機的數(shù)字頻率計_第4頁
基于單片機的數(shù)字頻率計_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論