基于51单片机四位一体数码管显示DS18B20测温的项目工程

#include<reg52.h>//包含51单片机内部寄存器头文件
#define uchar unsigned char// 自定义uchar为unsigned char(即无符号字符型数据,数据范围:0到255。)
#define uint unsigned int//自定义uint为unsigned int(即无符号字符整数型数据,数据范围:0到6355。)                    
uchar code table0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40} ; //共阴数码管字码表
uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};  //个位带数点字码表
uchar code Wei[]={0xfe,0xfd,0xfb,0xf7};//数码管位数码表  
//uchar Display_data[4];//显示数据数组 
uint  Temperature_value;//温度值
uint bai,shi,ge,xiaoshu;//温度值
uchar Temperature_flag;//温度负标志 sbit DQ=P1^6;//DS18B20数据信号端口 /*DS18B20的延时函数*/ void DS18B20_Delay(uint i) { while(i--); } /*DS18B20的初始化函数*/ void DS18B20_Init() { uchar x=0; DQ = 1;//DS18B20数据信号端口DQ复位 DS18B20_Delay(4); DQ = 0;//DS18B20数据信号端口DQ拉低 DS18B20_Delay(100);//精确延于480us DQ = 1;//DS18B20数据信号端口拉高 DS18B20_Delay(40); } /*DS18B20读一个字节函数*/ uchar DS18B20_ReadOneByte() { uchar i=0; uchar j=0; for (i=8;i>0;i--) { DQ = 0;//给脉冲信号 j>>=1; DQ = 1;//给脉冲信号 if(DQ) j|=0x80; DS18B20_Delay(10); } return(j); } /*DS18B20写一个字节函数*/ void DS18B20_WriteOneByte(uchar k) { uchar i=0; for (i=8; i>0; i--)//向DS18B20数据信号端口DQ写入数据8次 { DQ = 0;//DS18B20数据信号端口DQ置低电平 DQ = k&0x01;//按从低位到高位的顺序向DS18B20数据信号端口DQ发送字节(一次只发送一位) DS18B20_Delay(10); DQ = 1;//DS18B20数据信号端口DQ置高电平 k>>=1;//重复以上的操作,直到所有的字节全部发送完为止。 } } /*单片机读取DS18B20当前温度的函数*/ DS18B20_ReadTemperature() { uchar a,b; DS18B20_Init();//DS18B20初始化 DS18B20_WriteOneByte(0xcc);//跳读序列号 DS18B20_WriteOneByte(0x44);//启温度转换 DS18B20_Init();//DS18B20初始化 DS18B20_WriteOneByte(0xcc);//跳读序列号 DS18B20_WriteOneByte(0xbe);//读取温度 a=DS18B20_ReadOneByte();//读取到的第一个字节为温度LS BYTE b=DS18B20_ReadOneByte();//读取到的第一个字节为温度MS BYTE Temperature_value=b;//先把高八位有效数据赋于Temperature Temperature_value<<=8; Temperature_value=Temperature_value|a; if(Temperature_value<0x0fff) Temperature_flag=0; else { Temperature_value=~Temperature_value+2; Temperature_flag=1;//负温度 } Temperature_value=Temperature_value*(0.625);//温度值扩大10倍,并精确到1位数。 return(Temperature_value); } /*DS18B20所测温度值显示函数*/ void DS18B20_Display() { uchar i; bai=Temperature_value/1000;//百位数 shi=Temperature_value%1000/100;//十位数 ge=Temperature_value%100/10;//个位数 xiaoshu=Temperature_value%10;//小数位 if(Temperature_flag==0) { if(bai==0x00) { bai=0x00;//百位数的0显示 if(shi==0x00) shi=0x00;//十位数的0显示 } } else //负温度 { bai=0x0b;//负温度百位显示负号:- if(shi==0x00) shi=0x00;//十位数的0显示 } for(i=0;i<10;i++) { P2=Wei[0]; P0=table0[bai];//百位 DS18B20_Delay(20);
P2=Wei[1];
P0=table0[shi];//十位
DS18B20_Delay(20);
P2=Wei[2]; P0=table1[ge];//个位 DS18B20_Delay(20);
P2=Wei[3];
P0=table0[xiaoshu];//小数位
DS18B20_Delay(20);
} }
/*主函数*/ void main() { DS18B20_Init();//DS18B20初始化显示 while(1) { DS18B20_ReadTemperature();//单片机读取DS18B20当前温度 DS18B20_Display();//共阴数码管显示DS18B20所测温度 } }

原文地址:https://www.cnblogs.com/AChenWeiqiangA/p/12891054.html