蓝桥杯单片机——ds18B20

前言

比赛时会提供驱动文件,包含初始化总线函数,写入函数,读取函数。对于读取温度数据和数据转换就是我们要写的部分。

程序

onewire.c

#include <onewire.h>

sbit DQ = P1^4; //引脚定义  /*   需要自己补充的部分    */


void Delay_OneWire(unsigned int t)  
{
	unsigned char i;
	while(t--){
		for(i=0;i<12;i++);
	}
}

//
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

//
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}







 /*   需要自己补充的部分    */

int onewire_dat=0;//存储计算后温度的变量

/*  温度为整数格式  */
void Read_Int(void)
{
	unsigned char  low,high,temp;
	
	init_ds18b20();//初始化总线
	Write_DS18B20(0xcc);//跳过寻址
	Write_DS18B20(0x44);//温度转换指令
	Delay_OneWire(200);//延时等待 
	
	init_ds18b20();//初始化总线
	Write_DS18B20(0xcc);//跳过寻址
	Write_DS18B20(0xbe);//读取温度指令
	Delay_OneWire(200);//延时等待  
	
	low = Read_DS18B20();//读取低字节
	high =Read_DS18B20();//读取高字节
	
	//直接转换,舍弃小数部分	
	temp= high<<4;
	temp|=low>>4; //16进制变10进制
	
	onewire_dat = temp;	
}


/*  温度为带一位小数格式  */
void Read_float1(void)
{
	unsigned char  low,high;
	int temp;
	init_ds18b20();//初始化总线
	Write_DS18B20(0xcc);//跳过寻址
	Write_DS18B20(0x44);//温度转换指令
	Delay_OneWire(200);//延时等待 
	
	init_ds18b20();//初始化总线
	Write_DS18B20(0xcc);//跳过寻址
	Write_DS18B20(0xbe);//读取温度指令
	Delay_OneWire(200);//延时等待  
	
	low = Read_DS18B20();//读取低字节
	high =Read_DS18B20();//读取高字节
	
	//0.0625 -> 0.625  放大了10倍,比如是 23.5 -> 235
	temp =((high<<8)|low)*0.625;

	onewire_dat = temp;	
}

/*  温度为带两位小数格式  */
void Read_float2(void)
{
	unsigned char  low,high;
	int temp;
	init_ds18b20();//初始化总线
	Write_DS18B20(0xcc);//跳过寻址
	Write_DS18B20(0x44);//温度转换指令
	Delay_OneWire(200);//延时等待 
	
	init_ds18b20();//初始化总线
	Write_DS18B20(0xcc);//跳过寻址
	Write_DS18B20(0xbe);//读取温度指令
	Delay_OneWire(200);//延时等待  
	
	low = Read_DS18B20();//读取低字节
	high =Read_DS18B20();//读取高字节
	
	//0.0625 -> 6.25  放大了100倍,比如是 23.58 -> 2358
	temp =((high<<8) |low)*6.25;

	onewire_dat = temp;	
}


/*  数码管显示的温度为整数格式  */
void Read_Int_smg(void)
{
		smg_SetOne(1,onewire_dat/10);
		smg_SetOne(2,onewire_dat%10);		
	
}


/*  数码管显示的温度为带一位小数格式  */
void Read_float1_smg(void)
{
		smg_SetOne(1,onewire_dat/100);
	    smg_SetOne(2,onewire_dat%100/10 + 10);
		smg_SetOne(3,onewire_dat%10);		
}


/*  数码管显示的温度为带两位小数格式  */
void Read_float2_smg(void)
{
		smg_SetOne(1,onewire_dat/1000);
		smg_SetOne(2,onewire_dat%1000/100 + 10);		
	    smg_SetOne(3,onewire_dat%100/10);	
		smg_SetOne(4,onewire_dat%10);	
}

onewire.h

#ifndef __ONEWIRE_H
#define __ONEWIRE_H

#include <STC15F2K60S2.H>
#include <hc138_hs.H>


void Read_Int(void);
void Read_float1(void);
void Read_float2(void);

void Read_Int_smg(void);
void Read_float1_smg(void);
void Read_float2_smg(void);

#endif

main.c

#include <hc138_hs.H>
#include <onewire.h>

/*    应用      */
void main(void)
{
	
	while(1)
	{
		//读取显示温度为整数格式
		Read_Int();//读取
		Read_Int_smg();//显示
		

//		//读取显示温度为带两位小数格式
//		Read_float1();
//		Read_float1_smg();
		
		
//		//读取显示温度为带两位小数格式
//		Read_float2();
//		Read_float2_smg();		
		
		
	}
	
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值