链接:https://pan.baidu.com/s/1mwgnxuXqjq4zym7ewrCTHw
提取码:yvrv
#include "reg52.h"
#include "onewire.h"
sbit DQ = P1^4; //单总线接口
//单总线延时函数
void Delay_OneWire(unsigned int t) //STC89C52RC
{
t *= 12;
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(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;
}
float fRead_Temperature(void)
{
unsigned char low,high;
init_ds18b20();
Write_DS18B20(0xcc); //跳过读取ROM
Write_DS18B20(0x44); //启动温度转换
//不加上Delay延时,等待温度转换完成,直接去读取暂存器
init_ds18b20();
Write_DS18B20(0xcc); //跳过读取ROM
Write_DS18B20(0xbe); //获取暂存器数据
low = Read_DS18B20(); //温度低8位数据
high = Read_DS18B20(); //温度高8位数据
return ((high<<8)|low)/16.0;
}
#include <stc15f2k60s2.h>
#include "Uart.h"
#include "onewire.h"
unsigned char Uart_Slow_Down;//串口减速函数
unsigned char Uart_Recv[10];//串口接收数据存储数组
unsigned char Uart_Recv_Index;//串口接收数组指针
unsigned char Uart_Send[10];//串口发送数组
unsigned char CNCHAR[6] = "摄氏度";
void DelayMs(unsigned int x) //0.14ms误差 0us
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++)
{}
}
}
void Data_Send(float Temperature)
{
unsigned char datas[6] = {0, 0, 0, 0, 0, 0}; //定义数组
int i;
unsigned int temp;
if(Temperature>0)
{
temp= (unsigned int)(Temperature*100+0.5);
datas[0] = temp / 10000;
datas[1] = temp % 10000 / 1000;
datas[2] = temp % 1000 / 100;
datas[3] = temp % 100 / 10;
datas[4] = temp % 10;
SBUF = '+';
while (!TI); //等待发送数据完成
TI = 0;
for(i=0;i<5;i++)
{
SBUF = '0' + datas[i];
while (!TI);
TI = 0;
}
// 发送小数点
SBUF = '.';
while (!TI);
TI = 0;
// 发送小数部分
SBUF = '0' + datas[5];
while (!TI);
TI = 0;
for(i=0; i<sizeof(CNCHAR)&& CNCHAR[i] != '\0'; i++)
{
SBUF = CNCHAR[i];//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
}
SBUF='+';
while(!TI);//等待发送数据完成
TI=0;
}
}
void main()
{
UartInit(); //初始化串口
//Uart_SendString(""); //接收字符串
while(1)
{
Data_Send(fRead_Temperature());
DelayMs(1000);//1s钟刷一次
}
}
void Uart_ISR(void) interrupt 4 //串口接收中断函数
{
if(RI==1)//接收数据
{
Uart_Recv[Uart_Recv_Index] = SBUF;
Uart_Recv_Index++;
RI=0;
}
}
#include "Uart.h"
#include <stc15f2k60s2.h>
//串口初始化
void UartInit(void) //9600bps@12.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xC7; //设定定时初值
TH1 = 0xFE; //设定定时初值
ET1 = 0; //禁止定时器1中断
ES = 1;
EA = 1;
TR1 = 1; //启动定时器1
}
//字节发送函数
void Uart_SendByte(unsigned char byte) //串口发送单个字节函数
{
SBUF=byte;
while(TI==0);//等待数据发送
TI=0;//将发送标志位清零
}
void Uart_SendString(char *str) //串口发送字符串函数
{
while(*str!='\0') //判断字符串截止位则退出
{
Uart_SendByte(*str++);
}
}