当前位置:首页 > DS18B20温度计C程序
DS18B20温度计C程序 #include”reg51.h” #include”intrins.h” #define Disdatea p1 #define discan P3
#define uchar unsigned char #define uint unsigned int Sbit DQ=P3^7; Sbit DIN=P1^7; uint h;
Uchar code ditab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; uchar code dis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf}; uchar data scan_con[4]={0xfe,0xfd,0xfb,0xf7}; uchar data temp_data[2]={0x00,0x00};
Uchar data display[5]={0x00,0x00,0x00,0x00,0x00};
Void delay(uint t) {
For(;t>0;t--); }
Scan() {
Char k;
For(k=0;kk<4;k++) {
Disdata=dis_7[display[k]]; If(k==1){DIN=0;}
Discan=scan_con[k];delay(90);discan=0xff; }
ow_reset(void) {
char presence=1; While(presence) {
DQ=1; }
void write_byte(uchar val) {
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/2; } DQ=1; delay(1); }
uchar read_byte)(void) {
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); }
read_temp() {
ow_reset();
write_byte(0xCC); write_byte(0xBE);
temp_data[0]=read_byte(); temp_data[1]=read_byte(); ow_reset();
write_byte(0xCC); write_byte(0x44); }
work_temp() {
uchar n=0;
if(temp_data[1]>127)
{temp_data[1]=(256-temp_data[1]);temp_data[0]=(256-temp_data[0]);n=1;} display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]]; display[4]=((temp_data[0]&0x0f)>>4)|((temp_data[1]&0x0f)<<4); display[3]=display[4]/100;
display[1]=display[4]0; display[2]=display[1]/10; display[1]=display[1];
if(! display[3]){display[3]=0x0A;if(! display[2]){display[2]=0x0A;}} if(n){display[3]=0x0B;} }
main() {
Display=0xff; display=0xff;
for(h=0;h<4;h++){display[h]=8;} ow_reset();
write_byte(0xCC); wtite_byte(0x44); for(h=0;h<500;h++) {scan();} while(1) {
read_temp(); work_temp();
for(h=0;h<500;h++) {scan();} } }
共分享92篇相关文档