📄 ds18b20.c
字号:
/*************************************************************
程序名称:数码管显示温度
函数说明:数码管显示温度
功能:
P3_3为温度数据输入端
共阳数码管
李灿松
1008.7.17
**************************************************************/
#include<reg52.h>
#include<string.h>
#include<ctype.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit TMDAT=P3^3; //定义DS18B20的数据输入端
uint sdata=0; //温度数据的整数部分
uint xiaoshu1=0; //小数第一位
uint xiaoshu2=0; //小数第二位
uint xiaoshu;
bit flag=1; //温度正负标志
uchar seg7code[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0,0x60,0x25,0x3c,0x23,0x34,0x76}; //共阳段码
/************************************************************
程序名称:延时函数
函数说明:数码管显示延时
功能:
*************************************************************/
void Delay(uint tc) //显示延时函数
{
while(tc!=0)
{
uint i;
for(i=0;i<100;i++)
;
tc--;
}
}
/************************************************************
程序名称:延时函数
函数说明:DS18B20数据读取延时
功能:
*************************************************************/
void dmsec(uint count)
{
uchar i;
while(count--)
{
for(i=0;i<115;i++)
;
}
}
/************************************************************
程序名称:复位函数
函数说明:向DS18B20发送484us复位信号
功能:
*************************************************************/
void tmreast(void)
{
uchar i;
TMDAT=0;
for(i=0;i<103;i++);
TMDAT=1;
for(i=0;i<4;i++);
}
/************************************************************
程序名称:读位函数
函数说明:读取DS18B20一位信号
功能:
*************************************************************/
bit tmrbit(void)
{
uint i;
bit dat;
TMDAT=0; //给脉冲信号
i++;
TMDAT=1;
i++;i++ ; //微量延时
dat=TMDAT; //给脉冲信号
for(i=0;i<8;i++);
return(dat);
}
/************************************************************
程序名称:读字函数
函数说明:读取DS18B20一字节信号
功能:
*************************************************************/
uchar tmrbyte(void)
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmrbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
/************************************************************
程序名称:写函数
函数说明:
功能:
*************************************************************/
void tmwbyte(uchar dat) //写一个字节
{
uchar i,j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
TMDAT=0; //写0
i++;i++;
TMDAT=1;
for(i=0;i<8;i++);
}
else
{
TMDAT=0;
for(i=0;i<8;i++);
TMDAT=1;
i++;i++;
}
}
}
/************************************************************
程序名称:温度转换函数
函数说明:将读取的DS18B20的数据进行转换
功能:
*************************************************************/
void trstar(void)
{
tmreast();
dmsec(1);
tmwbyte(0xcc); //跳过序列号命令
tmwbyte(0x44); //发送转换命令44H
}
/************************************************************
程序名称:读温度函数
函数说明:读取转换后的温度
功能:
*************************************************************/
void temp(void)
{
uchar a,b;
tmreast();
dmsec(1);
tmwbyte(0xcc);
tmwbyte(0xbe);
a=tmrbyte(); // 读取温度
b=tmrbyte();
if(b>0x7f)
{
a=~a;b=~b+1; //补码转换,取反加一
flag=0; //温度为负时flag=0
}
sdata=a/16+b*16;
xiaoshu1=(a&0x0f)*10/16;
xiaoshu2=(a&0x0f)*100/16%10;
xiaoshu=xiaoshu1*10+xiaoshu2;
/* sdata=45;
xiaoshu1=3;
xiaoshu2=2;
xiaoshu=xiaoshu1*10+xiaoshu2;
*/
}
void DS18B20R(void)
{
trstar();
dmsec(5); // 不断读取数据
temp(); //读取数据后将温度存在TMP中
}
/************************************************************
程序名称:显示函数
函数说明:显示读取的数据
功能:
*************************************************************/
void LED()
{
if(flag==1)
{
P2=0x7f;
P0=seg7code[sdata/10];
Delay(2);
P2=0xbf;
P0=seg7code[sdata%10]&0xdf;
Delay(2);
P2=0xdf;
P0=seg7code[xiaoshu1];
Delay(2);
P2=0xef;
P0=seg7code[xiaoshu2];
Delay(2);
P2=P2|0xf0;
P0=0xff;
}
if(flag==0)
{
P2=0x7f;
P0=seg7code[11]; //负号
Delay(8);
P0=seg7code[sdata/10];
Delay(8);
P2=0xbf;
P0=seg7code[sdata%10];
Delay(8);
P2=0xdf;
P0=seg7code[xiaoshu1];
Delay(8);
P2=P2|0xf0;
P0=0xff;
}
}
/************************************************************
程序名称:主函数
函数说明:数码管显示温度数据
功能:
*************************************************************/
main()
{
flag=1;
while(1)
{
DS18B20R();
LED();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -