📄 ds1820.c
字号:
#include<reg52.h>
#include"start.h"
#include"ds1820.h"
#include<math.h>
unsigned templ,temph;
sbit DQ=P3^7;
//==================================
// 延时微秒
//==================================
void delay_us(int us)
{
for(;us>0;us--);
}
//======================================================
// 复位 和检测存在返回0表示没有器件,返回1表示有器件存在
//======================================================
bit ds1820_reset()//
{
bit flag=0;
DQ=1;
delay_us(1);
DQ=0;
delay_us(60);//延时50*8微秒
DQ=1; //DQ=1表示释放总线,并不代表总线的电平就一定就是1。
delay_us(8);
flag=DQ; //
delay_us(14);
DQ=1;
return ~flag;
}
//=============================================
// 读一个字节
//=============================================
unsigned ds1820_read_byte() //
{
unsigned value=0,i;
DQ=1;
for(i=0;i<8;i++)
{
DQ=0;
value>>=1;
DQ=1;
// delay_us(1); //加上此语句就不行,不能延时!
if(DQ)
value|=0x80;
delay_us(6);
DQ=1;
}
return value;
}
//========================================
// 写一个字节
//========================================
void ds1820_write_byte(unsigned num)//
{
unsigned i;
DQ=1;
for(i=0;i<8;i++)
{
DQ=0;
DQ=num&0x01;
num>>=1;
delay_us(7);
DQ=1;
}
}
float tempeature_read()// 读温度
{
unsigned hi,low,i;
float xiaoshu=0;
// bit flag=0;
EA=0;
ds1820_reset();
ds1820_write_byte(0xcc); //跳过读序号列号的操作
ds1820_write_byte(0x44); // 启动温度转换
ds1820_reset();
ds1820_write_byte(0xcc); //跳过读序号列号的操作
ds1820_write_byte(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
low=ds1820_read_byte();
hi=ds1820_read_byte();
EA=1;
hi=(hi&0x07)<<4;
hi=hi|((low&0xf0)>>4);
low=low&0x0f;
for(i=4;i>0;i--)
{
if(low&&0x01!=0)
xiaoshu=xiaoshu+1/pow(2,i);
low>>=1;
}
xiaoshu=xiaoshu+hi;
return xiaoshu;
}
//==========================
void delay5ms()
{
int i;
for(i=0;i<800;i++);
}
/*
unsigned to_bcd(unsigned char num) // 时间转换成BCD吗
{
unsigned ge,shi;
shi=num/10;
ge=num%10;
shi=(shi<<4)|ge;
return shi;
}
*/
void led_display(unsigned i,unsigned num)//在第i位上显示num
{
//
unsigned char ledtable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
LED1=1;
LED2=1;
LED3=1;
if(i==2)
{
P0=ledtable[num]|0x80; //在第二位加上小数点
}
else
P0=ledtable[num];
switch(i)
{
case 1:LED1=0;break;
case 2:LED2=0;break;
case 3:LED3=0;break;
// case 4:LED4=1;break;
default:break;
}
delay5ms();
}
main()
{
// bit flag;
float temper=45.6;
unsigned char ge,shi,dot1,i=1;
//DQ=1;
LED1=0;
LED2=0;
LED3=0;
D8=0;
D9=0;
/* TR0=0;
TH0=0xee;
TL0=0;
TR0=1;
EA=1;
ET0=1; */
while(1)
{
temper=tempeature_read();
shi=(unsigned char)(temper/10);
ge=(unsigned char)((int)temper%10);
dot1=(unsigned char)(((int)(temper*10))%10);
if(i==1)
{
led_display(1,shi);
i++;
}
else if(i==2)
{
led_display(2,ge);
i++;
}
else if(i==3)
{
led_display(3,dot1);
i=1;
}
}
}
/*void timer() interrupt 1
{
TR0=0;
TH0=0xee;
TL0=0;
// led_display();
TR0=1;
} */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -