蓝桥杯模块练习4-温度

本文介绍了一款使用STC15F2K60S2单片机实现的嵌入式系统,通过Onewire接口连接DS18B20温度传感器,实现实时温度测量并显示。主函数中调用Timer0Init进行定时,xianshi函数负责数据的显示。同时,详细展示了单总线通信的驱动程序和DS18B20的读写操作。

main.c

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

void xianshi();
void Timer0Init();

unsigned char display[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsigned char shuzu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned int wendu;
extern unsigned int temp;
void main()
{
Timer0Init();EA=1;ET0=1;
P2=0XA0;P0=0X00;



	while(1)
	{

	wendu=readtemp();
		xianshi();
	}

}



void xianshi()
{
	display[0]=shuzu[wendu%10000/1000];
	display[1]=shuzu[wendu%1000/100]&0x7f;
	display[2]=shuzu[wendu%100/10];
	display[3]=shuzu[wendu%10/1];
	display[4]=0xc6;
	display[5]=0xff;
	display[6]=0xff;
	display[7]=0xff;


}


void Timer0Init(void)		//2毫秒@11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x9A;		//设置定时初值
	TH0 = 0xA9;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}
void shuma() interrupt 1
{
	 unsigned char i;
	P2=0XE0;
	P0=0XFF;
	P2=0X1F;
	
	P2=0XC0;
	P0=1<<i;
	P2=0X1F;
	
	P2=0XE0;
	P0=display[i];
	P2=0X1F;
	
	i++;
	if(i>=8)i=0;



}

onewire.c

/*
  程序说明: 单总线驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
  日    期: 2011-8-9
*/
#include "reg52.h"
	unsigned int temp;
sbit DQ = P1^4;  //单总线接口

//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
	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;
}

unsigned int readtemp()
{
		float tp;
	unsigned char th,tl;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
Delay_OneWire(200);
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);

	tl=Read_DS18B20();
	th=Read_DS18B20();

	temp=th;
	temp<<=8;
	temp|=tl;
	if(temp<0)
		{
		temp=~temp;
			temp=temp-1;
			tp=temp;
			temp=tp*0.0625*100+0.5;
		
		}
		else
		{
		tp=temp;
			temp=tp*0.0625*100+0.5;
		}
	return temp;
}







onewire.h

#ifndef __ONEWIRE_H
#define __ONEWIRE_H

unsigned char rd_temperature(void);  //; ;



unsigned int readtemp();



#endif

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值