#include<reg51.h>
sbit DQ = P3^7; //定义ds18B20总线IO
sbit P27 = P2^7;
unsigned char display[4];
unsigned char dis_dat[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x76,0x06,0x3d,0x76,0x38,0x5c,0x00,0x40,0x80};
unsigned char n=18;
void delay(int num) //延时程序
{
while(num--);
}
void Init_DS18B20(void) //DS18B20初始化
{
bit flag; //储存DS18B20是否存在的标志,flag=0,存在;flag=1,不存在
DQ = 1; //先将数据线拉高
delay(8); //略微延时约6微秒
DQ = 0; //再将数据线从高拉低,要求保持480~960us
delay(80); //略微延时约600微秒//以向DS18B20发出一持续480~960us的低电平复位脉冲
DQ = 1; //释放数据线(将数据线拉高)
delay(14); //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
flag=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在)
delay(20); //延时足够长时间,等待存在脉冲输出完毕
P27=flag;
}
unsigned char ReadOneChar(void) //读取一个字节
{
unsigned char i=0;
unsigned char dat; //储存读出的一个字节数据
for (i=0;i<8;i++)
{
DQ = 1; // 先将数据线拉高
delay(1); //等待一个机器周期
DQ = 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
dat>>=1; //数据右移一位
DQ = 1; //将数据线拉高,为单片机检测DS18B20的输出电平作准备
delay(1); //延时约6us,使主机在15us内采样
if(DQ)
{dat|=0x80;} //将一位数据存入dat
delay(1); //延时3us,两个读时序之间必须有大于1us的恢复期
}
return(dat); //返回读出的十六进制数据
}
void WriteOneChar(unsigned char dat) //写入一个字节
{
unsigned char i=0;
for (i=0; i<8; i++)
{
// DQ =1; //先将数据线拉高
// delay(1); //等待一个机器周期
DQ=0; //将数据线从高拉低时即启动写时序
// delay(5);
DQ=dat&0x01; //利用与运算取出要写的某位二进制数据,并将其送到数据线上等待DS18B20采样
delay(2); //延时约60us,DS18B20在拉低后的约15~60us期间从数据线上采样
DQ=1; //释放数据线
// delay(3); //延时3us,两个写时序间至少需要1us的恢复期
dat>>=1; //将dat中的各二进制位数据右移1位
}
delay(10); //稍作延时
}
unsigned int temp_test(void) //读取温度
{
unsigned int v1,v2; //提取温度的变量必须为整型
unsigned int temp;
Init_DS18B20();
WriteOneChar(0XCC);
WriteOneChar(0X44); //启动温度转换
Init_DS18B20();
WriteOneChar(0XCC);
WriteOneChar(0XBE); //读取温度寄存器
v1=ReadOneChar(); //读低8位
v2=ReadOneChar(); //读高8位
v2<<=8;
temp=v2|v1; //读数合并
return(temp);
}
void process_temp(void)
{
unsigned int tem;
float temp0;
unsigned int temp1,x;
tem=temp_test();
if(tem>6348)
{
tem=65536-tem;
x=1;
}
else
{
x=0;
}
temp0=tem*0.0625;
temp1=temp0*10+0.5;
if(x==0)
{
if(temp0<=70)
{
display[0]=temp1%10;
display[1]=temp1/10%10;
display[2]=temp1/100%10;
display[3]=16;
n=18;
}
else
{
display[0]=13;
display[1]=12;
display[2]=11;
display[3]=10;
n=16;
}
}
else
{
if(temp0<=20)
{
display[0]=temp1%10;
display[1]=temp1/10%10;
display[2]=temp1/100%10;
display[3]=17;
n=18;
}
else
{
display[0]=17;
display[1]=15;
display[2]=14;
display[3]=17;
n=16;
}
}
}
void display_temp(void)
{
process_temp();
P0=0xfe;
P1=dis_dat[display[0]];
delay(50);
P0=0xfd;
P1=dis_dat[display[1]]|dis_dat[n];
delay(50);
P0=0xfb;
P1=dis_dat[display[2]];
delay(50);
P0=0xf7;
P1=dis_dat[display[3]];
delay(50);
}
void main(void)
{
while(1)
{display_temp();}
}
tem.zip_单片机tem.h
版权申诉
80 浏览量
2022-09-23
00:00:28
上传
评论
收藏 37KB ZIP 举报
JonSco
- 粉丝: 72
- 资源: 1万+
最新资源
- 基于matlab实现 powell算法 用matlab实现,使用方法内附详细说明.rar
- 基于matlab的手写字体识别程序,并对结果进行保存.rar
- 基于c语言指纹识别demo代码 包括了指纹图像方向图计算、频率计算、gabor滤波器增强,细化,特征点提取,特征点匹配.rar
- 基于c++NSGA-2思想的多目标优化程序,采用进化算法处理多目标实值优化问题.rar
- Linux系统中常用权限管理命令
- Coello Coello等人提出了MOPSO 该程序基于matlab实现针对测试函数matlab程序
- Linux系统中常用权限管理命令
- AIR-AP1815-K9-ME-8-5-182-0.tar For Cisco AP1815
- 实验七.zip
- ESP8266刷固件软件flash-download-tools-v3.6.5,AT固件,机智云固件
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0