📄 readrom.c
字号:
/***********************************/
/*******读取ds18b20序列号程序*******/
/***********************************/
#include<reg52.h>
sbit DQ=P2^7;
unsigned char dat_serial[8];
unsigned char disp[9]={0x00,0x10,0x20,0x30,0x40,0x50,0x70,0x80,0x90};
//延时子程序,实现(13*N+11)us的延时,晶振11.0592MHz
void delay(unsigned int N)
{
int i;
for(i=0;i<N;i++);
}
void delay2(unsigned int i) //延时1.8ms*i
{
int t;
while(i--)
for(t=0;t<125;t++);
}
//复位
unsigned char reset(void)
{
unsigned char ds18b20_ready;
DQ=0;
delay(40); //延时至少480~960us
DQ=1;
delay(6); //延时等待ds18b20响应
ds18b20_ready=DQ;
delay(32); //等待时序结束
return(ds18b20_ready); //有ds18b20信号时返回0,否则返回1
}
//读 1 byte 子程序
unsigned char readonebyte(void)
{
unsigned char i;
unsigned char dat=0;
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1; //每次右移并可以微量延时>1us
DQ=1;
if(DQ) dat|=0x80;
delay(7);
}
return(dat);
}
//写 1 byte 子程序
void writeonebyte(unsigned char date)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=date&0x01;
delay(8); //在15--60us的时间内采样,若果时高电平就写1,低电平就写0
DQ=1;
date>>=1;
}
}
//显示函数
void display(void)
{
unsigned char n,i,nb,ns,ng;
for(i=0;i<8;i++)
{
P1=0;
n=dat_serial[i];
nb=n/100;P0=disp[nb]; //百位
ns=n%100/10;P0=disp[ns]; //十位
ng=n%100%10;P0=disp[ng]; //个位
delay2(500); //延时0.9s左右
}
}
//ds18b20获得序列号
void main(void)
{
unsigned char i=0;
EA=0;
reset();
writeonebyte(0x33);
for(i=0;i<8;i++)
{
dat_serial[i]=readonebyte();
}
EA=1;
display();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -