📄 1820.c
字号:
#include <reg52.h>
#include "ds18b20.h"
#include "delay.h"
sbit DS18B20=P3^3;
unsigned char duan[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
unsigned char L_18B20,H_18B20; //分别存放低八位 高八位的数据;
unsigned char temp=0;
sbit a0=P1^0;
sbit a1=P1^1;
sbit a2=P1^2;
sbit a3=P1^3;
//#define LEDPORT P0
/*-------------数码管显示函数--------------------
参数:number 要显示的数字
参数:pos 要显示的位置(从左到右为1--4)
返回值:无
------------------------------------------------*/
/*void display(uchar number,uchar pos)//数码管显示函数
{
uchar temp; //临时变量
if(number<10 && pos<5 && pos>0)//确定数据合法
{
temp=(number<<4)&0xf0;//获得要显示的数据
temp+=1<<(pos-1); //送位置位
LEDPORT=temp; ////送显示数据,开始显示
}
else return;
} */
/*void delay_ms()
{
unsigned char i=0xff;
while (i--);} */
void delay_ms(unsigned int t)
{
unsigned int j;
for(;t>0;t--)
for(j=125;j>0;j--);
}
void leddisplay(unsigned int count)
{SCON=0x00;
SBUF=duan[(count/1000)];
T1=1;
a0=0;
delay_ms();
a0=1;
SBUF=duan[(count%1000/100)];
T1=1;
a1=0;
delay_ms();
a1=1;
SBUF=duan[(count%100/10)];
T1=1;
a2=0;
delay_ms();
a2=1;
SBUF=duan[count%10];
T1=1;
a3=0;
delay_ms();
a3=1;
}
void Reset_18B20(void)//ds18b20复位程序
{
unsigned char i;
DS18B20=0;
i=110;
while(i>0)i--;
DS18B20=1;
i=6;
while(i>0)i--;
}
void Wait_18B20()//等待程序,等待ds18b20应答
{
unsigned char i;
// while(DS18B20);
while(~DS18B20);
i=6;
while(i>0)i--;
}
bit Readbit_18B20(void) //读取一个bit的数据
{
unsigned char i;
bit b;
DS18B20=0;
i++;i++;
DS18B20=1;
i++;i++;i++;i++;i++;
b=DS18B20;
i=13;
while(i>0)i--;
return b;
}
unsigned char Readbyte_18B20(void) //读取一个字节的数据
{
unsigned char i,j,d;
d=0;
for(i=1;i<=8;i++)
{
j=Readbit_18B20();
d=(j<<7)|(d>>1); //又玩野
}
return d;
}
/*void Writebyte_18B20(unsigned char b)//写一个字节(控制字)
{
unsigned char j,i;
bit temp;
for(j=1;j<9;j++)
{
temp=b&0x01;
b=b>>1;
if(temp) // 写“1”
{
DS18B20=0;
i++;i++;i++;i++;i++;
DS18B20=1;
i=13;
while(i>0)i--;
}
else //写“0”
{
DS18B20=0;
i=13;
while(i>0)i--;
DS18B20=1;
i++;i++;i++;i++;i++;
}
}
} */
void Writebyte_18B20(unsigned char date)
{
unsigned char i,j;
for(i=8;i>0;i--)
{ DS18B20=0;
DS18B20=date&0x01;
j=13;
while(j>0)j--;
DS18B20=1;
date>>=1;
}
j=13;
while(j>0)j--;
}
void Convert(void) //开始转换
{
Reset_18B20();
Wait_18B20(); //等待应答脉冲
Writebyte_18B20(0xcc); //跳过序列号脉冲
Writebyte_18B20(0x44); //转换命令
}
void Read_18B20(void) //读取ds18b20
{
Convert();
Reset_18B20();
Wait_18B20();
Writebyte_18B20(0xcc); //跳过ROM
Writebyte_18B20(0xbe); //发送读取命令
L_18B20=Readbyte_18B20(); //读取低八位数据
H_18B20=Readbyte_18B20(); //读取高八位数据
/*if(H_18B20>0x7f) //最高位为1时温度是负
{
L_18B20=~L_18B20; //补码转换,取反加一
H_18B20=~H_18B20+1;
//fg=1; //读取温度为负时fg=1
}*/
temp=(L_18B20+H_18B20*256); //整数部分
}
void main()
{
while(1)
{ Read_18B20();
leddisplay(temp);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -