基于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
如果文章或资源对您有帮助,欢迎打赏作者。一路走来,感谢有您!
txttool.com 说一段 esp56物联 查询128 IP查询