一、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);//基于段码,让对应的位进行显示
}
}