78 lines
1.4 KiB
C
78 lines
1.4 KiB
C
/* # 单总线代码片段说明
|
|
1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
|
|
2.
|
|
参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
|
|
中对单片机时钟频率的要求,进行代码调试和修改。
|
|
*/
|
|
#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;
|
|
}
|
|
|
|
float rd_temperature() {
|
|
unsigned char low, high;
|
|
init_ds18b20();
|
|
Write_DS18B20(0xcc);
|
|
Write_DS18B20(0x44);
|
|
|
|
Delay_OneWire(200);
|
|
|
|
init_ds18b20();
|
|
Write_DS18B20(0xcc);
|
|
Write_DS18B20(0xbe);
|
|
low = Read_DS18B20();
|
|
high = Read_DS18B20();
|
|
return (float)(high << 8 | low) * 0.0625;
|
|
}
|