蓝桥杯单片机学习总结(Day11 DS18B20温度测量)

        标题1:   实验现象

        标题2:代码实例

        标题3:实验总结

        实验现象:一开始显示室温,用手触摸温度传感器,数码管显示有变化。

        代码实例:

                主函数:

#include <STC15F2K60S2.H>
#include "onewire.h"

code unsigned char tab[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff};

unsigned char buf[8]={10,10,10,10,10,10,10,10};  //定义段选
unsigned char Proc_flag;  //读取温度标志
void display();
//关闭蜂鸣器
void cls_buzz()
{
	P2=(P2&0x1f)|0xa0;
	P0=0x00;
	P2&=0x1f;
}	
//关闭led
void cls_led()
{
	P2=(P2&0x1f)|0x80;
	P0=0xff;
	P2&=0x1f;
}	
//定时器初始化+开启中断服务函数
void Timer0Init(void)		//1毫秒@11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xCD;		//设置定时初值
	TH0 = 0xD4;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;
	EA=1;
}

//主函数
void main()
{
	unsigned char tem;  //温度
	cls_buzz();
	cls_led();
	Timer0Init();
	while(1)
	{
		if(Proc_flag)
		{
			Proc_flag=0;
			tem=rd_temperature();
		}
		(tem>=10)?(buf[6]=tem/10):(buf[6]=10);
		buf[7]=tem%10;
	}
}
//中断服务函数
void Timer0_Proc() interrupt 1
{
	static unsigned char ms;
	if(++ms==50)
	{
		ms=0;
		Proc_flag=1;
	}
	display();
}
//数码管显示
void display()
{
	static unsigned char com;
	//消影
	P2=(P2&0x1f)|0xe0;
	P0=0xff;
	P2&=0x1f;
	//位选
	P2=(P2&0x1f)|0xc0;
	P0=(1<<com);
	P2&=0x1f;
	//段选
	P2=(P2&0x1f)|0xe0;
	P0=tab[buf[com]];
	P2&=0x1f;
	//刷新
	if(++com==8)
		com=0;
}

            onewire.c:

#include "reg52.h"

sbit DQ = P1^4;

单总线延时函数
void Delay_OneWire(unsigned int t)  
{
	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); // 延时大于480us
  	DQ = 1;
  	Delay_OneWire(10);  // 14
  	initflag = DQ;     // initflag等于1初始化失败
  	Delay_OneWire(5);
  
  	return initflag;
}

//DS18B20温度采集程序:整数
unsigned char rd_temperature(void)
{
    unsigned char 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(); //高字节
  
  	temp = high<<4;   //只取了整数部分和符号位
  	temp |= (low>>4);
  
  	return temp;
}

        onewire.h:

#ifndef _ONEWIRE_H
#define _ONEWIRE_H

#define OW_SKIP_ROM 0xcc
#define DS18B20_CONVERT 0x44
#define DS18B20_READ 0xbe

//گ˽ʹķ
unsigned char rd_temperature(void);

#endif

        实验总结: 

        对于外界传入内部定时扫描接受基本形成一种基本代码框架,灵活使用flag、定时器以及语句组成的代码块,可以快速实现信号接收发。


   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值