|
Ex6.c #include<reg52.h> // 包括單片機寄存器定義的頭文件 #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit BEEP=P3^7; sbit DQ=P3^6; sbit point=P0^7; sbit motor=P1^1; sbit lamp=P1^0; uchar disbuf[3]; uchar code LEDData[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //延時子函數// void delay(uint num) { while(num--); } //*************初始化*************// void Init_DS18B20(void) { unsigned char x=0; DQ=1; //DQ先置高電平 delay(8); //稍延時 DQ=0; //·發送復位脈沖 delay(80); //延時(¨>480us) DQ=1; //拉高數據線 delay(5); //等待(15~60us) x=DQ; //用x的值來判斷初始化有沒有成功,18B20存在的話x=0,否則x=1 delay(20); } //************讀一個字節*************// ReadOneChar(void) // 主機數據線先從高拉至低電平1us以上再使數據升為高電平,產生信號// { unsigned char i=0; //每個讀周期最短的持續時間為60us,各個讀周期之間必須有10us以上的高電平恢復期 unsigned char dat=0; for (i=8;i>0;i--) //一個字節有八位 { DQ=1; delay(1); DQ=0; dat>>=1; DQ=1; if(DQ) dat|=0x80; delay(4); } return(dat); } //****************寫一個字節****************// void WriteOneChar(unsigned char dat) { unsigned char i=0; //數據線從高電平拉至低電平,產生起始信號,15us之內將所需寫的位送到數據線上// for(i=8;i>0;i--) //在15-60us之間對數據進行采樣,如果是高電平就寫1,否則寫0// { DQ=0; //在另一個寫周期前必須有1us以上的高電平恢復期 DQ=dat&0x01; delay(5); DQ=1; dat>>=1; } delay(4); } //*****************讀取溫度******************// uchar ReadTemperature(void) { uchar fg=0; uchar tempL=0; uchar tempH=0; uint sdate; uchar pointnum; Init_DS18B20(); WriteOneChar(0xcc); WriteOneChar(0x44); delay(125); Init_DS18B20(); WriteOneChar(0xcc); WriteOneChar(0xbe); tempL=ReadOneChar(); tempH=ReadOneChar(); if(tempH>0x7f) { tempL=~tempL; tempH=~tempH+1; fg=1; } sdate=tempL/16+tempH*16; pointnum=(tempL&0x0f)*10/16; if(fg==1) { sdate-=15; pointnum=0;
|