06.1温度传感器DS18B20

1.Main.c

#include<stc15.h>
#include<intrins.h>
#include<onewire.h>
unsigned char DigCom=0;
unsigned char DigBuf[8] = {20,20,20,20,20,20,20,20};

unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,\
										 0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,\
										 0XBF,0XFF};

										 
unsigned int Temp_tt =0;		//定义一个温度传感刷新及时变量
bit Temp_Ref =0;						//定义一个温度传感刷新标志位
unsigned int Temper = 0 ;		//定义一个存储温度数据的变量(16位)
unsigned char Temp_Vaue = 0 ;			//定义一个只存储温度整数数据的变量
unsigned long Temp_DotValue = 0 ;	//定义一个计算温度带小数位的变量

void ALL_Init(void);
void Delay_MS(unsigned int MS);
void Timer0Init(void);		//1毫秒@11.0592MHz




void main(void)
{
	ALL_Init();
	Timer0Init();
	EA=1;ET0=1;
	while(1)
	{
		
		if(Temp_Ref==1)
		{
			Temp_Ref=0;	
//			Temp_Vaue=Temp_get()>>4;
//			DigBuf[0]=21;DigBuf[1]=21;DigBuf[2]=21;DigBuf[3]=21;DigBuf[4]=21;
//			DigBuf[5]=21;DigBuf[6]=Temp_Vaue/10;DigBuf[7]=Temp_Vaue%10;	
			Temp_DotValue = Temp_get()*625;
			
			DigBuf[0]=21;DigBuf[1]=21;
			DigBuf[2]=Temp_DotValue/100000;
			DigBuf[3]=Temp_DotValue%100000/10000+10;// 显示带小数点的码值
			DigBuf[4]=Temp_DotValue%10000/1000;
			DigBuf[5]=Temp_DotValue%1000/100;
			DigBuf[6]=Temp_DotValue%100/10;
			DigBuf[7]=Temp_DotValue%10;					
		}
	}
}
void Timer0(void) interrupt 1
{
	P0=0X00;
	P2|=0XC0;  // P2=P2|0XC0;   XXXX XXXX | 1100 0000 = 11XX XXXX
	P2&=0XDF;	 // P2=P2&0XDF;   11XX XXXX & 1101 1111 = 110X XXXX	
	P2&=0X1F;		//关闭所有的74HC573锁存器	
	
	P0=tab[DigBuf[DigCom]];	
	P2|=0XE0;			//	P2=P2|0XE0;   XXXX XXXX | 1110 0000 = 111X XXXX
	P2&=0XFF;		 	// P2=P2&0XDF;   11XX XXXX & 1101 1111 = 110X XXXX	
	P2&=0X1F;			//关闭所有的74HC573锁存器
	
	P0=(0X01<<DigCom); 	//然后选中第一个数码管
	P2|=0XC0;  // P2=P2|0XC0;   XXXX XXXX | 1100 0000 = 11XX XXXX
	P2&=0XDF;	 // P2=P2&0XDF;   11XX XXXX & 1101 1111 = 110X XXXX	
	P2&=0X1F;		//关闭所有的74HC573锁存器

	if(++DigCom == 8)DigCom = 0 ;
	
	if(++Temp_tt==1000){Temp_tt=0;Temp_Ref=1;}
	
//	XXX_tt++;
//	if(++XXX_tt==NNN){XXX_tt=0;XXX_Ref=1;}	
}

void Timer0Init(void)		//1毫秒@11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xCD;		//设置定时初始值
	TH0 = 0xD4;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}


void ALL_Init(void)
{
	P0 =0X00;		//先设置关闭蜂鸣器继电器的P0输出值(全关)
	P2|=0XA0;		// 将P27 P25 设置为1 其他位保持不变
	P2&=0XBF; 	// 将P26设置为0 其他位保持不变
	P2&=0X1F;		//关闭所有的74HC573锁存器

	P0 =0XFF;		//先设置关闭所有的LED的P0输出值(全关)
	P2|=0X80;		// 将P27设置为1 其他位保持不变
	P2&=0X9F;		// 将P26 P25设置为0 其他位保持不变
	P2&=0X1F;		//关闭所有的74HC573锁存器
	
	P0 =0X00;		//先设置选择数码管位选的P0输出值(全不选)
	P2|=0XC0;		// 将P27 P26 设置为1 其他位保持不变
	P2&=0XDF;		// 将P26设置为0 其他位保持不变
	P2&=0X1F;		//关闭所有的74HC573锁存器
}
void Delay_MS(unsigned int MS)
{
	unsigned i,j;
	for(i=0;i<MS;i++)
		for(j=853;j>0;j--); //STC15单片机设置为853; STC8H单片机修改为1109;STC32G单片机修改为427;
}

2.onewire.c

#include "reg52.h"

sbit DQ = P1^4;  //单总线接口

//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
	while(t--);
}

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(50);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(50);
}

//从DS18B20读取一个字节
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(50);
	}
	return dat;
}

//DS18B20设备初始化
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(120);
  	DQ = 0;
  	Delay_OneWire(800);
  	DQ = 1;
  	Delay_OneWire(100); 
    initflag = DQ;     
  	Delay_OneWire(50);
  
  	return initflag;
}

unsigned long Temp_get(void)
{
	unsigned char low,high;
	unsigned int Temp;
	
	init_ds18b20();//启动总线
	Write_DS18B20(0XCC);//发送跳过ROM指令
	Write_DS18B20(0X44);//发送启动温度转换指令
	Delay_OneWire(200);//延迟
	
	init_ds18b20();//启动总线
	Write_DS18B20(0XCC);//发送跳过ROM指令
	Write_DS18B20(0XBE);	//发送读暂存器指令
	
	low=Read_DS18B20();		//读暂存器的低8位
	high=Read_DS18B20();	//读暂存器的高8位
	
	Temp=high&0X0F; 	 		// SSSS  XXXX   高4位清零(符号位)
	Temp <<= 8;						//	Temp =Temp << 8; 高8位向左移8位
	Temp |= low; 					// Temp =Temp | low; 存储低8位	
	  
	return Temp;
	
}

3.ONEWIRE.H

#ifndef __ONEWIRE_H
#define __ONEWIRE_H

unsigned long Temp_get(void);

#endif

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值