标准模版——添加1-Wire功能模块

一、onewire.h代码

#include "STC15F2K60S2.H"

sbit DQ= P1^4;
unsigned int read_temperature(void);

二、onewire.c代码

#include "onewire.h"
//
void Delay_OneWire(unsigned int t)  
{
	unsigned char i;
	while(t--){
		for(i=0;i<12;i++);
	}
}

//
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);
}

//
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;
}

//
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 read_temperature(void)
{
	unsigned char low,high;
	
	init_ds18b20();//初始化
	Write_DS18B20(0xCC);//对所有元件进行通信
	Write_DS18B20(0x44);//触发温度转换
	
	init_ds18b20();//初始化
	Write_DS18B20(0xCC);//对所有元件进行通信
	Write_DS18B20(0xBE);//读取温度
	
	low=Read_DS18B20();//返回数据
	high=Read_DS18B20();
	
	return (high<<8|low);
}

三、主函数代码

#include "tim.h"
#include "init.h"
#include "led.h"
#include "seg.h"
#include "stdio.h"//sprintf所需头文件
#include "key.h"
#include "peripheral.h"
#include "ds1302.h"
#include "iic.h"
#include "onewire.h"
//Timer
unsigned long ulms=0;
unsigned int uiLed_Dly=0;
unsigned int uiSeg_Dly=0;
unsigned int uiKey_Dly=0;
unsigned int uiPeripheral_Dly=0;
unsigned int uiRTC_Dly=0;
unsigned int uiADC_Dly=0;
unsigned int uiDAC_Dly=0;
unsigned int uiTemperature_Dly=0;
//LED
unsigned char ucLed=0x25;
//Seg
unsigned char ucSeg_Pos=0;
unsigned char pucSeg_Buf[12],pucSeg_Code[8];
//KEY
unsigned char ucKey_Val=0;
//RTC
unsigned char pucRTC[3]={23,59,55};
//ADC
unsigned char ucADC=0;
//Temperature
float Temperature_Val=0;
//Function
void Led_Proc(void);
void Seg_Proc(void);
void Key_Proc(void);
void Peripheral_Proc(void);
void RTC_Proc(void);
void ADC_Proc(void);
void DAC_Proc(void);
void Temperature_Proc(void);
void main()
{
	Cls_Peripheral();
	Timer0Init();
	EEPROM_Read(pucRTC,0x00,3);//读出先前存到EEPROM芯片里的数据,然后传给pucRTC
	if(pucRTC[0]>23||pucRTC[1]>59||pucRTC[2]>59)
	{
		pucRTC[0]=23;
		pucRTC[1]=59;
		pucRTC[2]=55;
	} 
	Set_RTC(pucRTC);
	EA=1;
	
	while(1)
	{
		Led_Proc();
		Seg_Proc();
		Key_Proc();
		Peripheral_Proc();
		RTC_Proc();
		ADC_Proc();
		DAC_Proc();
		Temperature_Proc();
	}
}
void Led_Proc(void)
{
	if(uiLed_Dly<200)
		return;
	uiLed_Dly=0;
	Led_Disp(ucLed);
}
void Seg_Proc(void)
{
	if(uiSeg_Dly<200)
	return;
	uiSeg_Dly=0;
	
	sprintf(pucSeg_Buf,"%03u %5.2f",(unsigned int)ucADC,Temperature_Val);//将文字存储到数组中
	Seg_Tran(pucSeg_Buf,pucSeg_Code);//将存入的数组中的内容转换成段码
}
void Key_Proc(void)
{
	if(uiKey_Dly<20)
		return;
	uiKey_Dly=0;
	ucKey_Val=Key_Read_KBD();
}
void Peripheral_Proc(void)
{
	if(uiPeripheral_Dly<500)
		return;
	uiPeripheral_Dly=0;
	Set_Peripheral(0,1);
}
void RTC_Proc(void)
{
	if(uiRTC_Dly<500)
		return;
	uiRTC_Dly=0;
	Get_RTC(pucRTC);
	EEPROM_Write(pucRTC,0x00,3);
}
void ADC_Proc(void)
{
	if(uiADC_Dly<500)
		return;
	uiADC_Dly=0;
	
	ucADC=PCF8591_ADC();
}
void DAC_Proc(void)
{
	if(uiDAC_Dly<500)
		return;
	uiDAC_Dly=0;
	PCF8591_DAC(ucADC);
}
void Temperature_Proc(void)
{
		if(uiTemperature_Dly<500)
		return;
		uiTemperature_Dly=0;
		Temperature_Val=read_temperature()/16.0;
}
void Time_0(void) interrupt 1
{
	ulms++;
	uiLed_Dly++;
	uiSeg_Dly++;
	uiKey_Dly++;
	uiPeripheral_Dly++;
	uiRTC_Dly++;
	uiADC_Dly++;
	uiDAC_Dly++;
	uiTemperature_Dly++;
	if(ulms%2==0)//数码管2ms循环一次,因为数码管没有办法一次性显示不同内容,因此逐位去点来点亮
	{
		ucSeg_Pos=(ucSeg_Pos+1)%8;//ucSeg_Pos会在0-7之间循环,依次点亮数码管的每个位
		Seg_Disp(pucSeg_Code,ucSeg_Pos);//基于段码,让对应的位进行显示
		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值