蓝桥杯单片机DS18B20代码注释及部分时序图

版权声明: https://blog.csdn.net/miaoxiaocheng/article/details/88542439

蓝桥杯单片机蓝桥杯单片机DS18B20代码注释及部分时序图

#include<STC15F2K60S2.H>
#include<intrins.h>

#define uchar unsigned char 
#define uint unsigned int	
	
sbit DQ=P1^4;

uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
uchar yi,er,san,si,wu ,liu,qi,ba;

void delayms(int ms);
void Delay500us();
void Delay100us();	
void allinit();
void keyscan();
void dsinit();
uchar read();
uchar temget();
void write(uchar dat);
void rel(uchar dong);
void display1(uchar yi,uchar er);
void display2(uchar san,uchar si);
void display3(uchar wu,uchar liu);
void display4(uchar qi,uchar ba);

void main()
{
	uchar wendu;
	allinit();
	yi=11;er=11;san=11;si=11;wu=11;liu=0;qi=0;ba=0;
	while(1)
	{
		wendu=temget();
		
		liu=wendu/100;
		qi=wendu%100/10;
		ba=wendu%10;
		
		display1(yi,er);
		display2(san,si);
		display3(wu,liu);
		display4(qi,ba);
	}
}


uchar temget()
{
	uchar temp;
	uchar low,high;
	
	dsinit();//单总线上的所有处理均从初始化开始
	write(0xcc);//Skip ROM(跳过 ROM] [CCH]
	write(0x44);//Convert Temperature(温度变换) [44H]
	Delay500us();	Delay500us();	//转换需要一段时间,1000us足够了

	dsinit();//单总线上的所有处理均从初始化开始
	write(0xcc);//Skip ROM(跳过 ROM] [CCH]
	write(0xbe);//Read Scratchpad(读暂存存储器) [BEH]
	
	low=read();
	high=read();
	
	temp=high<<4;//0000 0101  =0101 0000
	temp |= (low>>4); //  1010 0110   0000 0110 | 0101 0000=0101 0110
	
	return temp;
}

uchar read()
{
	uchar i;
	uchar dat;
	
	for(i=0;i<8;i++)
	{
		DQ=0;
		_nop_();//12M这个是1us,All read time slots must be a minimum of 60 μs in duration with a minimum of a 1 μs recovery timebetween slots
		dat>>=1;
		DQ=1;
		if(DQ==1)
		{
			dat |= 0x80;
		}
		Delay100us();//60 < tLOW0 < 120  
	}
	return dat;
}

void write(uchar dat)
{
	uchar i;
	for(i=0;i<8;i++)
	{
		DQ=0;
		DQ=dat&0x01;//0100 0100 & 0000 0001 // 0000 0001
		Delay100us();
		DQ=1;
		dat>>=1;//dat=dat>>1;//1001 0000//0010 0001
	}
}

void dsinit()
{
	DQ=0;
	Delay500us();
	DQ=1;
	Delay500us();
}



void Delay100us()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 2;
	j = 15;
	do
	{
		while (--j);
	} while (--i);
}

void Delay500us()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 6;
	j = 93;
	do
	{
		while (--j);
	} while (--i);
}

void delayms(int ms)
{
	int i,j;
	for(i=ms;i>0;i--)
		for(j=845;j>0;j--);
}

void allinit()
{
	P2=0XA0;
	P0=0X00;//关闭蜂鸣器,继电器
	
	P2=0X80;
	P0=0XFF;//关闭LED灯
	
	P2=0XC0;
	P0=0XFF;//选择所有数码管
	P2=0XFF;
	P0=0XFF;//关闭所有数码管
}

void display1(uchar yi,uchar er)
{
		P2=0XC0;//打开位选573   U8
		P0=0X01;//选择第一个数码管
		P2=0XFF;//打开段选573   U7
		P0=tab[yi];
		delayms(1);
		
		P2=0XC0;//打开位选573   U8
		P0=0X02;//选择第二个数码管
		P2=0XFF;//打开段选573   U7
		P0=tab[er];
		delayms(1);
}	

void display2(uchar san,uchar si)
{
		P2=0XC0;//打开位选573   U8
		P0=0X04;//选择第三个数码管
		P2=0XFF;//打开段选573   U7
		P0=tab[san];
		delayms(1);
		
		P2=0XC0;//打开位选573   U8
		P0=0X08;//选择第四个数码管
		P2=0XFF;//打开段选573   U7
		P0=tab[si];
		delayms(1);
}

void display3(uchar wu,uchar liu)
{
		P2=0XC0;//打开位选573   U8
		P0=0X10;//选择第一个数码管
		P2=0XFF;//打开段选573   U7
		P0=tab[wu];
		delayms(1);
		
		P2=0XC0;//打开位选573   U8
		P0=0X20;//选择第一个数码管
		P2=0XFF;//打开段选573   U7
		P0=tab[liu];
		delayms(1);
}

void display4(uchar qi,uchar ba)
{
		P2=0XC0;//打开位选573   U8
		P0=0X40;//选择第一个数码管
		P2=0XFF;//打开段选573   U7
		P0=tab[qi];
		delayms(1);
		
		P2=0XC0;//打开位选573   U8
		P0=0X80;//选择第一个数码管
		P2=0XFF;//打开段选573   U7
		P0=tab[ba];
		delayms(1);
}



 

执行序列(通过单线总线端口访问 DS18B20 )

步骤1. 初始化

步骤2. ROM 操作指令

步骤3. DS18B20 功能指令

每一次 DS18B20 的操作都必须满足以上步骤,若是缺少步骤或是顺序混乱,器件将不会返回值。

例如这样的顺序:发起 ROM 搜索指令[F0h]和报警搜索指令[ECh]之后,总线控制器必须返回步骤 1。

初始化

通过单总线的所有执行操作处理都从一个初始化序列开始。

初始化序列包括一个由总线控制器发出的复位脉冲和其后由从机发出的存在脉冲。

存在脉冲让总线控制器知道 DS18B20 在总线上且已准备好操作

两个读周期间至少 1us 的恢复时间。

详细英文说明书上传至我的资源

猜你喜欢

转载自blog.csdn.net/miaoxiaocheng/article/details/88542439