1.Main.c
#include<stc15.h>
#include<intrins.h>
#include<onewire.h>
unsigned char DigCom=0;
unsigned char DigBuf[8] = {20,20,20,20,20,20,20,20};
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,\
0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,\
0XBF,0XFF};
unsigned int Temp_tt =0; //定义一个温度传感刷新及时变量
bit Temp_Ref =0; //定义一个温度传感刷新标志位
unsigned int Temper = 0 ; //定义一个存储温度数据的变量(16位)
unsigned char Temp_Vaue = 0 ; //定义一个只存储温度整数数据的变量
unsigned long Temp_DotValue = 0 ; //定义一个计算温度带小数位的变量
void ALL_Init(void);
void Delay_MS(unsigned int MS);
void Timer0Init(void); //1毫秒@11.0592MHz
void main(void)
{
ALL_Init();
Timer0Init();
EA=1;ET0=1;
while(1)
{
if(Temp_Ref==1)
{
Temp_Ref=0;
// Temp_Vaue=Temp_get()>>4;
// DigBuf[0]=21;DigBuf[1]=21;DigBuf[2]=21;DigBuf[3]=21;DigBuf[4]=21;
// DigBuf[5]=21;DigBuf[6]=Temp_Vaue/10;DigBuf[7]=Temp_Vaue%10;
Temp_DotValue = Temp_get()*625;
DigBuf[0]=21;DigBuf[1]=21;
DigBuf[2]=Temp_DotValue/100000;
DigBuf[3]=Temp_DotValue%100000/10000+10;// 显示带小数点的码值
DigBuf[4]=Temp_DotValue%10000/1000;
DigBuf[5]=Temp_DotValue%1000/100;
DigBuf[6]=Temp_DotValue%100/10;
DigBuf[7]=Temp_DotValue%10;
}
}
}
void Timer0(void) interrupt 1
{
P0=0X00;
P2|=0XC0; // P2=P2|0XC0; XXXX XXXX | 1100 0000 = 11XX XXXX
P2&=0XDF; // P2=P2&0XDF; 11XX XXXX & 1101 1111 = 110X XXXX
P2&=0X1F; //关闭所有的74HC573锁存器
P0=tab[DigBuf[DigCom]];
P2|=0XE0; // P2=P2|0XE0; XXXX XXXX | 1110 0000 = 111X XXXX
P2&=0XFF; // P2=P2&0XDF; 11XX XXXX & 1101 1111 = 110X XXXX
P2&=0X1F; //关闭所有的74HC573锁存器
P0=(0X01<<DigCom); //然后选中第一个数码管
P2|=0XC0; // P2=P2|0XC0; XXXX XXXX | 1100 0000 = 11XX XXXX
P2&=0XDF; // P2=P2&0XDF; 11XX XXXX & 1101 1111 = 110X XXXX
P2&=0X1F; //关闭所有的74HC573锁存器
if(++DigCom == 8)DigCom = 0 ;
if(++Temp_tt==1000){Temp_tt=0;Temp_Ref=1;}
// XXX_tt++;
// if(++XXX_tt==NNN){XXX_tt=0;XXX_Ref=1;}
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初始值
TH0 = 0xD4; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void ALL_Init(void)
{
P0 =0X00; //先设置关闭蜂鸣器继电器的P0输出值(全关)
P2|=0XA0; // 将P27 P25 设置为1 其他位保持不变
P2&=0XBF; // 将P26设置为0 其他位保持不变
P2&=0X1F; //关闭所有的74HC573锁存器
P0 =0XFF; //先设置关闭所有的LED的P0输出值(全关)
P2|=0X80; // 将P27设置为1 其他位保持不变
P2&=0X9F; // 将P26 P25设置为0 其他位保持不变
P2&=0X1F; //关闭所有的74HC573锁存器
P0 =0X00; //先设置选择数码管位选的P0输出值(全不选)
P2|=0XC0; // 将P27 P26 设置为1 其他位保持不变
P2&=0XDF; // 将P26设置为0 其他位保持不变
P2&=0X1F; //关闭所有的74HC573锁存器
}
void Delay_MS(unsigned int MS)
{
unsigned i,j;
for(i=0;i<MS;i++)
for(j=853;j>0;j--); //STC15单片机设置为853; STC8H单片机修改为1109;STC32G单片机修改为427;
}
2.onewire.c
#include "reg52.h"
sbit DQ = P1^4; //单总线接口
//单总线延时函数
void Delay_OneWire(unsigned int t) //STC89C52RC
{
while(t--);
}
//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(50);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(50);
}
//从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(50);
}
return dat;
}
//DS18B20设备初始化
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(120);
DQ = 0;
Delay_OneWire(800);
DQ = 1;
Delay_OneWire(100);
initflag = DQ;
Delay_OneWire(50);
return initflag;
}
unsigned long Temp_get(void)
{
unsigned char low,high;
unsigned int Temp;
init_ds18b20();//启动总线
Write_DS18B20(0XCC);//发送跳过ROM指令
Write_DS18B20(0X44);//发送启动温度转换指令
Delay_OneWire(200);//延迟
init_ds18b20();//启动总线
Write_DS18B20(0XCC);//发送跳过ROM指令
Write_DS18B20(0XBE); //发送读暂存器指令
low=Read_DS18B20(); //读暂存器的低8位
high=Read_DS18B20(); //读暂存器的高8位
Temp=high&0X0F; // SSSS XXXX 高4位清零(符号位)
Temp <<= 8; // Temp =Temp << 8; 高8位向左移8位
Temp |= low; // Temp =Temp | low; 存储低8位
return Temp;
}
3.ONEWIRE.H
#ifndef __ONEWIRE_H
#define __ONEWIRE_H
unsigned long Temp_get(void);
#endif