前言
比赛时会提供驱动文件,包含初始化总线函数,写入函数,读取函数。对于读取温度数据和数据转换就是我们要写的部分。
程序
onewire.c
#include <onewire.h>
sbit DQ = P1^4; //引脚定义 /* 需要自己补充的部分 */
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;
}
/* 需要自己补充的部分 */
int onewire_dat=0;//存储计算后温度的变量
/* 温度为整数格式 */
void Read_Int(void)
{
unsigned char low,high,temp;
init_ds18b20();//初始化总线
Write_DS18B20(0xcc);//跳过寻址
Write_DS18B20(0x44);//温度转换指令
Delay_OneWire(200);//延时等待
init_ds18b20();//初始化总线
Write_DS18B20(0xcc);//跳过寻址
Write_DS18B20(0xbe);//读取温度指令
Delay_OneWire(200);//延时等待
low = Read_DS18B20();//读取低字节
high =Read_DS18B20();//读取高字节
//直接转换,舍弃小数部分
temp= high<<4;
temp|=low>>4; //16进制变10进制
onewire_dat = temp;
}
/* 温度为带一位小数格式 */
void Read_float1(void)
{
unsigned char low,high;
int temp;
init_ds18b20();//初始化总线
Write_DS18B20(0xcc);//跳过寻址
Write_DS18B20(0x44);//温度转换指令
Delay_OneWire(200);//延时等待
init_ds18b20();//初始化总线
Write_DS18B20(0xcc);//跳过寻址
Write_DS18B20(0xbe);//读取温度指令
Delay_OneWire(200);//延时等待
low = Read_DS18B20();//读取低字节
high =Read_DS18B20();//读取高字节
//0.0625 -> 0.625 放大了10倍,比如是 23.5 -> 235
temp =((high<<8)|low)*0.625;
onewire_dat = temp;
}
/* 温度为带两位小数格式 */
void Read_float2(void)
{
unsigned char low,high;
int temp;
init_ds18b20();//初始化总线
Write_DS18B20(0xcc);//跳过寻址
Write_DS18B20(0x44);//温度转换指令
Delay_OneWire(200);//延时等待
init_ds18b20();//初始化总线
Write_DS18B20(0xcc);//跳过寻址
Write_DS18B20(0xbe);//读取温度指令
Delay_OneWire(200);//延时等待
low = Read_DS18B20();//读取低字节
high =Read_DS18B20();//读取高字节
//0.0625 -> 6.25 放大了100倍,比如是 23.58 -> 2358
temp =((high<<8) |low)*6.25;
onewire_dat = temp;
}
/* 数码管显示的温度为整数格式 */
void Read_Int_smg(void)
{
smg_SetOne(1,onewire_dat/10);
smg_SetOne(2,onewire_dat%10);
}
/* 数码管显示的温度为带一位小数格式 */
void Read_float1_smg(void)
{
smg_SetOne(1,onewire_dat/100);
smg_SetOne(2,onewire_dat%100/10 + 10);
smg_SetOne(3,onewire_dat%10);
}
/* 数码管显示的温度为带两位小数格式 */
void Read_float2_smg(void)
{
smg_SetOne(1,onewire_dat/1000);
smg_SetOne(2,onewire_dat%1000/100 + 10);
smg_SetOne(3,onewire_dat%100/10);
smg_SetOne(4,onewire_dat%10);
}
onewire.h
#ifndef __ONEWIRE_H
#define __ONEWIRE_H
#include <STC15F2K60S2.H>
#include <hc138_hs.H>
void Read_Int(void);
void Read_float1(void);
void Read_float2(void);
void Read_Int_smg(void);
void Read_float1_smg(void);
void Read_float2_smg(void);
#endif
main.c
#include <hc138_hs.H>
#include <onewire.h>
/* 应用 */
void main(void)
{
while(1)
{
//读取显示温度为整数格式
Read_Int();//读取
Read_Int_smg();//显示
// //读取显示温度为带两位小数格式
// Read_float1();
// Read_float1_smg();
// //读取显示温度为带两位小数格式
// Read_float2();
// Read_float2_smg();
}
}