#include<reg52.h> unsigned char m,n,p; sbit DQ=P2^3;//定义DS18b20的管脚 sbit L1=P2^7;//定义控制数码管的管脚 sbit L2=P2^6; sbit L3=P2^5; sbit L4=P2^4; unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92, 0x82,0xF8,0x80,0x90,0x7f,0xbf,0xa7};//0-9数字,后面为". - C" /*****延时子程序*****/ void Delay_DS18B20(int num) { while(num--) ; } /*****初始化DS18B20*****/ void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 Delay_DS18B20(8); //稍做延时 DQ = 0; //单片机将DQ拉低 Delay_DS18B20(80); //精确延时,大于480us DQ = 1; //拉高总线 Delay_DS18B20(14); x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败 Delay_DS18B20(20); } /*****读一个字节*****/ unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; Delay_DS18B20(4); } return(dat); } /*****写一个字节*****/ void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; Delay_DS18B20(5); DQ = 1; dat>>=1; } } /*****读取温度*****/ unsigned int ReadTemperature(void) { unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器 a=ReadOneChar(); //读低8位 b=ReadOneChar(); //读高8位 t=b; t<<=8; t=t|a; tt=t*0.0625; t= tt*10+0.5; //放大10倍输出并四舍五入 return(t); } void display()//数码管扫描函数 { P0=table[m]; L1=0;//暂未1,如用三极管驱动要改为0 Delay_DS18B20(250); L1=1;//后关闭显示 P0=table[n]; //P1=table[10];//第二位后显示中间点 L2=0; Delay_DS18B20(250); L2=1; P0=table[10]; L2=0; Delay_DS18B20(250); L2=1; P0=table[p];//小数部分 L3=0; Delay_DS18B20(250); L3=1; P0=table[12]; L4=0; Delay_DS18B20(250); L4=1; } /*主函数部分程序*/ void main()//主函数 { unsigned int j; while(1) { j=ReadTemperature();//读取温度 m=j/100;//分离出十位 n=(j%100)/10;//分离出个位 p=j%10;//分离出小数位 display();//扫描数码管 } } |