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;
|