蓝桥杯(IAP15)ds18b20温度模块(2)

主函数部分

#include <stc15f2k60s2.h>
#include <onewire.h>



#define uchar unsigned char
#define uint unsigned int
#define get() (P3&0x3f)|((P4&0x10)<<3)|((P4&0x04)<<4)

void allinit();
void Delay5ms()	;	//@12.000MHz
void mkey();
void Timer0Init();

uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
uchar disbuf[8]={0,1,2,3,11,11,11,11};
uchar discom=0,key=0;

float wendu;
uint w1;

void main()
{
	Timer0Init();
	allinit();

	while(1)
	{


		w1=(uint)(gettemp()*100);
		disbuf[4]=w1/1000;
		disbuf[5]=w1/100%10;
		disbuf[6]=w1/10%10;
		disbuf[7]=w1%10;


	}
}
void Timer0Init(void)		//1??@12.000MHz
{
	AUXR |= 0x80;		//?????1T??
	TMOD &= 0xF0;		//???????
	TL0 = 0x20;		//??????
	TH0 = 0xD1;		//??????
	TF0 = 0;		//??TF0??
	TR0 = 1;		//???0????
	ET0=1;
	EA=1;
}
void time0() interrupt 1
{
	P2=0x00;
	P0=1<<discom;
	P2=0xc0;
	P2=0x00;
	P0=tab[disbuf[discom]];
	P2=0xe0;
	P2=0x00;
	if(++discom==8)discom=0;
}

void allinit()
{
	P2=0x80;
	P0=0xff;
	
	P2=0xa0;
	P0=0x00;
	
	P2=0xc0;
	P0=0xff;
	P2=0xe0;
	P0=0xff;
}

void Delay5ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 59;
	j = 90;
	do
	{
		while (--j);
	} while (--i);
}


温度驱动子函数部分由官方驱动文件修改而来

#include <stc15f2k60s2.h>

sbit DQ = P1^4;  //单总线接口
void Delay100us()	;//@12.000MHz
void Delay500us()		;//@12.000MHz
void Write_DS18B20(unsigned char dat);
//从DS18B20读取一个字节
unsigned char Read_DS18B20(void);
//DS18B20设备初始化
void init_ds18b20(void);
float gettemp();


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

//通过单总线向DS18B20写一个字节
float gettemp()
{
	unsigned int temp;
	unsigned char low,high;

	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay500us();Delay500us();
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	
	low=Read_DS18B20();
	high=Read_DS18B20();
	
	temp=(high<<8)|low;
	
	return temp*0.0625;///要除以16分之1
}

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

//从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;
		}	    
		Delay100us()	;
	}
	return dat;
}

//DS18B20设备初始化
void init_ds18b20(void)
{
  	DQ = 0;
  	Delay500us()	;
  	DQ = 1;
  	Delay500us()	; 
		
}


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

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

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

	i = 6;
	j = 211;
	do
	{
		while (--j);
	} while (--i);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值