#include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit DQ=P3^7; sbit beep=P3^0; void reset(); //DS18B20復位函數 void write_byte(uchar val); //DS18B20寫命令函數 uchar read_byte(void); //DS18B20讀1字節函數 void read_temp(); //溫度讀取函數 void LED_display(); void alarm(); uchar tempH,tempL,num; uchar table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0~9的LED字符編碼 uchar setValue_low=15; //設置溫度下限 uchar setValue_high=30; //設置溫度上限 main() { while(1) { read_temp(); LED_display(); alarm(); } } void delay(uint t) { for(;t>0;t--); } void reset() //DS18B20的復位 { uchar presence=1; while(presence) { while(presence) { DQ=1;_nop_();_nop_(); DQ=0; delay(50); DQ=1; delay(6); presence=DQ; } delay(45); presence=~DQ; } DQ=1; } void write_byte(uchar val) //DS18B20寫一個字節 { uchar i; for(i=8;i>0;i--) { DQ=1;_nop_();_nop_(); DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_(); DQ=val&0x01; delay(6); val=val>>1; } DQ=1; _nop_(); } uchar read_byte(void) //DS18B20讀一個字節 { uchar i; uchar value=0; for(i=8;i>0;i--) { DQ=1;_nop_();_nop_(); value>>=1; DQ=0; _nop_();_nop_();_nop_();_nop_(); DQ=1;_nop_();_nop_();_nop_();_nop_(); if(DQ) value|=0x80; delay(6); } DQ=1; return(value); } void read_temp() //從DS18B20讀取溫度值 { uchar ch1,ch2; reset(); write_byte(0xcc); write_byte(0x44); reset(); write_byte(0xcc); write_byte(0xbe); ch1=read_byte(); //DS18B20的溫度數值是16位的二進制,精度高,最后四位是溫度的小數部分,最高五位為符號位(即正負溫度) ch2=read_byte(); num=(ch2<<4)|(ch1>>4); //只取溫度值的中間八位,小數部分舍去,符號位舍去四位。 tempH=num/10; //溫度的十位 tempL=num-tempH*10; //溫度的個位 } void LED_display() //顯示檢測的溫度 { P2=0x0; P2=2; P0=table[tempL]; delay(50); P2=0x0; P2=1; P0=table[tempH]; delay(50); P2=0x0; } void alarm() //報警 { if(setValue_low<=num &&setValue_high>=num) beep=1; //在溫度允許范圍,不報警 else beep=~beep; }
|