蓝桥杯自写模块之ds18b20

本文详细介绍了如何在蓝桥杯竞赛中使用单片机自写DS18B20温度测量模块,涵盖了main.c和onewire.c两个关键文件的实现过程,为参赛者提供了实用的技术指导。

main.c

#include "reg52.h"
#include "onewire.h"

#define uchar unsigned char
#define uint unsigned int
	
sfr AUXR        =   0x8E;
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0xbf};
/*共阳*/

uchar code weitab[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
									
uchar disPalyBuy[] = {0,1,2,3,4,5,6,7};
uint dspcom = 0;//段码
uint Timer1_flag = 0;

void display(void);
void Timer1Init(void);

void main()
{
	int wendu_num = 0;
	Timer1Init();
	ET1 = 1;
	EA = 1;

	while(1)
	{		
		wendu_num = wendu()*100;
		disPalyBuy[3] = wendu_num/10000;
		disPalyBuy[4] = wendu_num%10000/1000;	
		disPalyBuy[5] = wendu_num%1000/100 + 10;
		disPalyBuy[6] = wendu_num%100/10;
		disPalyBuy[7] = wendu_num%10;
	//	display();
	}
}

void display(void)
{
	
	P0 = 0xff;
	P2 = ((P2&0x1f)|0xE0); 
	P2 &= 0x1f;
	
	P0 = weitab[dspcom];
	P2 = (P2&0x1f)|0xc0;
	P2 = P2&0x1f;	
	
	P0 = tab[disPalyBuy[dspcom]];
	P2 = (P2&0x1f)|0xe0;
	P2 = P2&0x1f;
	
	if(++dspcom==8)
	{
		dspcom = 0;
	}
}

void Timer1Init(void)		//1毫秒@11.0592MHz
{
	AUXR |= 0x40;		//定时器时钟1T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x91;		//设置定时初值
	TH1 = 0xFF;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
}


void Timer1(void) interrupt 3
{
	if(Timer1_flag>20)
	{
		display();
		Timer1_flag = 0;
	}
	Timer1_flag++;
	
}

onewire.c

#include "reg52.h"

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

#define uchar unsigned char 
#define uint unsigned int 

//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC //12Mhz
{
	unsigned char i;
	while(t--)
	{
		for(i = 0;i<12;i++);
	}
}

//通过单总线向DS18B20写一个字节
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);
}

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

//DS18B20设备初始化
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 wendu(void)
{
	
    uchar low,high;
   	char temp;
   
   	init_ds18b20();
   	Write_DS18B20(0xCC);
   	Write_DS18B20(0x44); //启动温度转换
   	Delay_OneWire(200);

   	init_ds18b20();
   	Write_DS18B20(0xCC);
   	Write_DS18B20(0xBE); //读取寄存器

   	low = Read_DS18B20(); //低字节
   	high = Read_DS18B20(); //高字节
 /** 精度为1摄氏度 */  
   	temp = high<<4;
   	temp |= (low>>4);
   
   	return temp;
	
}



 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值